2013-04-08 77 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