java - 在 javafx 中显示工具提示将其舞台置于前台

标签 java javafx

我正在尝试解决 jdk 中的这个错误:http://bugs.java.com/bugdatabase/view_bug.do?bug_id=8088624

public class Blubb extends Application {
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        Button btn = new Button("Click");
        btn.setTooltip(new Tooltip("Blubb"));

        Scene scene = new Scene(new BorderPane(btn), 320, 240);
        primaryStage.setScene(scene);
        primaryStage.show();

        Stage secondStage = new Stage();
        secondStage.setScene(new Scene(new BorderPane(new Button("Click")), 320, 240));
        //secondStage.initOwner(primaryStage);
        secondStage.show();
    }
}

如果初级阶段的按钮悬停,它会出现在第二阶段的前面。我发现在舞台上调用 initOwner() 会消除这种行为。

现在我的问题如下:我有多个具有共同所有者(初级阶段)的“弹出窗口”。在 initOwner() 解决方法之后,将鼠标悬停在主要阶段的控件上不会导致任何意外行为。但是,如果您将鼠标悬停在弹出窗口中的控件上,而另一个弹出窗口处于焦点状态,则悬停的弹出窗口将抢走焦点。

有没有办法解决这个错误,不仅适用于初级阶段,也适用于弹出窗口?

更新:事实证明我的解决方法有不良副作用。 Stage 状态的 Javadocs 如下:

A stage will always be on top of its parent window.

此外,还有什么解决方法可以使弹出窗口不“始终位于顶部”并且可以最小化?

最佳答案

有一种方法可以通过叠加 StackPanes 来解决这个问题。使用 StackPane 创建您的 Scene,以便您可以在舞台失去焦点时添加另一个 StackPane。覆盖的 Pane 将阻止 Tooltip 或在 Pane 未处于焦点时鼠标悬停时发生的任何其他事情。您还可以最小化您的任何阶段,它们不会总是在最前面。

public class Blubb extends Application {

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

    @Override
    public void start(Stage primaryStage) throws Exception {
        Button button_1 = new Button("Button #1");
        button_1.setTooltip(new Tooltip("Blubb #1"));

        StackPane primary = new StackPane(new BorderPane(button_1));
        primaryStage.setScene(new Scene(primary, 320, 240));
        addStageFocusListener(primaryStage, primary);
        primaryStage.show();

        Button button_2 = new Button("Button #2");
        button_2.setTooltip(new Tooltip("Blubb #2"));

        StackPane second = new StackPane(new BorderPane(button_2));
        Stage secondStage = new Stage();
        addStageFocusListener(secondStage, second);
        secondStage.setScene(new Scene(second, 320, 240));
        secondStage.show();
    }

    public void addStageFocusListener(Stage stage, StackPane stackPane) {
        stage.focusedProperty().addListener(new ChangeListener<Boolean>(){
            public final StackPane preventTooltip = new StackPane();
            public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
                if(stage.isFocused()) {
                    if(stackPane.getChildren().contains(preventTooltip)) {
                        stackPane.getChildren().remove(preventTooltip);
                    }
                } else {
                    stackPane.getChildren().add(preventTooltip);
                }
            }
        });
    }
}

关于java - 在 javafx 中显示工具提示将其舞台置于前台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42416738/

相关文章:

css - 如何在 JavaFX CSS 中创建自定义边框样式?

java - 从另一个 Controller 类设置 boderpane 中心

JavaFX:从 tableview 中删除空行

java - 这在 Java 中怎么可能? (在安卓程序中)

java - BufferedReader 就绪方法

java - 我可以在使用 Spring Security 进行身份验证时获取请求参数吗?

java - 加速顺序java迭代器可能吗?

java - Android,从第三个 Activity 中获取结果

printing - 打印 JavaFx TableView 的内容

java - Jackson/Gson 将 JavaFX Properties 序列化和反序列化为 json