JavaFX HMTLEditor对'return'键没有反应

时间:2012-06-29 22:16:17

标签: java javafx-2

我试图用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的返回键 - 它似乎只是被忽略了。这根钥匙根本没有反应。据我所见,任何其他键都按预期工作。

4 个答案:

答案 0 :(得分:9)

我注意到 CTRL - M 适用于 Enter 的情况。所以我只是通过在JFXPanel上放置KeyListener,将KeyChar从10更改为13并将事件重新发布到系统事件队列来解决这个问题。如果HTMLEditor开始响应 ENTER CTRL - M ,这可能会在以后停止工作。

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,这样如果{{1}}开始响应 Enter 事件我们就不会加倍。

答案 1 :(得分:4)

我发现它是JavaFX中已知的错误。

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

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

但仅供参考,它被解决为JavaFX 2.2的“无法修复”。 JavaFX 8中没有问题。

答案 2 :(得分:1)

我仍然在Oracle JDK 10中看到这个问题。窥视HTMLEditorSkin时,有一个Command.INSERT_NEW_LINE,但是按Enter键时不会执行。 原则上,有用于执行Command的API,可以从键事件过滤器中调用该API,但该API是私有的。

以下是有关此限制的技巧。 它“有效”,但是它当然是可以随着JavaFX的未来更新而中断的hack:

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);
        }
    }
});

答案 3 :(得分:0)

您可以通过过滤事件并向Web视图中触发<^ m>事件来生成换行符

        // fix enter ignored on linux
    HTMLEditor editor = ...
    WebView editorView = (WebView) editor.lookup(".web-view");
    editor.addEventFilter(KeyEvent.KEY_PRESSED, e -> {
        if (e.getCode() == KeyCode.ENTER) {
            e.consume();
            editorView.fireEvent(new KeyEvent(
                    e.getSource(),
                    editorView,
                    KeyEvent.KEY_TYPED,
                    "\r", "", KeyCode.ENTER,
                    false, true, false, false));
        }
    });