2017-02-13 89 views
0

所以現在我試圖編寫一個用於在JavaFX LineCharts中顯示數據的程序。我的主面板是一個BorderPane,在頂部/左側/右側/等等的一些功能。在面板的中心我想顯示LineChart(s)。至少1,最大爲4在GridPane中間隔JavaFX LineCharts

因此,我認爲有關設置gridpane到主面板的中心,以實現類似這樣的結果:

Sample Gridpane

我現在的問題是,當我嘗試將LineCharts添加到GridPane中(使用.add(圖表0,0)),圖表不會與父級匹配。如果我繼續添加更多的圖表,則會發生同樣的情況。原來是這樣的:

Something like this

我查了很多關於父匹配的東西,但不知何故,我沒有得到任何地方:/我需要知道邊界窗格的「中心」的大小,然後我可以相應地調整LineCharts的大小。但我無法找到它......也許你有人有線索?

乾杯!

+0

你可以得到所述窗格的寬度,除以二,然後做同樣的高度?快速谷歌發現[這](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); 
    } 
} 

注:這個解決方案的一個重要組成部分,是設置圖表的minSize屬性爲0:

chart.setMinSize(0, 0); 

這是因爲如果你的尺寸的可用面積GridPane小於圖表的最小大小(默認情況下不是0)的總和,那麼圖表將開始相互重疊,這不是您想要的。

+0

非常感謝您的努力,這正是我所需要的!謝謝! –

+0

關於網格的人口只有一個問題: 我想動態添加/刪除圖表(==>不通過.setAll流)。當我使用grid.add(圖表,0,0)例如,我必須指定行/列,所以結果是GridPane分爲四個正方形,左上角有一個圖表。這本身並不是錯誤的,因爲當我總共有4個圖表時,所有東西都完美匹配。但是對於一張圖表,圖表應該實際顯示在GridPane的全部位置。你推薦什麼方式/方法來獲得這種權利? (我也嘗試過.getChildren.add後跟.getChildren.set,但結果與上面相同) –