我试图做一些实验使用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 - 它似乎只是被忽略。 有这个键的反应都没有。 至于我可以看到,如预期的任何其他重点工作。
我注意到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
都开始响应进入我们不会翻倍事件。
我发现它在JavaFX的一个已知的bug。
https://javafx-jira.kenai.com/browse/RT-33354
和
http://javafx-jira.kenai.com/browse/RT-20887
但仅供参考,它被称为“不会解决”为JavaFX 2.2解决。 有一个在JavaFX的8没有问题。
我仍然认为这个问题与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);
}
}
});