JavaFX의 stage의 위치는 모니터 갯수에 상관없이 좌표로 구분된다.
x,y,width,height
4개의 프로퍼티로 창을 띄우는 위치가 결정된다.
듀얼모니터의 경우 1번 모니터는 minX - 0 maxX - 1080 처럼 구분되며, 2번모니터는 min이 1080 max는 모니터 가로 크기 더한값.
그래서 새로운 stage를 띄울 때 기존 stage값을 기반으로 하지 않으면 무조건 primary 모니터에 뿌려주기 때문에 해당 이슈를 해결하기 위해서는 두 가지 방법이 존재한다.
1. 기존 stage의 프로퍼티를 구해서 새로운 stage에 지정한 뒤 띄운다.
2. 모니터의 갯수를 파악하고 x,y값만 구해서 현재 stage가 있는 모니터에 띄운다.
구현하고자 하는 기능에 따라 솔루션은 나뉘겠지만 내 경우에는 1번이 훨씬 간단하고 명확했다.(기존 stage 크기와 위치 그대로 띄워줘야 했기 때문에)
각각 방법을 아래 기술한다.
1.
with(btn) {
action {
var win = this.scene.window
logger.debug("current window - " + win.x)
logger.debug("current window - " + win.y)
logger.debug("current window - " + win.width)
logger.debug("current window - " + win.height)
popupView.fullScreenPopupStages.add(popupStage.apply {
getCurrentScreenIndex(this)
x = win.x
y = win.y
width = win.width
height = win.height
show() })
}
}
버튼이 위치한 window를 구한다. Stage는 Window를 상속받은 객체기 때문에 Window는 Stage와 위치 프로퍼티가 동일하게 구성되어 있으며, Stage로 형변환도 가능하다.(아래 코드 기술)
현재 window의 위치 프로퍼티를 구해 stage를 새로 띄울 때 위치정보를 기술한 뒤 show()하는 것으로 현재 창을 그대로 덮는 새로운 stage를 띄울 수 있다.
* </code></pre>
* <p>produces the following on Windows:</p>
* <p><img src="doc-files/Stage-win.png"/></p>
*
* <p>produces the following on Mac OSX:</p>
* <p><img src="doc-files/Stage-mac.png"/></p>
*
* <p>produces the following on Linux:</p>
* <p><img src="doc-files/Stage-linux.png"/></p>
* @since JavaFX 2.0
*/
public class Stage extends Window {
private boolean inNestedEventLoop = false;
private static ObservableList<Stage> stages = FXCollections.<Stage>observableArrayList();
2.
fun getCurrentScreenIndex(stage : Stage) : Int {
var screenX : Double = stage.x
var index : Int = 0
for(src in Screen.getScreens()){
logger.debug("index - $screenX")
logger.debug("index - ${src.visualBounds.maxX}")
if(screenX < src.visualBounds.maxX) break
else index++
}
logger.debug("index - $index")
return index
}
screenX는 stage의 x좌표값을 의미한다. 1080p 듀얼 모니터의 경우 1번 모니터의 좌측 끝에서부터 열려있다면 x값은 0, 2번 모니터의 좌측 끝에서부터 열려있다면 x값은 1080이 된다. 그 값을 이용해 현재 stage가 몇 번 모니터에 위치해있는지 구해 index로 구분한다.
댓글