2016-09-14 2 views
-1

JavaFX에서 그래프를 시각화하려고합니다. 노드는 대화식이어야한다. 나는 VBox를 가지고 있으며 그래프에 레벨이 필요한만큼 HBoxes를 배치합니다. 모든 HBox는 자녀를 가운데에 배치하도록 설정되어 있습니다. 자식 노드는 개별 노드를 나타내며 단추입니다. VBox 자체는 StackPane의 다른 자식으로 Canvas가있는 StackPane에 배치됩니다. 이 StackPane은 장면에 배치됩니다. 캔버스를 사용하여 노드 사이에 결합 된 모서리를 그립니다. 내가 사용하는 노드의 좌표를 얻으려면 :JavaFX : 명백한 이유없이 노드의 좌표가 잘못되었습니다.

System.out.println(button.localToScene(button.getBoundsInLocal().getMinX(), 
button.getBoundsInLocal().getMinY())); 

그러나 버튼, 좌표 결과 유해를 위치에 상관없이 모든 버튼에 대한

Point2D [x = 0.0, y = 108.0] 

. 모든 단일 버튼은 정확하게 표시되지만 분명히 동일한 좌표를가집니다!

제발 도와주세요 ... 지금 아주 필사적 메신저

편집 :

Main.java

public class Main extends Application { 

@Override 
public void start(Stage primaryStage) throws Exception { 
    VBox root = new VBox(); 
    HBox buttons = new HBox(); 
    TabPane tabs = new TabPane(); 
    buttons.getChildren().addAll(
      new Button("1"), 
      new Button("2"), 
      new Button("3")); 
    tabs.getTabs().addAll(
      new TabBoxes("____A____"), 
      new TabBoxes("____B____"), 
      new TabBoxes("____C____") 
    ); 
    root.getChildren().addAll(buttons, tabs); 
    primaryStage.setScene(new Scene(root, 500, 400)); 
    primaryStage.show(); 
} 


public static void main(String[] args) { 
    launch(args); 
} 
} 
을 : 여기

작동 최소한의 예입니다

TabBoxes.java

public class TabBoxes extends Tab { 
private VBox vBox = new VBox(); 
private ArrayList<HBox> hBoxes; 
private Canvas canvas = new Canvas(); 
private StackPane stack = new StackPane(); 
private static final int V_INIT_SPACING = 60; 
private static final int V_SPACING = 60; 
private static final int H_SPACING = 60; 

TabBoxes(String s){ 
    super(s); 
    this.setContent(stack); 
    setClosable(false); 
    stack.getChildren().add(canvas); 
    stack.getChildren().add(vBox); 
    canvas.setWidth(2000); 
    canvas.setHeight(1080); 
    hBoxes = new ArrayList<>(); 
    vBox.setSpacing(V_SPACING); 
    vBox.translateYProperty().set(V_INIT_SPACING); 
    for (int i = 0; i < 5; i++) { 
     hBoxes.add(new HBox() { 
      { 
       setSpacing(H_SPACING); 
       setAlignment(Pos.CENTER); 
      } 
     }); 
    } 
    for (int i = 0; i < 5; i++) { 
     for (int j = 0; j <= i; j++) { 
      hBoxes.get(i).getChildren().add(new Button(i + "||" + j){ 
       { 
        setPrefSize(100,60); 
        setOnAction(e-> System.out.println("My coordinates are: " + localToScene(getBoundsInLocal().getMinX(),getBoundsInLocal().getMinY()))); 
       } 
      }); 
     } 
    } 
    vBox.getChildren().addAll(hBoxes); 

} 
} 
+0

장면의 문제를 재현 할 수있는 [mcve]를 게시 할 수 있습니까? – fabian

+1

특히이 코드가 호출 될 때 중요합니다. 단추가 장면에 추가되고 레이아웃이 수행 된 후에 호출해야합니다. –

+0

최소한 한 번 더 문제를 재현 할 수 없어 내 코드를 한 번 더 확인하게되었습니다. 정확히 왜 모르겠지만 왜 장면을 설정하는 것을 포함하는 메서드 호출은 좌표를 읽기 전에 완료 되어야만합니다 (좌표를 읽는 것은 메서드 내에서 레이아웃을 설정 한 후에 발생했습니다). 이 두 가지를 나눠서 끝내고 이제 레이아웃에 Button을 추가 한 다음 다른 방법을 호출하여 제대로 작동하는 선을 업데이트합니다. 최소한의 예제를 만들어 주신 것에 대해 감사드립니다! 때로는 단순화하는 데 많은 도움이됩니다. – FluffyPal

답변

1

boundsInLocalButton의 좌표 자신의 시스템의 좌표이다. 이 값들이 동일하다는 것은 놀라운 것이 아닙니다. 당신이 좌표계 Canvas의 좌표를 계산하려면 StackPane 좌표로 좌표를 변환 한 후 Canvas에 좌표를 변환하려면
좌표 : 이것은가`StackPane` 루트이며, 작동합니다

Node n = button; 
Point2D p = new Point2D(button.getBoundsInLocal().getMinX(), button.getBoundsInLocal().getMinY()); 
while (n != stackPane) { 
    p = n.localToParent(p); 
    n = n.getParent(); 
} 

p = canvas.parentToLocal(p); 
+0

죄송합니다. 흥미로운 코드 줄을 복사하지 못했습니다. 좌표를 사용하기 전에 로컬 좌표에서도'localToScene'을 사용합니다. 그래서 완전히 그것 : 'button.localToScene (button.getBoundsInLocal(). getMinX(), button.getBoundsInLocal(). getMinY())' 내가 아는 한, while 루프는 다른 좌표를 반복한다. 시스템이 최상위 수준에 도달 할 때까지 그러나 'localToScene'은 Scene의 좌표계를 기반으로 좌표를 제공해야합니다. 또는 나는 무엇인가 놓치 느냐? – FluffyPal

관련 문제