我有
后者不起作用,即使我将
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
绕过此限制的方法是: 停用全屏模式 创建伪全屏的组合键 设置舞台风格未装饰且不可调整大小 将屏幕设置为用户屏幕的大小并将其定位在 0,0 处。
很容易创建自己的边框来最小化和关闭程序,如下所示:
JavaFX Stage.setMaximized 仅在 Mac OSX (10.9.5) 上运行一次
这里:
设置 initowner 后需要设置 initmodality
toolStage.initOwner(stage);
toolStage.initModality(Modality.APPLICATION_MODAL);
我最近创建了一个图片检查器来在任务栏顶部显示应用程序。但它可能会导致
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);
}
}