2017-02-13 2 views
0

이제 JavaFX LineCharts에서 데이터를 표시하기위한 프로그램을 작성하려고합니다. 내 메인 패널은 위쪽/왼쪽/오른쪽/등의 일부 기능이있는 BorderPane입니다. 패널 중앙에 선 차트를 표시하려고합니다. 1 이상, 4GridPane에서 JavaFX LineChart의 간격

의 최대 그래서 나는이 유사한 결과를 달성하기 위해 메인 패널의 중심에 gridpane 설정에 대한 생각 : 지금

Sample Gridpane

내 문제를 때 LineCharts를 GridPane에 추가하려고합니다 (.add (chart, 0, 0)). 차트가 부모와 일치하지 않을 것입니다. 차트를 더 추가하는 경우에도 마찬가지입니다.

Something like this

부모와 일치하는 항목을 많이 훑어 보았습니다. 그러나 어쨌든 나는 어디에도 가지 않습니다 :/경계선의 "중심"크기를 알아야 할 필요가있을 때 그에 따라 LineChart의 크기를 조정할 수 있습니다. 그러나 나는 그것을 찾을 수 없습니다 ... 아마도 당신의 누군가가 단서를 가지고 있습니까?

건배!

+0

상기 창 너비를 2로 나누고 높이를 같게 할 수 있습니까? 빠른 Google 발견 [this] (http://stackoverflow.com/questions/12643125/getting-the-width-and-height-of-the-center-space-in-a-borderpane-javafx-2) – Taelsin

+0

예 나는 이것을 시도했지만 결과는 만족스럽지도 매우 우아하지도 않다. 그리드에 4 개의 차트가있을 때 모든 사용자의 prefWidth/Height를 GridPane의 크기의 절반으로 설정하려고했습니다. 어떻게 든 차트는 여전히 크기가 다르며 차트 1이 가장 크고 차트 4가 가장 작습니다./ –

답변

0

자식 요소 크기에 대한 GridPane에 수신기를 추가하고 자식 요소 목록의 크기를 기반으로 자식 노드의 레이아웃 제약 조건을 업데이트 할 수 있습니다.

charts

import javafx.application.Application; 
import javafx.beans.binding.Bindings; 
import javafx.collections.ObservableList; 
import javafx.geometry.*; 
import javafx.scene.Node; 
import javafx.scene.Scene; 
import javafx.scene.chart.*; 
import javafx.scene.layout.*; 
import javafx.stage.Stage; 

import java.util.stream.IntStream; 

public class GridViewer extends Application { 
    @Override 
    public void start(final Stage stage) throws Exception { 
     ChartGrid grid = new ChartGrid(); 

     grid.getChildren().setAll(
       IntStream.range(1, 5) 
         .mapToObj(this::createLineChart) 
         .toArray(Chart[]::new) 
     ); 

     stage.setScene(new Scene(grid)); 
     stage.show(); 
    } 

    class ChartGrid extends GridPane { 
     ChartGrid() { 
      setHgap(5); 
      setVgap(5); 
      setPadding(new Insets(5)); 

      setPrefSize(500, 500); 

      Bindings.size(getChildren()).addListener((observable, oldSize, newSize) -> { 
       ObservableList<Node> nodes = getChildren(); 
       for (int i = 0; i < newSize.intValue(); i++) { 
        GridPane.setConstraints(
          nodes.get(i), 
          i/2, i % 2, 
          1, 1, 
          HPos.CENTER, VPos.CENTER, 
          Priority.ALWAYS, Priority.ALWAYS 
        ); 
       } 
      }); 
     } 
    } 

    private Chart createLineChart(int idx) { 
     NumberAxis xAxis = new NumberAxis(); 
     NumberAxis yAxis = new NumberAxis(); 
     LineChart<Number, Number> chart = new LineChart<>(xAxis, yAxis); 
     chart.setTitle("Chart " + idx); 
     chart.setMinSize(0, 0); 

     return chart; 
    } 

    public static void main(String[] args) throws Exception { 
     launch(args); 
    } 
} 

참고 :이 솔루션의 중요한 부분이 차트의 최소 매개 변수를 설정하는 것입니다 0 :

chart.setMinSize(0, 0); 

이 때문에 당신의 가능한 영역의 크기를하는 경우 GridPane이 차트의 최소 크기 (기본적으로 0이 아님)의 합보다 작 으면 차트가 서로 겹치기 시작합니다. 이는 원하는 것이 아닙니다.

+0

노력에 감사드립니다. 감사! –

+0

그리드 채우기에 대한 질문이 하나 더 있습니다 : 차트를 동적으로 추가/제거하고 싶습니다 (.setAll 스트림을 통하지 않고 ==>). grid.add (chart, 0, 0) eg.를 사용할 때 행/열을 지정해야하므로 결과는 네 개의 사각형으로 분할 된 GridPane이며 왼쪽 상단에 하나의 차트가 있습니다. 전체적으로 4 개의 차트가있을 때 모든 것이 완벽하게 맞기 때문에 이것은 잘못된 것이 아닙니다. 그러나 하나의 차트에서 차트는 실제로 GridPane 전체에 표시되어야합니다. 이 권리를 얻기 위해 어떤 방법/방법을 권하는가? (나는 또한 .getChildren.add 뒤에 .getChildren.set을 시도했지만, 위와 같은 결과가 나타납니다) –

관련 문제