2014-01-14 2 views
5

버튼을 클릭하면 위치가 변경됩니다.JavaFX에서 노드의 위치를 ​​명시 적으로 지정합니다.

그러나 마우스를 움직이면 버튼이 장면 중앙으로 돌아옵니다. 왜?

나는 다음과 같은 코드를 가지고 : 나는에 버튼을 배치 StackPane 대신 AnchorPane를 사용할 때

public class HolaMundo extends Application { 

    Button btn; 
    Scene scene; 

    @Override 
    public void start(Stage primaryStage) { 
     btn = new Button(); 
     btn.setText("Hola Mundo"); 

     StackPane root = new StackPane(); 
     root.getChildren().add(btn); 

     scene = new Scene(root, 300, 250); 

     primaryStage.setTitle("Hello World!"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 

     scene.setOnMouseMoved(new EventHandler<MouseEvent>(){ 

      @Override 
      public void handle(MouseEvent t) { 
       btn.setText(String.valueOf(t.getX())); 
      } 
     }); 

     btn.setOnAction(new EventHandler<ActionEvent>() { 

      @Override 
      public void handle(ActionEvent event) { 
       btn.setLayoutX(Math.random() * (300 - btn.getWidth())); 
       btn.setLayoutY(Math.random() * (250 - btn.getHeight())); 
      } 
     }); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
+0

현재 사용중인 JavaFX의 버전은 무엇입니까? JavaFX 8에서는 버튼이 전혀 움직이지 않습니다. – assylias

답변

14

특정 코드 권장 접근

는 가장 좋은 방법입니다.

수동 레이아웃 값을 설정하려는 경우 코드가 자동으로 레이아웃 값을 설정 레이아웃 창 (예 : StackPane 등)를 사용하지 마십시오, 당신은

을 원하는하지 않는 이유

. 레이아웃 창을 사용하는 경우 명시 적으로 설정 한 레이아웃 값은 다음 번 레이아웃 창이 레이아웃 패스를 수행 할 때 자동으로 재정의됩니다 (예 : 크기가 조정되거나 일부 내용 또는 위치가 더러워집니다).

  1. 서브 클래스 RegionlayoutChildren를 오버라이드 (override) : 명시 적으로 자바 FX의 레이아웃 항목은 다음 중 하나를 수행하려면 명시 적으로 노드

    의 레이아웃

    옵션을 선택합니다.

  2. CSS로 스타일을 지정하거나 크기 조정 기능을 구현해야하는 경우 콘텐츠를 Pane에 배치하십시오.
  3. 컨테이너에 CSS로 스타일을 지정하거나 크기 조정 기능을 구현하지 않으려면 콘텐츠를 Group에 배치하십시오.
노드 위치에

관련 조언

당신이 원하는 경우 자동으로 미리 정의 된 레이아웃 관리자를 사용하여 구성 요소를 배치 가지고 있지만 조정하거나 일시적으로 기본 위치에서 일부 구성 요소의 위치를 ​​수정할 , layoutX/Y 값보다는 translateX/Y 값을 조정할 수 있습니다.translateX의 정의에 따르면

노드의 최종 변환이 layoutX 노드의 안정 위치를 설정하고 translateX 선택적으로 그 위치에 동적 조정을 layoutX + translateX로 계산 될 것이다. 이 변수는 layoutBounds를 방해하지 않고 노드의 위치를 ​​변경하는 데 사용할 수 있으므로 노드 위치에 애니메이션을 적용하는 데 유용합니다.

이 레이아웃 매니저는 layoutX을 사용하여 자식의 기본 위치를 계산할 수있다, 당신은 translateX을 사용하여 기본의 위치를 ​​조정할 수 있다는 것을 의미한다.

0

깊이 현재 사건을 조사하는 데 수 없음을, 나는 차이를 참조하십시오.

mouseMoved-Event로 Button의 레이블 텍스트를 변경하면 창 (레이아웃이 요청 됨)이 렌더링됩니다. StackPane이 모든 자식을 자신의 중심에 배치하면 Button의 위치가 창 중앙으로 재설정됩니다. StackPane의 layoutChildren 메소드를 살펴보면 resizeRelocate에 대한 호출이 표시됩니다. 그래서 layoutX와 layoutY는 재설정되고 버튼은 다시 가운데 위치 (또는 StackPane의 정렬을 설정 한 곳)로 돌아갑니다.

그래서 이것이 StackPane의 올바른 동작이라고 생각하며 다른 창을 사용하는 것이 좋습니다. AnchorPane. 아마도 Pane 대신 StackPane (A)의를 사용하여