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.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() は、デュアル モニターのセットアップを考慮に入れるのと同じではありません。これをバグと見なして報告する必要がありますか? または、これを達成する別の方法はありますか?

4

1 に答える 1