본문 바로가기
JavaFX

새로운 stage 띄울 때 기존 stage 구하기(듀얼모니터)

by 루에 2019. 6. 11.
반응형

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로 구분한다.

 

 

반응형

댓글