Могу ли я включить линейную диаграмму JavaFX в графический интерфейс JavaFX?

Я хотел бы объявить JavaFX GridPane из двух панелей, левая из которых содержит кнопку. При нажатии кнопки на правой панели отображается линейная диаграмма. Предположительно, кодировка будет выглядеть так:

public class FormLineChart extends Application {

    @Override 
    public void start(Stage stage) {
        stage.setTitle("A Title");
        //Create the grid for defining the GUI
        GridPane grid = new GridPane();
        // add gui objects to grid
        ...
        //Create the chart
        final LineChart<Number, Number> lineChart = new LineChart<>(xAxis, yAxis);
        ...
        // Create the series and display the lineChart
        lineChart.getData().add(series);
        stage.setScene(scene);

        Scene scene = new Scene(grid, 427, 319);
        //How do we add 'lineChart' to scene as well as keeping 'grid'?
        stage.setScene(scene);
        stage.show();
    }

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

В частности, можно ли объединить «сетку» и «линейную диаграмму» в одну сцену? На данный момент отображается только графический интерфейс, потому что он принудительно устанавливает сцену в сетку.


person Rusty    schedule 24.01.2017    source источник
comment
Поместите линейную диаграмму и сетку в другую панель (какую-нибудь) и сделайте эту панель корнем сцены. Или просто добавьте линейный график в соответствующее место в сетке при нажатии кнопки.   -  person James_D    schedule 24.01.2017
comment
На самом деле это так же просто, как grid.add(lineChart, 0,1);. Вы можете просто добавить свой lineChart прямо в сетку   -  person Enigo    schedule 24.01.2017


Ответы (1)


Как сказал @James_D, для этого вам просто нужен другой контейнер. Pane может содержать элементы управления графическим интерфейсом, а также другой Pane.

В приведенном ниже примере я поместил GridPane с несколькими кнопками внутри BorderPane, который делит окно на правую и левую части.

@Override
public void start(Stage stage) {
    stage.setTitle("A Title");

    // Root element
    BorderPane root = new BorderPane();

    // GridPane
    GridPane grid = new GridPane();
    grid.setPadding(new Insets(10,10,10,10));
    grid.setVgap(10);
    grid.add(new Button("Button 1"), 0, 0);
    grid.add(new Button("Button 2"), 0, 1);
    grid.add(new Button("Button 3"), 0, 2);

    // Chart
    final NumberAxis xAxis = new NumberAxis();
    final NumberAxis yAxis = new NumberAxis();
    final LineChart<Number, Number> lineChart = new LineChart<>(xAxis, yAxis);
    XYChart.Series series = new XYChart.Series();
    series.setName("Chart");
    series.getData().add(new XYChart.Data(1, 5));
    series.getData().add(new XYChart.Data(2, 10));
    lineChart.getData().add(series);

    root.setLeft(grid);
    root.setRight(lineChart);

    Scene scene = new Scene(root, 600, 300);

    stage.setScene(scene);
    stage.show();
}
person Dth    schedule 24.01.2017
comment
Спасибо. Работает отлично. Я не понимал, как можно использовать «root» для достижения того, что мне нужно, теперь все ясно. - person Rusty; 25.01.2017