如何使非模态舞台始终出现在JavaFx全屏舞台之上

问题描述 投票:0回答:3

我有

  • 用户可以将其配置为全屏模式的主要阶段
  • 用户可以打开的辅助阶段(工具窗口)。这些窗口应始终位于主舞台的顶部(无论是否处于全屏模式)。

后者不起作用,即使我将

setAlwaysOnTop(true)
用于辅助阶段,一旦用户单击主阶段,它们就会消失在主阶段后面。 仅当主舞台处于全屏模式时才会发生这种情况,如果主舞台不处于全屏模式,则一切正常。 如何在全屏舞台前启用工具窗口的概念?示例代码:

public class Test extends Application {
    @Override
    public void start(Stage stage) {
        VBox vbox = new VBox();
        Scene scene = new Scene(vbox);
        stage.setScene(scene);

        Button button1 = new Button("New Tool Window");
        button1.setOnAction((e) -> {
            Stage toolStage = new Stage();
            Scene toolScene = new Scene(new Label("Am I on top?"), 300, 250);
            toolStage.setScene(toolScene);
            toolStage.initOwner(stage);
            toolStage.setAlwaysOnTop(true);
            toolStage.show();
        });

        Button button2 = new Button("Close");
        button2.setOnAction((e) -> System.exit(0));

        vbox.getChildren().addAll(button1, button2);
        stage.show();
        stage.setFullScreen(true);
    }

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

2016 年 8 月 20 日更新: 确认为错误:JDK-8164210

javafx window fullscreen
3个回答
0
投票

绕过此限制的方法是: 停用全屏模式 创建伪全屏的组合键 设置舞台风格未装饰且不可调整大小 将屏幕设置为用户屏幕的大小并将其定位在 0,0 处。

很容易创建自己的边框来最小化和关闭程序,如下所示:

JavaFX Stage.setMaximized 仅在 Mac OSX (10.9.5) 上运行一次

这里:

JavaFX 8 任务栏图标监听器


0
投票

设置 initowner 后需要设置 initmodality

toolStage.initOwner(stage);
toolStage.initModality(Modality.APPLICATION_MODAL);

0
投票

我最近创建了一个图片检查器来在任务栏顶部显示应用程序。但它可能会导致

javafx.scene.robot.Robot
的安全问题,因为快照可能不被允许。

import javafx.application.Application;
import javafx.application.Platform;
import javafx.geometry.Rectangle2D;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.scene.image.WritableImage;
import javafx.scene.robot.Robot;
import javafx.stage.Screen;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

import java.util.Timer;
import java.util.TimerTask;

public class Main extends Application {

    private Timer timer;

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

    @Override
    public void start(Stage primaryStage) throws Exception {
        BorderPane root = new BorderPane();
        root.setWidth(200);
        root.setHeight(45);
        primaryStage.initStyle(StageStyle.UNDECORATED);
        primaryStage.setScene(new Scene(root));
        primaryStage.setAlwaysOnTop(true);
        primaryStage.setX(Screen.getPrimary().getVisualBounds().getMaxX() - 500);
        primaryStage.setY(Screen.getPrimary().getVisualBounds().getMaxY());
        primaryStage.show();

        timer = new Timer();
        timer.scheduleAtFixedRate(new TimerTask() {

            final Robot robot = new Robot();

            @Override
            public void run() {
                Platform.runLater(this::runFX);
            }

            private void runFX() {
                final int width = (int) Math.round(primaryStage.getWidth());
                final int height = (int) Math.round(primaryStage.getHeight());

                WritableImage image = robot.getScreenCapture(new WritableImage(width, height),
                        new Rectangle2D(
                        primaryStage.getX(), primaryStage.getY(),
                        width, height
                ));

                WritableImage inner = primaryStage.getScene().snapshot(new WritableImage(
                        width,
                        height
                ));

                for (int x = 0; x < width; x++) {
                    for (int y = 0; y < height; y++) {
                        if (image.getPixelReader().getArgb(x, y) != inner.getPixelReader().getArgb(x, y)){
                            primaryStage.setAlwaysOnTop(false);
                            primaryStage.setAlwaysOnTop(true);
                            return;
                        }
                    }
                }
            }
        }, 0, 500);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.