选择在哪个监视器中打开 JavaFX window
Choose which monitor does a JavaFX window open in
我有两台显示器。我在第二台显示器上打开了 Eclipse,但是当我 运行 我的 JavaFX 代码时,JavaFX window 总是在第一台显示器上打开,每次我必须将它拖到第二台显示器上才能使用它。
我必须这样做,因为当它在第一台显示器上打开时,场景中的 none 组件会被加载。只有当我将它拖到第二台显示器时它才会被加载。但是当我断开第二台显示器时,它会正确加载。
有人可以帮帮我吗?默认情况下,如何让 window 在第二台显示器上打开?
注意:我的第一台显示器是 Macbook Pro,第二台是用作外接显示器的 iMac。
回复评论:
任何简单的 javaFX 代码都会发生组件无法在 screen1 上正确加载的问题。例如,为了方便起见,我将@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 或终端从屏幕 2 启动它时,屏幕 1 上显示的是:
调整 window 的大小不会向我显示组件,而只会缩放它们。我也无法点击按钮。
当我把它拖到屏幕2时,它变成了这样:
在另外两个显示器仍然连接的情况下,如果我将 eclipse 拖到屏幕 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);
}
}
不幸的是,我无法帮助组件未加载到主屏幕上。请提供更多详细信息来解决这个问题(哪些组件、它们是如何创建的、代码示例等)
我有两台显示器。我在第二台显示器上打开了 Eclipse,但是当我 运行 我的 JavaFX 代码时,JavaFX window 总是在第一台显示器上打开,每次我必须将它拖到第二台显示器上才能使用它。
我必须这样做,因为当它在第一台显示器上打开时,场景中的 none 组件会被加载。只有当我将它拖到第二台显示器时它才会被加载。但是当我断开第二台显示器时,它会正确加载。
有人可以帮帮我吗?默认情况下,如何让 window 在第二台显示器上打开?
注意:我的第一台显示器是 Macbook Pro,第二台是用作外接显示器的 iMac。
回复评论:
任何简单的 javaFX 代码都会发生组件无法在 screen1 上正确加载的问题。例如,为了方便起见,我将@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 或终端从屏幕 2 启动它时,屏幕 1 上显示的是:
当我把它拖到屏幕2时,它变成了这样:
在另外两个显示器仍然连接的情况下,如果我将 eclipse 拖到屏幕 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);
}
}
不幸的是,我无法帮助组件未加载到主屏幕上。请提供更多详细信息来解决这个问题(哪些组件、它们是如何创建的、代码示例等)