JavaFX的HMTLEditor不上“回归”键反应(JavaFX HMTLEditor doesn

2019-09-18 20:17发布

我试图做一些实验使用JavaFX” HTMLEditor组件。 我用下面的代码(摘录):

    fxPanel=new JFXPanel();
    Platform.runLater(new Runnable() {
        @Override
        public void run() {
            Group group = new Group();
            scene = new Scene(group);               
            fxPanel.setScene(scene);
            view = VBoxBuilder.create().build();

            group.getChildren().add(view);


            edit = HTMLEditorBuilder.create().build();
           // toolPane = TabPaneBuilder.create().minHeight(60d).build();
            //toolPane.getTabs().add(new Tab("Allgemein"));

            view.getChildren().add(edit);

        }
    });

    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            jPanel1.add(fxPanel);
        }
    });

它工作正常,到目前为止,有一个重要的例外 - 我不能使用返回键的BR - 它似乎只是被忽略。 有这个键的反应都没有。 至于我可以看到,如预期的任何其他重点工作。

Answer 1:

我注意到CTRL - 机电工程进入地方没有。 所以我就在这个工作通过把一个KeyListener上JFXPanel,改变KeyChar从10到13和重新发布该事件的系统事件队列。 中号虽然-如预期以后如果HTML编辑开始响应进入CTRL这可能会停止工作。

fxPanel.addKeyListener(new KeyListener() {

    public void keyTyped(KeyEvent e) {
        if (e.getKeyChar() == 10) {
            e.setKeyChar((char) 13);
            Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(e);
        }
    }

    public void keyPressed(KeyEvent e) {}

    public void keyReleased(KeyEvent e) {}
});

任何人有一个更好的主意,现在?

编辑 :我发现了另一种方式来获得所期望的效果是安装自定义KeyEventDispatcher上像这样当前键盘焦点管理器:

KeyboardFocusManager kfm = DefaultKeyboardFocusManager.getCurrentKeyboardFocusManager();
kfm.addKeyEventDispatcher(new KeyEventDispatcher() {
    @Override
    public boolean dispatchKeyEvent(KeyEvent e) {
        if (DefaultKeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner() == jfxPanel) {
            if (e.getID() == KeyEvent.KEY_TYPED && e.getKeyChar() == 10) {
                e.setKeyChar((char) 13);
            }
        }
        return false;
    }
});

这有改变原有的优势KeyEvent ,而不是事后发布一个新的,因此,如果HTMLEditor都开始响应进入我们不会翻倍事件。



Answer 2:

我发现它在JavaFX的一个已知的bug。

https://javafx-jira.kenai.com/browse/RT-33354

http://javafx-jira.kenai.com/browse/RT-20887

但仅供参考,它被称为“不会解决”为JavaFX 2.2解决。 有一个在JavaFX的8没有问题。



Answer 3:

我仍然认为这个问题与Oracle JDK 10偷看入HTMLEditorSkin ,有Command.INSERT_NEW_LINE ,但是当按下“确认”键它不被执行。 在原则上,用于执行API Command ,并且可以从这些关键事件过滤器被调用,但是API是私有的。

以下是解决此限制黑客攻击。 它“作品”,但它是当然可能使用JavaFX的未来的更新打破了黑客:

HTMLEditor editor = /* .. somehow get the HTMLEditor .. */
editor.addEventFilter(KeyEvent.KEY_PRESSED, event ->
{
    if (event.getCode() == KeyCode.ENTER)
    {
        event.consume();
        final HTMLEditorSkin skin = (HTMLEditorSkin) htmlEditor.getSkin();
        try
        {
            // Use reflection to invoke the private method
            // executeCommand(Command.INSERT_NEW_LINE.getCommand(), null);
            final Method method = skin.getClass().getDeclaredMethod("executeCommand", String.class, String.class);
            method.setAccessible(true);
            method.invoke(skin, Command.INSERT_NEW_LINE.getCommand(), null);
        }
        catch (Throwable ex)
        {
            throw new RuntimeException("Cannot hack around ENTER", ex);
        }
    }
});


文章来源: JavaFX HMTLEditor doesn't react on 'return' key
标签: java javafx-2