2017-02-13 5 views
0

Итак, сейчас я пытаюсь написать программу для отображения данных в JavaFX LineCharts. Моя основная панель - это BorderPane с некоторыми функциями сверху/влево/вправо/и т. Д. В центре панели. Я хочу отобразить LineChart (s). По крайней мере, 1 и максимум 4.Интервал JavaFX LineCharts в GridPane

Так я думал о настройке gridpane в центре главной панели, чтобы достичь результата, похожее на это:

Sample Gridpane

Моя проблема теперь, когда Я пытаюсь добавить LineCharts к GridPane (с .add (chart, 0, 0), диаграмма просто не совпадает с родительским. То же самое, если я продолжу добавлять дополнительные диаграммы. Оказывается, это примерно так:

Something like this

Я искал много материала по сопоставлению с родителями, но почему-то я никуда не денусь:/Мне нужно знать размер «центра» пограничной области, тогда я мог бы соответствующим образом разделить LineCharts. Но я не могу найти его ... может быть, у кого-то из вас есть ключ?

Cheers!

+0

Не могли бы вы получить ширину указанной панели, разделите ее на две части и сделать то же самое с высотой? Быстрый google нашел [это] (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 (chart, 0, 0), например, я должен указать строку/столбец, поэтому результатом является разделение GridPane на четыре квадрата с одной диаграммой в верхнем левом углу. Это не так само по себе, потому что все идеально подходит, когда у меня всего 4 диаграммы. Но с одной диаграммой диаграмма должна отображаться на всей панели GridPane. Какой способ/методы вы рекомендуете, чтобы получить это право? (Я также пробовал .getChildren.add, а затем .getChildren.set, но тот же результат, что и выше) –

Смежные вопросы