2017-02-13 28 views
0

今、私はJavaFX LineChartsでデータを表示するためのプログラムを作成しようとしています。私のメインパネルは、上/左/右/などのいくつかの機能を持つBorderPaneです。パネルの中央に、LineChart(s)を表示します。少なくとも1と4GridPaneでのJavaFX線グラフの間隔

の最大だから私はこれに似た結果を達成するために、メインパネルの中央にgridpaneの設定について考えた:

Sample Gridpane

私の問題は今、私はLineChartをGridPaneに追加しようとします(.add(chart、0、0)、グラフは親と一致しません)。同じグラフを追加しても同じようになります:

Something like this

私は親のマッチングで多くのものを調べましたが、どういうわけか私はどこにも行きません:/私はボーダーペインの "中心"のサイズを知る必要があります、それに応じてLineChartsのサイズを決めることができました。しかし、私はそれを見つけることはできません...多分あなたの誰かが手がかりを持っていますか?

乾杯!

+0

前記ペインの幅を2分割し、同じ高さでもかまいませんか?クイックグーグルが見つかりました[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にチャートのに、minSizeを設定されています

chart.setMinSize(0, 0); 

あなたが利用可能な領域をサイズならばこれはありますGridPaneがチャートの最小サイズの合計(デフォルトでは0ではない)より小さい場合、チャートは互いに重なり合って描画され始めます。これは必要ではありません。

+0

ありがとうございます、これは私が必要としていたものです!ありがとう! –

+0

グリッドの人口に関するもう1つの質問: グラフを動的に追加/削除したいです(==> .setAllストリーム経由ではありません)。 grid.add(chart、0、0)eg。を使用すると、行/列を指定する必要があります。結果は、左上隅に1つのグラフがある4つの四角形のGridPane分割です。全体的に4つのチャートがあると、すべてが完璧にフィットするので、これはそれ自体が間違っているわけではありません。しかし、1つのグラフでは、グラフは実際にはGridPane全体に表示されます。この権利を得るためには、どのような方法や方法がありますか? (私も.getChildren.addの後に.getChildren.setを付けてみましたが、上記の結果と同じです) –

関連する問題