JavaFXML + Scenebuilder: LineChart не показывает значения - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть RootStage с MenuItem с, и я хочу установить центр моей Rootstage на AnchorPane с LineChart в середине.

Диаграмма получила CategoryAxis по оси X и NumberAxis по оси Y.

Но теперь, если я вызываю контроллер для Scene с LineChart на нем, я вижу LineChart, но у него нет значений. Или, по крайней мере, не показывает их.

Почему LineChart не заполняется?

Или почему не отображаются значения?

MainController.class

public class MainController extends Application {

    private Stage primaryStage;
    private BorderPane rootLayout;

    @FXML
    private MenuBar menuBar;

    @FXML
    private Menu menuAnsicht, menuOptionen;

    @FXML
    private MenuItem menuItemTag, menuItemWoche, menuItemAbout, menuItemCloseWindow;

    @Override
    public void init() {
    }

    @Override
    public void start(Stage primaryStage) {
        this.primaryStage = primaryStage;

        initRootLayout();
    }

    private void initRootLayout() {
        try {
            FXMLLoader loader = new FXMLLoader();
            loader.setLocation(getClass().getResource("/de/mgo/temperaturstatistics/view/RootLayout.fxml"));
            rootLayout = (BorderPane) loader.load();
            Scene scene = new Scene(rootLayout);
            primaryStage.setScene(scene);
            primaryStage.show();
        } catch (Exception e) {
            logger.debug("ERROR: " + e.getMessage());
            e.printStackTrace();
        }
    }

    @FXML
    public void handleTagItem(ActionEvent event) {
        try {
            BorderPane nowLayout = (BorderPane) menuBar.getScene().getRoot();
            FXMLLoader loader = new FXMLLoader();
            loader.setLocation(getClass().getResource("/de/mgo/temperaturstatistics/view/DailyScene.fxml"));
            nowLayout.setCenter(loader.load());
        } catch (Exception e) {
            logger.debug("ERROR: " + e.getMessage());
            e.printStackTrace();
        }
    }

DailySceneController.class

public class DailySceneController extends Application {

    @FXML
    private Label titleDaily;

    @FXML
    private LineChart<String, Number> dailyChart;

    @FXML
    private CategoryAxis xDaily;

    @FXML
    private NumberAxis yDaily;

    public int count = 0;

    public DailySceneController() {
        count++;
        System.out.println(count);
    }

    @Override
    public void init() {
        this.setChartDaily();
    }

    @Override
    public void start(Stage primaryStage) {

    }

    public void setChartDaily() {

        LocalDate localDate = LocalDate.now().minusDays(0);

        List<Temperaturen> listeNodemcu_JHL = MainController.getListeNodemcu_JHL();

        this.xDaily.setAutoRanging(false);
        this.yDaily.setAutoRanging(false);

        this.dailyChart.setAnimated(false);

        XYChart.Series<String, Number> seriesJHL = new XYChart.Series<String, Number>();
        seriesJHL.setName("Nodemcu_JHL");

        seriesJHL.getData().add(new XYChart.Data<String, Number>("Test", 15));
        this.dailyChart.getData().add(seriesJHL);
    }
}

DailyScene.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?package de.mgo.temperaturstatistics.controller.Controller?>
<?import javafx.scene.chart.CategoryAxis?>
<?import javafx.scene.chart.LineChart?>
<?import javafx.scene.chart.NumberAxis?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.text.Font?>


<BorderPane xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.mgo.temperaturstatistics.view.DailySceneController">
   <top>
      <Label fx:id="titleDaily" text="Temperatur-Statistik Tagesansicht" BorderPane.alignment="CENTER">
         <font>
            <Font name="System Bold" size="18.0" />
         </font>
      </Label>
   </top>
   <center>
      <LineChart fx:id="dailyChart" prefHeight="300.0" prefWidth="500.0" BorderPane.alignment="CENTER">
        <xAxis>
          <CategoryAxis fx:id="xDaily" animated="false" label="Uhrzeit" side="BOTTOM" />
        </xAxis>
        <yAxis>
          <NumberAxis fx:id="yDaily" animated="false" autoRanging="false" label="Temperatur" lowerBound="10.0" side="LEFT" tickLabelGap="1.0" tickUnit="1.0" upperBound="30.0" />
        </yAxis>
      </LineChart>
   </center>
</BorderPane>

1 Ответ

0 голосов
/ 12 ноября 2018

Вы расширяете Application своим классом контроллера, ожидая, что для него будут вызваны методы жизненного цикла. Это плохая практика, которая также не приводит к вызову методов жизненного цикла.

Если вы хотите, чтобы метод вызывался, используйте Initializable.initialize или просто метод initialize без параметров:

@FXML
private void initialize() {
    this.setChartDaily();
}
...