选择JavaFX窗口在哪个显示器中打开

11

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

我必须这样做,因为当它在第一个显示器上打开时,场景中的所有组件都没有加载。只有当我将它拖到第二个显示器上时,它才会被加载。但是当我断开第二个显示器时,它可以正常加载。

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

NB:我的第一个显示器是Macbook Pro,第二个是用作外部显示器的iMac。

回应评论:

在屏幕1上组件无法正确加载的问题发生在任何简单的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);
    }
}
当我从屏幕2中使用eclipse或终端运行时,在屏幕1上会出现以下情况: Faulty load 调整窗口大小不会显示组件,只会对它们进行缩放。我也无法单击按钮。
当我将它拖到屏幕2上时,就变成了这样: loaded 在仍连接着另外两个显示器的情况下,如果我将eclipse拖到屏幕1上并从那里运行代码,则会正确加载:runs properly 我还应该补充一点,即一旦我将其拖到其他屏幕并加载组件后,它们可以在任何屏幕上正常工作。

1
你可能可以通过 Screen 找到一些解决方案。请参见此处(目前没有时间完整回答)。 - Itai
我赞同@sillyfly对于使用 Screen 的看法。然而,根据你的描述,内容仅在第二个屏幕上加载,我猜这里有一些严重的问题或者这是预期行为?如果不是,请调查并修复该问题,而不是实施绕过方法。 - hotzst
1
你能提供一个示例让我在我的双显示器设置上测试吗? - Oliver Jan Krylow
1
不是很老,但你可以试试最新版本作为实验吗?8u72 - Sergey Grinev
1
通过更新到8u71版本进行修复。感谢@SergeyGrinev。 - Vivek V K
显示剩余2条评论
1个回答

14

您可以迭代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);
    }
}

很抱歉,我无法帮助解决在主屏幕上未加载的组件问题。请提供更多详细信息以便解决(哪些组件、如何创建、代码示例等)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接