2013-04-08 37 views
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()与考虑双显示器设置时不同。我应该考虑这个错误并将其归档吗?还是有另一种方法来实现这一目标?

+0

帮助创建按钮点击对话框?也许(不确定)它会考虑'stage'的位置。 – 2013-04-08 18:57:50

+0

你的意思是一个setOnMouseClicked处理程序?那么,这并没有工作 – 2013-04-08 19:08:20

+0

无赖,应该预料到你试过;-) – 2013-04-08 19:14:02

回答

2

有一个静态方法

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

在Screen类。和

static Screen getPrimary() The primary Screen. 

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

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

此外,我检查了JFX jira,没有关于添加以屏幕为中心的任何方法方法作为参数的功能。所以,你可以申请一个RFE,添加方法centerOnScreen(Screen)...

+0

是的,我知道这些方法,我可以用它们手动。尽管我认为默认情况下,对话框应该在其父项的中心打开。我会为此向JIRA添加一个问题。 – 2013-04-08 20:24:46

+1

https://javafx-jira.kenai.com/browse/RT-29563 – 2013-04-08 20:31:51