我正在尝试解决 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/