【问题标题】:Choose which monitor does a JavaFX window open in选择在哪个监视器中打开 JavaFX 窗口
【发布时间】:2016-04-28 10:59:15
【问题描述】:

我有两台显示器。我在第二台显示器上打开了 Eclipse,但是当我运行我的 JavaFX 代码时,JavaFX 窗口总是在第一台显示器中打开,每次我必须将它拖到第二台显示器上才能使用它。

我必须这样做,因为当它在第一台监视器上打开时,场景中的任何组件都没有加载。只有当我将它拖到第二台显示器时才会加载它。但是当我断开第二台显示器时,它会正确加载。

有人可以帮帮我吗?默认情况下,如何使窗口在第二台显示器上打开?

注意:我的第一台显示器是 Macbook Pro,第二台是用作外接显示器的 iMac。

回应制作的cmets:

组件无法在 screen1 上正确加载的问题发生在任何简单的 javaFX 代码中。例如,为了方便起见,我将@Sergey 给出的代码作为答案。

代码:

public class FXScreens extends Application {

    @Override
    public void start(Stage stage) {
        VBox root = new VBox(10);
        root.setAlignment(Pos.CENTER);
        Scene scene = new Scene(root, 200, 250);

        int index = 1;
        for (Screen screen : Screen.getScreens()) {
            Rectangle2D bounds = screen.getVisualBounds();

            Button btn = new Button("Move me to Screen " + index++);
            btn.setOnAction((e) -> {
                stage.setX(bounds.getMinX() + 100);
                stage.setY(bounds.getMinY() + 100);
            });
            root.getChildren().add(btn);
        }

        stage.setTitle("Screen Jumper");
        stage.setScene(scene);
        stage.show();
    }

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

当我使用 Eclipse 或终端从 screen2 启动它时,屏幕 1 上会出现以下内容: 调整窗口大小不会显示组件,而只是缩放它们。我也无法单击按钮。

当我将它拖到屏幕 2 时,它变成了这样:

在其他两个显示器仍然连接的情况下,如果我将 eclipse 拖到 screen1 并从那里运行代码,它会正确加载:

我还应该补充一点,一旦我将它拖到另一个屏幕并加载了组件,它们在任何屏幕上都可以正常工作。

【问题讨论】:

  • 您可以通过Screen 解决问题。请参阅here(目前没有时间来完整回答)。
  • 我同意@sillyfly 使用Screen。但是,根据您的描述,内容仅在第二个屏幕上加载,我猜这是严重错误还是这是预期的行为?如果没有,您应该调查并修复它,而不是实施解决方法。
  • 你能提供一个我可以在我的双显示器设置上测试的例子吗?
  • 没有那么旧,但无论如何你可以尝试最新的作为实验吗? 8u72
  • 已通过更新到 8u71 修复。谢谢@SergeyGrinev

标签: java javafx javafx-8 multiple-monitors


【解决方案1】:

您可以迭代 Screen.getScreens() 并将您的 stage 移动到所需的一个。请参见下面的示例。

public class FXScreens extends Application {

    @Override
    public void start(Stage stage) {
        VBox root = new VBox(10);
        root.setAlignment(Pos.CENTER);
        Scene scene = new Scene(root, 200, 250);

        int index = 1;
        for (Screen screen : Screen.getScreens()) {
            Rectangle2D bounds = screen.getVisualBounds();

            Button btn = new Button("Move me to Screen " + index++);
            btn.setOnAction((e) -> {
                stage.setX(bounds.getMinX() + 100);
                stage.setY(bounds.getMinY() + 100);
            });
            root.getChildren().add(btn);
        }

        stage.setTitle("Screen Jumper");
        stage.setScene(scene);
        stage.show();
    }

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

不幸的是,我无法在主屏幕上加载组件。请提供更多详细信息以解决该问题(哪些组件、它们是如何创建的、代码示例等)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-02
    • 2014-02-09
    • 1970-01-01
    • 1970-01-01
    • 2013-02-09
    • 1970-01-01
    • 2015-07-15
    • 2014-10-19
    相关资源
    最近更新 更多