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

JavaFX-添加一个滚动窗格弹出窗口,当用户点击它时关闭

杨高翰
2023-03-14

我的标题措辞糟糕,因为我的问题很难描述,所以我为它画了一幅图:

我有一个ImageView对象,它代表一堆卡片(不是扑克牌,只是用它们作为示例)。单击此图像视图时,我需要弹出一个具有滚动窗格的窗口,并向他们显示链接列表中的所有卡片对象。当用户单击窗口之外的任何地方(稍后,单击任何鼠标右键)时,滚动窗格窗口需要关闭。

我已经尝试过的方法:

>

  • APPLICATION_MODAL场景。然后是Scene.show和等待()。我不喜欢这种方法,因为它在用户的任务栏上制作了另一个应用程序。它也感觉笨拙和糟糕。

    将我的根窗格更改为StackPane,然后当用户单击套牌时将此Scrollpane添加到堆栈窗格。出于某种原因,这真的很慢,而且看起来真的很突兀。这也很烦人,因为我的备用类需要访问根窗格(因为当它关闭时,它需要转到根StackPane并对其本身调用. ade())。

    有没有其他更好的方法来实现这一点?我的应用程序将有许多这样的堆,因此这个框架需要很好地工作。

  • 共有2个答案

    王宜
    2023-03-14

    您可以通过捕获鼠标事件的低级系统挂钩来实现这一点。

    http://kra.lc/blog/2016/02/java-global-system-hook/或https://github.com/kwhat/jnativehook/releases

    我希望这就是你需要的,否则我就把你的问题搞错了。

    濮丁雷
    2023-03-14

    我仍然建议打开一个带有一些限制的新舞台来解决您使用这种方法的问题。

    您可以使用阶段的initOwner属性将另一个阶段作为所有者,因此任务栏上不会出现其他图标。

    您可以将initStyle属性与透明或未装饰的StageStyle一起使用,这将确保只有内容可见。

    最后,您可以使用Focus usedProperty检查舞台是否失去焦点以关闭它。

    实例

    public class Main extends Application {
        @Override
        public void start(Stage primaryStage) {
            try {
                BorderPane root = new BorderPane();
                Scene scene = new Scene(root,400,400);
    
                Button b = new Button("Open deck");
                b.setOnAction(new EventHandler<ActionEvent>() {
    
                    @Override
                    public void handle(ActionEvent event) {
                        Stage popupStage = new Stage();
    
                        popupStage.initOwner(primaryStage);
                        popupStage.initStyle(StageStyle.UNDECORATED);
                        Scene sc = new Scene(new ScrollPane(), 300, 300);
                        popupStage.setScene(sc);
    
                        popupStage.focusedProperty().addListener(new ChangeListener<Boolean>() {
    
                            @Override
                            public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue,
                                    Boolean newValue) {
                                if(!newValue)
                                    popupStage.close();
    
                            }
                        });
    
                        popupStage.show();
    
                    }
                });
    
                root.setCenter(b);
    
    
                primaryStage.setScene(scene);
                primaryStage.show();
            } catch(Exception e) {
                e.printStackTrace();
            }
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    }
    

    当然,也可以不在新的舞台中打开它,而是在当前舞台中绘制一个ScrollPane,它与舞台的内容重叠,例如使用AnchorPane或Group作为根,但第一个解决方案的优点是您不绑定到main舞台的维度(弹出窗口可以具有您想要的任何大小)。

     类似资料:
    • 嗨,我有javafx应用程序,它只有一个stage.On标签键按下文本字段的事件,一个弹出窗口显示在应用程序的主要阶段 我不点击弹出窗口,也不选择弹出窗口中的任何内容。我会点击它后面的舞台。我希望popup被关闭,但在执行popup的focusedProperty侦听器之前,它给了我IllegalArgumentException。 如果popup位于不同的阶段(应用程序的主阶段除外),根据阶段f

    • 我一直在尝试制作一个包含可以选择和配置的字符串的滚动窗格。我一直在研究如何在滚动窗格中实现JList,但没有一种方法有效,这是因为指南一直在使用swing滚动窗格(

    • 我在我的项目中为10个产品创建了剑道网格。当我点击剑道网格中显示的productname时,我希望弹出包含产品详细信息的剑道窗口。 我已经查看了剑道网格的演示,但我不想编辑所选产品的详细信息,也不想使用示例和演示中所示的“详细信息”按钮的单独列。 我还查看了剑道ui的音乐商店演示,但我无法理解它的代码,因为它在jQuery中,我正在使用asp。net mvc与我的项目的razor语法 注意:我希望

    • 我有这段代码显示了一个按钮谁显示一个弹出窗口,我希望用户能够关闭弹出窗口点击它的外部时,它是打开的。

    • 所以我只是想知道是否有人知道在JavaFX 8中关闭弹出窗口的正确方法。例如,如果我的弹出窗口上有一个取消按钮,当按下取消按钮时,我应该使用什么方法来摆脱弹出窗口?我目前只是使用隐藏()方法。这让我有点害怕,因为我不确定弹出窗口是否在后台某处徘徊并且仍然需要关闭。但是,当我在这里查看java文档时,我没有看到任何关闭()方法,我也没有在我的IDE自动完成中看到关闭()方法。不过,我确实在文档中看到

    • 嗨,有人能帮我吗?我想在用户在页面中滚动后出现这个弹出窗口。这是我的代码 所以有人能帮助这个脚本修改,并使其像用户滚动页面时一样出现吗