Javafx 带有滚动窗格的弹出窗口使主阶段文本字段对左、右、主、结束等关键事件无响应

Javafx 带有滚动窗格的弹出窗口使主阶段文本字段对左、右、主、结束等关键事件无响应,javafx,javafx-8,javafx-2,Javafx,Javafx 8,Javafx 2,我想为主舞台文本字段创建一个弹出窗口。弹出窗口包含滚动窗格,其中包含作为按钮的可能选项。 弹出显示后,文本字段键事件如left、rigth、home、end无效。在TextField上接收关键事件。 对于这个问题是否有合理的解决方案或解决方法。 若要复制,请键入一些文本并尝试按左箭头 导入javafx.application.application; 导入javafx.geometry.Point2D; 导入javafx.scene.scene; 导入javafx.scene.control.B

我想为主舞台文本字段创建一个弹出窗口。弹出窗口包含滚动窗格,其中包含作为按钮的可能选项。 弹出显示后,文本字段键事件如left、rigth、home、end无效。在TextField上接收关键事件。 对于这个问题是否有合理的解决方案或解决方法。 若要复制,请键入一些文本并尝试按左箭头

导入javafx.application.application;
导入javafx.geometry.Point2D;
导入javafx.scene.scene;
导入javafx.scene.control.Button;
导入javafx.scene.control.ScrollPane;
导入javafx.scene.control.TextField;
导入javafx.scene.input.KeyEvent;
导入javafx.scene.layout.StackPane;
导入javafx.scene.layout.VBox;
导入javafx.stage.Popup;
导入javafx.stage.stage;
公共类PopupApp扩展了应用程序{
公共静态void main(字符串[]args){
发射(args);
}
@凌驾
public void start(Stage)引发异常{
TextField TextField=新的TextField();
StackPane StackPane=新的StackPane(文本字段);
舞台场景(新场景(stackPane));
stage.show();
ScrollPane ScrollPane=新滚动窗格(新VBox(新按钮(“选项1”)、新按钮(“选项2”));
Popup Popup=新的Popup();
popup.getContent().add(滚动窗格);
Point2D pinPoint=textField.localToScreen(0.,textField.getHeight());
show(textField,pinPoint.getX(),pinPoint.getY());
textField.addEventHandler(KeyEvent.KEY_已发布,事件->{
System.out.println(“按键释放”+事件);
});
textField.addEventHandler(按下KeyEvent.KEY),事件->{
System.out.println(“按下键”+事件);
});
}
}

实际上,当按下
左、右、…
等键时,您的
文本字段
不会收到按下的
键事件。这由程序的输出显示

您正面临此问题,因为
事件
被重定向到
弹出窗口
。如果在分派时使用这些事件,则
textField
不会显示这些事件的影响。在您的情况下,这是由于出现了
弹出窗口上的
按钮
。(很可能是因为存在可以接收焦点的节点。但不确定)。要解决此问题,您可以设置自己的
EventDispatcher
。在弹出.show()之前类似这样的内容


所有重定向到弹出窗口中的事件现在将被丢弃,并且不会发生进一步的调度。您可以根据自己的需要对此进行调整。

您只需使用controlsfx和AutoCompletionBinding:使用您的选项制作一个
列出您的列表
,并将它们绑定到您的文本字段
AutoCompletionBinding AutoCompletionBinding=TextFields.bindAutoCompletion(yourTextField,yourList)
Do在单击选项
autoCompletionBinding.setonautompled(e->{your code})后处理该操作在处理关键事件的节点上重新获取焦点可能会起到作用。@micpog90 TextFields.bindAutoCompletion()是ControlsFX库的一部分。即使我决定使用这个库,它也不能解决我的问题,因为我的弹出组件比简单的列表复杂得多。@Sedrick已经尝试过了。不想深入了解细节,但无法解决问题。可能存在一个相关问题:在这种情况下,对于可编辑的组合框,可以在下拉列表中调整listView的inputMap。。顺便说一句,我看到吃的左/右按下,即使没有滚动窗格,发生任何pane@kleopatra请在调用<代码>弹出窗口之前显示< <代码> EventDispatcher > /(代码)>好的,现在它正在工作-谢谢:你可以考虑把这个细节添加到你的答案中。(在显示之前不会期望弹出窗口的场景/窗口是可访问的)实际上,您的期望是正确的。在您的评论之后,我突然意识到弹出窗口不是一个
节点
。它是一个
窗口
弹出窗口。getScene().getWindow()
是多余的。我已经编辑了我的代码。
 popup.setEventDispatcher((event, tail) -> {
        if (event.getEventType() != RedirectedEvent.REDIRECTED) {
            tail.dispatchEvent(event);
        }
        return null;
    });