考虑一下:
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.SceneBuilder;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonBuilder;
import javafx.scene.control.Label;
import javafx.scene.control.LabelBuilder;
import javafx.scene.layout.FlowPaneBuilder;
import javafx.scene.layout.Pane;
import javafx.stage.Modality;
import javafx.stage.Stage;
import javafx.stage.StageBuilder;
public class DualMonitorProblem extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(final Stage stage) throws Exception {
Label label = LabelBuilder.create().text("I seem to be lost").build();
Scene dlgScene = SceneBuilder.create().root(label).build();
final Stage dlgStage = StageBuilder.create().scene(dlgScene).resizable(false).build();
dlgStage.initModality(Modality.APPLICATION_MODAL);
dlgStage.initOwner(stage);
Button btn = ButtonBuilder.create().text("put me on secondary monitor before clicking me").build();
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
dlgStage.showAndWait();
}
});
Button btn2 = ButtonBuilder.create().text("me too").build();
btn2.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
dlgStage.setX(stage.getX() + stage.getWidth() / 2);
dlgStage.setY(stage.getY() + stage.getHeight() / 2);
dlgStage.showAndWait();
}
});
Button btn3 = ButtonBuilder.create().text("me too").build();
btn3.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
dlgStage.centerOnScreen();
dlgStage.showAndWait();
}
});
Pane p = FlowPaneBuilder.create().children(btn, btn2, btn3).build();
Scene scene = SceneBuilder.create().root(p).width(800).height(600).build();
stage.setScene(scene);
stage.show();
}
}
将舞台拖动到辅助监视器,然后单击其中一个按钮。当您不执行任何操作时,将在主监视器上打开模态对话框。 在父级的中心打开模态对话框的最简单方法是什么? Stage.centerOnScreen()不同于考虑双显示器设置。我应该认为这是一个错误并提交它吗?或者还有另一种方法来实现这一目标吗?
答案 0 :(得分:2)
有静态方法
static ObservableList<Screen> getScreens() The observable list of currently available Screens.
屏幕类中的。和
static Screen getPrimary() The primary Screen.
使用它们来确定哪个屏幕不是主屏幕。
您可以使用它来确定您拥有的屏幕。并使用Window。 setX和setY方法 - 定位窗口 - 只是一个简单的数学。
另外,我在JFX jira中检查过,没有关于添加任何以屏幕为中心的方法方法作为参数的功能。因此,您可以提交RFE,添加方法centerOnScreen(屏幕)...