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

标签 java user-interface javafx

我的标题写得不好,因为我的问题很难描述,所以我画了一张图:

enter image description here

我有一个 ImageView 对象,它表示一堆纸牌(不是扑克牌,只是用作示例)。单击此 ImageView 时,我需要一个弹出窗口,该窗口具有一个 ScrollPane 并向它们显示链接列表中的所有卡片对象。当用户单击窗口外的任意位置(以及随后单击鼠标右键)时,滚动 Pane 窗口需要关闭。

我已经尝试过的方法:

  • 带有 APPLICATION_MODAL 的场景。然后是 Scene.showAndWait()。我不喜欢这种方法,因为它在用户的任务栏上创建了另一个应用程序。它也让人觉得笨拙而且很糟糕。

  • 将我的根 Pane 更改为 StackPane,然后在用户单击面板时将此 Scrollpane 添加到堆栈 Pane 。由于某种原因,这真的很慢,而且看起来真的很突兀。这也很烦人,因为我的备用类需要访问根 Pane (因为当它关闭时,它需要转到根 StackPane 并自行调用 .remove())。

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

最佳答案

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

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

您可以使用 initStyle属性(property) TRANSPARENTUNDECORATED StageSTLye,这将确保只有内容可见。

最后你可以使用 focusedProperty检查 Stage 是否失去焦点以关闭它。

示例

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);
    }
}

当然也可以不在新的Stage中打开,而是在当前的Stage中画一个ScrollPane重叠 Stage 的内容,例如使用 AnchorPaneGroup作为 root,但第一个解决方案的优点是您不受限于主 Stage 的尺寸(弹出窗口可以具有您想要的任何大小)。

关于JavaFX - 添加一个 ScrollPane 弹出窗口,当用户点击它时关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37783330/

相关文章:

java - 从文本文件Javafx中顺序读取

java - 在带有oracle serverjre 8的docker中运行Java无法找到或加载主类

objective-c - 在 NSTextView 中填充——没有自定义绘图可能吗?

java - 在 SWT 浏览器中控制图像的来源

jquery - 如何画一个圆圈来表示在html中的选择

java - 实现 JFrame 时线程 "main"java.lang.NullPointerException 中出现异常

java - 在国际象棋游戏的 Gridpane 中交换节点

java - DatePicker setEditable 为 false 仍然允许点击日历

java - 什么是\ufeed?

java - 如何使用 ThreadLocal(特别是与 Servlet 一起使用)?