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

标签 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.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() 与考虑双显示器设置不同。我应该认为这是一个错误并将其归档吗?或者还有其他方法可以实现这一目标吗?

最佳答案

有一个静态方法

static ObservableList<Screen> getScreens() The observable list of currently available Screens.

在屏幕类中。并且

static Screen getPrimary() The primary Screen.

使用它们来确定哪个屏幕不是主屏幕。

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

另外,我检查了 JFX jira,没有关于添加任何以屏幕为参数居中的方法的功能。因此,您可以提交 RFE,添加方法 centerOnScreen(Screen)...

关于java - 在辅助监视器上打开模式对话框的简单方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15886658/

相关文章:

java - easymock 意外行为

java - android.content.res.Resources$NotFoundException 异常

JavaFX 应用程序在关闭后仍在运行

javafx-2 - JavaFX 2.2 - 将鼠标事件添加到 BarChart 或 StockedBarChart 中的 Bar

javafx - JavaFX 下的全屏与 FXML

java - 如何在真实条件下模拟 Web 应用程序的 120 个并发用户?

java - 扩展类的调用函数(Java)

TableView 中带有自定义 CellFactory 的 Javafx 2.0 慢列

java - super(new Something(...)) 这个结构是错误的吗?

javafx-2 - 在 javafx 2 中移动未装饰的舞台