我正在尝试在javafx中的全屏主要舞台上弹出一个对话框。当我创建弹出窗口时,它意外地隐藏在我的全屏主要舞台后面,直到舞台从全屏模式中移除(通过 ESC )。如果我使我的主要舞台最大化和未修饰而不是全屏,那么我的弹出窗口将按预期显示在主舞台的顶部。
我是否遗漏了全屏模式与最大化和未修饰模式的不同之处?我不正确地使用全屏模式吗?
我在CentOS 6.5上使用Java版本1.8.0_20与Gnome。
这是我的SSCCE:
import javafx.application.*;
import javafx.scene.*;
import javafx.scene.control.*;
import javafx.stage.*;
public class TestApplication extends Application {
private Stage primaryStage;
public static void main(String[] arguments) {
launch(arguments);
}
public void start(Stage stage) {
this.primaryStage = stage;
// Create a fullscreen primary stage.
primaryStage.setTitle("Main Stage");
primaryStage.setScene(new Scene(createRoot()));
primaryStage.setFullScreen(true);
primaryStage.show();
}
private Parent createRoot() {
Button button = new Button("Show popup");
button.setOnAction((event) -> showPopup());
return button;
}
private void showPopup() {
// Create a popup that should be on top of the primary stage.
Stage popupStage = new Stage();
popupStage.setScene(new Scene(createPopupRoot()));
popupStage.setTitle("Popup Stage");
popupStage.initModality(Modality.WINDOW_MODAL);
popupStage.initOwner(primaryStage);
popupStage.show();
}
private Parent createPopupRoot() {
return new Label("This is a popup!");
}
}
答案 0 :(得分:2)
假设您使用的是Mac,这是一个known issue,固定在8u40。您可能需要使用ea版本直到完整版本。
这个错误的基本历史是JavaFX实现了自己的全屏实现,以便支持10.7之前的OS X版本(它没有本机全屏模式)。该实现使用"独占模式",这可以防止其他窗口显示。这可能会变得非常糟糕:例如ComboBox
无法工作......使用本机模式在8u40中解决了该问题(因为不再支持10.7之前的OS X版本)。 / p>
请注意,如果您没有以编程方式设置全屏模式,并允许用户使用窗口标题栏上的Mac OS按钮进入全屏模式,则不会出现此问题。
答案 1 :(得分:2)
在使用java版本' 1.8.0_40'重复此问题后,我终于找到了解决此问题的方法!
popupStage.initStyle(StageStyle.UTILITY);
Stage.initStyle(StageStyle) -- JavaFX 8
即使在弹出窗口外单击,弹出窗口的样式StageStyle.UTILITY
似乎也会将弹出窗口保持在全屏窗口的前面。
我在java 1.8.0_40中使用新的Alert
类时看到了同样的问题,并且将样式设置为StageStyle.UTILITY
也修复了它(Dialog.initStyle(StageStyle) -- JavaFX 8)。
我不知道为什么会这样。
旁注:
删除对popupStage.initOwner(...)
的调用似乎允许弹出窗口显示在全屏应用程序上方,但在弹出窗口外单击会导致弹出窗口消失。