Java 在辅助监视器上打开模式对话框的简单方法?

Java 在辅助监视器上打开模式对话框的简单方法?,java,javafx-2,Java,Javafx 2,考虑这一点: 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.ButtonBuilde

考虑这一点:

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();
}
}
导入javafx.application.application;
导入javafx.event.ActionEvent;
导入javafx.event.EventHandler;
导入javafx.scene.scene;
导入javafx.scene.SceneBuilder;
导入javafx.scene.control.Button;
导入javafx.scene.control.ButtonBuilder;
导入javafx.scene.control.Label;
导入javafx.scene.control.LabelBuilder;
导入javafx.scene.layout.FlowPaneBuilder;
导入javafx.scene.layout.Pane;
导入javafx.stage.model;
导入javafx.stage.stage;
导入javafx.stage.StageBuilder;
公共类DualMonitorProblem扩展了应用程序{
公共静态void main(字符串[]args){
发射(args);
}
@凌驾
public void start(final Stage)引发异常{
Label Label=LabelBuilder.create().text(“我好像迷路了”).build();
场景dlgScene=SceneBuilder.create().root(label.build();
最终阶段dlgStage=StageBuilder.create().scene(dlgScene).resizeable(false.build();
dlgStage.initmodel(model.APPLICATION_model);
dlgStage.initOwner(阶段);
Button btn=ButtonBuilder.create().text(“在单击我之前将我放在辅助监视器上”).build();
btn.setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent事件){
dlgStage.showAndWait();
}
});
Button btn2=ButtonBuilder.create().text(“我也是”).build();
setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent事件){
dlgStage.setX(stage.getX()+stage.getWidth()/2);
dlgStage.setY(stage.getY()+stage.getHeight()/2);
dlgStage.showAndWait();
}
});
Button btn3=ButtonBuilder.create().text(“我也是”).build();
btn3.setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent事件){
dlgStage.centerOnScreen();
dlgStage.showAndWait();
}
});
窗格p=FlowPaneBuilder.create().children(btn、btn2、btn3).build();
Scene-Scene=SceneBuilder.create();
舞台场景;
stage.show();
}
}
将舞台拖到辅助监视器上,然后单击其中一个按钮。当您不执行任何额外操作时,主监视器上将打开模式对话框。 在父阶段的中心打开模式对话框的最简单方法是什么?Stage.centerOnScreen()不适用于双监视器设置。我应该考虑这个bug并归档吗?或者有其他方法可以实现这一点吗?

有静态方法吗

static ObservableList<Screen> getScreens() The observable list of currently available Screens.
使用它们来确定哪个屏幕不是主屏幕

您可以使用它来确定您有哪些屏幕。并使用窗口。setX和setY方法-定位窗口-只是一个简单的数学


另外,我在JFX jira中检查,没有关于添加以屏幕为参数居中的任何方法的特性。因此,您可以提交RFE,以在屏幕(屏幕)上添加方法中心。

单击按钮创建对话框是否有帮助?也许(不确定)它会考虑到
阶段的位置。你是说使用setOnMouseClicked处理程序?不,那没用,糟糕透了,应该料到你试过;-)只是在你建议之后,所以无论如何谢谢:)是的,我知道这些方法,我可以用它们手动完成。尽管我认为默认情况下对话框应该在其父对象的中心打开。我会给吉拉增加一个问题。
static Screen getPrimary() The primary Screen.