JavaFX-HMTLEditor不';t对'作出反应;返回';钥匙
我试图用JavaFX'JavaFX-HMTLEditor不';t对'作出反应;返回';钥匙,java,javafx-2,Java,Javafx 2,我试图用JavaFX'HTMLEditor组件做一些实验。我使用了以下代码(摘录): 到目前为止,它运行良好,但有一个重要的例外——我不能将返回键用于BR——它似乎只是被忽略了。这把钥匙根本没有反应。据我所知,任何其他键都能正常工作。我发现这是JavaFX中已知的错误 和 但仅供参考,JavaFX2.2解决了“无法修复”的问题。JavaFX8中没有问题。我注意到CTRL-M在Enter不起作用的地方起作用。因此,我只是在JFXPanel上放置了一个KeyListener,将KeyChar从1
HTMLEditor
组件做一些实验。我使用了以下代码(摘录):
到目前为止,它运行良好,但有一个重要的例外——我不能将返回键用于BR——它似乎只是被忽略了。这把钥匙根本没有反应。据我所知,任何其他键都能正常工作。我发现这是JavaFX中已知的错误
和
但仅供参考,JavaFX2.2解决了“无法修复”的问题。JavaFX8中没有问题。我注意到CTRL-M在Enter不起作用的地方起作用。因此,我只是在JFXPanel上放置了一个
KeyListener
,将KeyChar
从10更改为13,并将事件重新发布到系统事件队列中。如果HTMLEditor开始响应ENTER和CTRL-M,这可能会在以后停止工作
现在有人有更好的主意吗
编辑:我发现获得所需效果的另一种方法是在当前键盘焦点管理器上安装自定义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
开始响应Enter事件,我们就不会加倍了。我仍然看到Oracle JDK 10存在这个问题。查看HTMLEditorSkin
,有一个命令。插入新行
,但按“回车”键时不执行该命令。
原则上,有用于执行命令的API,可以从密钥事件筛选器调用该API,但该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);
}
}
});
您可以通过过滤事件并向webview触发事件来生成换行符
// 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));
}
});
当然SHIFT
-Enter
现在插入
和一个新段落。。。不过,这比完全不能使用Enter
要好得多:)
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);
}
}
});
// 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));
}
});