选择JavaFX窗口在哪个监视器中打开

选择JavaFX窗口在哪个监视器中打开,java,javafx,javafx-8,multiple-monitors,Java,Javafx,Javafx 8,Multiple Monitors,我有两台显示器。我在第二个监视器上打开了Eclipse,但是当我运行我的JavaFX代码时,JavaFX窗口总是在第一个监视器中打开,每次我必须将它拖到第二个监视器上才能使用它 我必须这样做,因为当它在第一个监视器上打开时,场景中没有任何组件被加载。只有当我将它拖到第二个监视器时,它才会被加载。但当我断开第二个监视器时,它会正常加载 有人能帮我吗?默认情况下,如何使窗口在第二个监视器上打开 注:我的第一个显示器是Macbook Pro,第二个是用作外部显示器的iMac 对提出的意见作出答复: 任

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

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

有人能帮我吗?默认情况下,如何使窗口在第二个监视器上打开

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

对提出的意见作出答复:

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

代码:

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

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

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


我还应该补充一点,一旦我将其拖动到其他屏幕并加载组件,它们在任何屏幕上都能正常工作。

您可以迭代
screen.getScreens()
并将
阶段移动到所需的一个。见下面的例子

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);
    }
}

不幸的是,我无法帮助主屏幕上没有加载的组件。请提供更多详细信息(哪些组件、它们是如何创建的、代码示例等)

您可以使用
屏幕
解决一些问题。请参阅(目前没有时间得出完整的答案)。我同意@sillyfly使用
屏幕
。然而,根据您的描述,仅在第二个屏幕上加载内容,我猜这是严重错误,还是这是预期的行为?如果没有,你应该调查并修复它,而不是实施一个变通方法。你能提供一个我可以在我的双监视器设置上测试的示例吗?没有那么旧,但无论如何,你能尝试一下最新的实验吗?8U72已通过更新为8u71进行修复。谢谢@SergeyGrinev
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);
    }
}