当前位置: 首页 > 知识库问答 >
问题:

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

闾丘成双
2023-03-14

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

    import javafx.application.Application;
    import javafx.geometry.Point2D;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.control.ScrollPane;
    import javafx.scene.control.TextField;
    import javafx.scene.input.KeyEvent;
    import javafx.scene.layout.StackPane;
    import javafx.scene.layout.VBox;
    import javafx.stage.Popup;
    import javafx.stage.Stage;

    public class PopupApp extends Application {

        public static void main(String[] args) {
            launch(args);
        }

        @Override
        public void start(Stage stage) throws Exception {
            TextField textField = new TextField();
            StackPane stackPane = new StackPane(textField);

            stage.setScene(new Scene(stackPane));
            stage.show();

            ScrollPane scrollPane = new ScrollPane(new VBox(new Button("Option1"), new Button("Option2")));
            Popup popup = new Popup();
            popup.getContent().add(scrollPane);

            Point2D pinPoint = textField.localToScreen(0., textField.getHeight());
            popup.show(textField, pinPoint.getX(), pinPoint.getY());

            textField.addEventHandler(KeyEvent.KEY_RELEASED, event -> {
                System.out.println("KEY_RELEASED " + event);
            });

            textField.addEventHandler(KeyEvent.KEY_PRESSED, event -> {
                System.out.println("KEY_PRESSED " + event);
            });
        }
    }

共有1个答案

姚飞昂
2023-03-14

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

您正面临这个问题,因为Events被重定向到Popup。如果在分派时消耗这些事件,则这些事件的效果不会显示在text Field中。在您的情况下,这是由于存在Popup上的Button。(最有可能是由于存在可以接收焦点的节点。虽然不确定)。要解决这个问题,您可以设置自己的EventDispatcher。类似于popup.show()之前的内容:

 popup.setEventDispatcher((event, tail) -> {
        if (event.getEventType() != RedirectedEvent.REDIRECTED) {
            tail.dispatchEvent(event);
        }
        return null;
    });

所有重定向到Popup中的事件现在都将被丢弃,并且不会发生进一步的调度。您可以调整它以满足您的要求。

 类似资料:
  • 请看下面的脸书评论模态框。我试图实现一个类似的效果,即用户点击一个按钮,然后它会打开一个弹出/模态框。此框将允许在新框中滚动(因为它可能是许多页的文本),但不允许在主页上的模态之外滚动。当模态允许在模态窗口内滚动而不允许在其他地方滚动时,如何实现类似的效果?谢谢。

  • 我正在做一个项目,其中有两个选项卡。在first Tab的用户界面上有一个文本字段和一个按钮。在文本字段中,用户可以写到100之前的任何数字,当他按下按钮Next时,我的应用程序将转到下一个选项卡,在该选项卡上有一个带有三列a、B和C的Gridpane。 所以我想要的是用户将在第一个选项卡的文本字段中输入的任何数字,根据该数字,它应该在第二个选项卡的GridPane中添加相同数量的Textfiel

  • 我有一个标签活动。它包含一个包含片段项的listView。我有一个按钮在这些列表项(这是片段),我想当我单击它显示一个弹出窗口。不幸的是,我能看到弹出窗口,我想这是因为列表项的显示太小了。我实际上想在包含列表的活动中看到它。 有什么想法吗? RowinHomeMab是listView中的一个项,它放置在TabActivity中。

  • 我正在JavaFX 2.0中制作一个应用程序。从我的主窗口开始一个带有一些设置的新窗口。调整完设置后,我想按一个像“保存更改”这样的按钮。 我想用这个按钮保存更改并关闭窗口。我所说的关闭意味着杀死它,而不是把它放在背景中或设置可见性。我读过关于方法阶段的书。关闭() http://docs.oracle.com/javafx/2.0/api/javafx/stage/Stage.html 正如您所

  • 主窗口是由一个工具栏、几个窗格和图表画布所组成,让你设计模型。在主窗口中,每一个模型是由一个选项卡来表示。一个模型文件可以有多个图表。你可以在列表中选择图表。若要创建一个新图表,从菜单栏选择“图表”->“新建图表”。 【提示】Navicat Data Modeler 增加了对系统深色模式的支持。 工具栏 工具栏位于主窗口的顶部。工具栏显示的按钮是根据模型类型(物理、逻辑和概念)。你可以使用工具栏来

  • 主窗口是由一个工具栏、几个窗格和图表画布所组成,让你设计模型。一个模型文件可以有多个图表。在模型中,每一个图表是由一个选项卡来表示。若要创建一个新图表,从菜单栏选择“文件”->“新建图表”。 工具栏 工具栏位于主窗口的顶部。工具栏显示的按钮是根据模型类型(物理、逻辑和概念)。你可以使用工具栏来做一些基本的工作,例如:添加表、实体或视图,应用自动布局等。 浏览器窗格 浏览器窗格有两个选项卡:“模型”