2017-12-20 2 views
1

코드는 JavaFX로 작성되었습니다.왜 getBoundsInLocal 좌표가 잘못 되었습니까?

나는 루트 패널과 VBox이 있습니다. VBox에는 작은 패널이 많이 있습니다.

VBox에 하나의 작은 패널을 추가하려면 버튼을 클릭하고 새 패널에 메시지 대화 상자가 나타납니다.

button.setOnAction(() -> { 
    Node selectPanel = new Node(); 
    vbox.getChildren().add(selectPanel); 
    Bounds bounds = selectPanel.localToScreen(selectPanel.getBoundsInLocal()); 
    showMessage(bounds); 
}); 

그러나 새 패널의 위치에는 메시지가 표시되지 않습니다.

코드를 디버그하고 경계가 루트 패널 (또는 vbox)의 왼쪽 상단인지 확인합니다. 누군가 새로운 패널의 올바른 좌표를 얻는 방법을 말해 줄 수 있습니까?

+0

'Node'이 추상적이다 '그래서 노드 selectPanel = 새로운 노드() :

당신은 언급 행 다음에 다음 두 명령문을 실행하여 강제 할 수 있습니다 자신의'Node' 클래스. 그리고 람다 식은 아무런 논점도 없기 때문에 잘못되었습니다. 컴파일하는 코드 만 게시하십시오. – DVarga

답변

2

코드가 컴파일되지 않습니다 (내 의견을 참조하십시오). 그러나 문제는 vbox.getChildren().add(selectPanel);이 호출 되더라도 레이아웃 계산이 (확실하게) 발생하지 않는다는 사실에서 기인합니다. 당신이 구현해야하므로`, 컴파일되지 않습니다;

vbox.layout(); 
vbox.applyCss(); 
+0

감사합니다! 그것은 작동합니다. –

+0

한 번 더 질문드립니다. 좌표가 새 패널의 위치에 정확하게 있지 않다는 것을 알았습니다. 같은 시간에 vbox에 2 개 이상의 패널을 추가하면 각 메시지 상자에 약간의 오프셋이 있습니다. 같은 시간에 많은 패널을 추가하면 (예 : 10 개 이상) 메시지 상자가 겹칩니다. 인덱스가 클수록 오프셋이 커집니다. –

관련 문제