2016-06-14 2 views
1

저는 최근에 JavaFX를 배우기 시작한 초보자이며, 제 프로그램 내에서 같은 실수를 반복하고있는 것으로 보입니다. 예를 들어, 다음 코드에서는 X 축과 Y 축을 그려서 패널의 너비와 높이의 절반에 바인딩하려고합니다. 실행될 때 축은 매우 작고 토플렛 코너에 위치하지만 응용 프로그램의 창 크기를 조정하면 창 크기가 더 이상 조정되지 않을 때까지 축의 크기가 서서히 증가합니다.JavaFX : 창에 문제 바인딩 속성이 있습니다.

public class Debug extends Application { 
    @Override 
    public void start(Stage primaryStage) { 
     Pane pane = new Pane(); 
     GraphFunc test = new GraphFunc(); 
     pane.getChildren().add(test); 

     Scene scene = new Scene(pane, 500, 500); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 
    public static void main(String[] args) { 
     launch(args); 
    } 
} 

class GraphFunc extends Pane { 
    private double xAxisSpan, yAxisSpan; 

    public GraphFunc() { 
     xAxisSpan = 100; 
     yAxisSpan = 100; 
     drawAxes(); 
    } 

    private void drawAxes() { 
     Line xAxis = new Line(0, 50, 100, 50); 
     Line yAxis = new Line(50, 0, 50, 100); 
     xAxis.setStartX(0); 
     xAxis.startYProperty().bind(heightProperty().divide(2)); 
     xAxis.endXProperty().bind(widthProperty()); 
     xAxis.endYProperty().bind(heightProperty().divide(2)); 

     yAxis.startXProperty().bind(widthProperty().divide(2)); 
     yAxis.setStartY(0); 
     yAxis.endXProperty().bind(widthProperty().divide(2)); 
     yAxis.endYProperty().bind(heightProperty()); 

     getChildren().addAll(xAxis, yAxis); 
    } 
} 

창을 StackPane으로 변경하면이 작업이 수행되지 않으므로 혼란 스럽습니다. 또한 drawAxes()의 코드를 start()로 옮기고 선을 창에 추가하면이 작업도 수행되지 않습니다. 설명해주십시오. 연구하고 놀고 난 후에 무슨 일이 일어나는지 이해할 수없는 것 같습니다.

답변

1

이것은 창 때문입니다. 창은 어린이의 절대 위치 지정이 필요할 때 사용하기위한 것입니다.

이 오라클 문서에서입니다 :

이 클래스는 그들의 적절한 사이즈로 크기 조정 아이들의 크기를 조절 이상으로 레이아웃을 수행하지 않기 때문에 아이들의 절대 위치가 필요한 경우에 직접 사용할 수있다. 창은 레이아웃 중에 위치를 혼자 남겨두기 때문에 자식을 배치하는 것은 응용 프로그램의 책임입니다.

Pane pane = new Pane(); 
    GraphFunc test = new GraphFunc(); 
    pane.getChildren().add(test); 

    Scene scene = new Scene(pane, 500, 500); 

당신은 현장에서 폭과 높이를 제거하고 대신에 다음과 같이 테스트에 직접 폭과 높이를 설정 한 경우 :

public void start(Stage primaryStage) { 
 
     GridPane pane = new GridPane(); 
 
     GraphFunc test = new GraphFunc(); 
 
     test.setPrefSize(500, 500); 
 
     pane.getChildren().add(test); 
 

 
     Scene scene = new Scene(pane); 
 
     primaryStage.setScene(scene); 
 
     primaryStage.show(); 
 
    }

당신이 얻을 것이다 :

drawn image

그러나 너는 펼칠 수 없습니다. Oracle 문서에서

:

참고 : 응용 프로그램 (왼쪽 상단 등에 위치, 중심)을 부모 내에서 정렬 유지하기 위해 아이들을 필요로하는 경우, 그것은 대신 StackPane를 사용해야합니다.

창은 기본적으로 컨텐츠를 클립하지 않는, 그래서 어린이 '경계 아이들이 부정적인에 위치 중 하나를하는 경우, 자신의 경계의 외측에 연장 할 수 가능성이있다 : Oracle 문서에서 또한

좌표 또는 창 크기가 보다 작은 경우 원하는 크기보다 작습니다.

+0

감사합니다. – woodenwaffle