【问题标题】:scenebuilder javafx linechart场景生成器 javafx 折线图
【发布时间】:2015-05-30 22:56:08
【问题描述】:

这就是交易,我正在尝试编写一个在折线图上显示实时数据的 GUI。 到目前为止一切顺利,我可以让折线图工作但不能进入 GUI。

使用scenebuilder,我用折线图对象制作了一个视图,以便将其链接到我生成的图表。但由于某种原因,这似乎不适用于我的 mainApp 中的这段代码。

public void showSes() {
    try {
        // Load the fxml file and set into the center of the main layout
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(MainApp.class.getResource("view/Session.fxml"));

        AnchorPane Session = (AnchorPane) loader.load();
        rootLayout.setCenter(Session);

        SessionController controller = loader.getController();
        controller.setMainApp(this);
        controller.initGraph();

    } catch (IOException e) {
        // Exception gets thrown if the fxml file could not be loaded
        e.printStackTrace();
    }
}

这只是用空折线图显示视图。 我知道图表应该知道,因为我可以用它来创建一个场景,并将其显示到 GUI 中,但是我在 scenebuilder 中创建的视图还有一些我想显示的其他字段......

有人有想法吗?

FXML

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

<?import javafx.scene.text.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.chart.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane prefHeight="900.0" prefWidth="1280.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="gui.view.SessionController">
   <children>
      <Pane prefHeight="900.0" prefWidth="1280.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
         <children>
            <LineChart fx:id="linechart" layoutX="29.0" layoutY="194.0" prefHeight="416.0" prefWidth="1222.0" title="Temperature of session">
              <xAxis>
                <CategoryAxis label="Time (s)" fx:id="xAxis" />
              </xAxis>
              <yAxis>
                <NumberAxis fx:id="yAxis" label="Temperature (°C)" side="LEFT" upperBound="160.0" />
              </yAxis>
            </LineChart>
            <GridPane layoutX="254.0" layoutY="87.0" prefHeight="150.0" prefWidth="771.0">
              <columnConstraints>
                <ColumnConstraints hgrow="SOMETIMES" maxWidth="274.0" minWidth="10.0" prefWidth="274.0" />
                  <ColumnConstraints hgrow="SOMETIMES" maxWidth="273.0" minWidth="10.0" prefWidth="273.0" />
                <ColumnConstraints hgrow="SOMETIMES" maxWidth="273.0" minWidth="10.0" prefWidth="273.0" />
              </columnConstraints>
              <rowConstraints>
                <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
              </rowConstraints>
               <children>
                  <Label prefHeight="53.0" prefWidth="153.0" text="Temperature fluid:" GridPane.halignment="CENTER" GridPane.valignment="TOP">
                     <font>
                        <Font size="16.0" />
                     </font>
                  </Label>
                  <Label prefHeight="52.0" prefWidth="181.0" text="Temperature vapor:" GridPane.columnIndex="2" GridPane.halignment="CENTER" GridPane.valignment="TOP">
                     <font>
                        <Font size="16.0" />
                     </font>
                  </Label>
                  <TextField fx:id="fluidT" editable="false" />
                  <TextField fx:id="gasT" editable="false" GridPane.columnIndex="2" />
               </children>
            </GridPane>
            <Label layoutX="474.0" layoutY="14.0" text="TempTracker">
               <font>
                  <Font size="50.0" />
               </font>
            </Label>
            <TextArea editable="false" layoutX="190.0" layoutY="638.0" prefHeight="160.0" prefWidth="900.0" promptText="&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;------Warning log------- " wrapText="true" />
            <Button layoutX="540.0" layoutY="808.0" mnemonicParsing="false" onAction="#handleStop" prefHeight="65.0" prefWidth="200.0" text="STOP">
               <font>
                  <Font size="22.0" />
               </font>
            </Button>
         </children></Pane>
   </children>
</AnchorPane>

控制器

    private static final int MAX_DATA_POINTS = 50;
    private String xSeriesData = "";
    private XYChart.Series series1;
    private XYChart.Series series2;
    private ExecutorService executor;
    private BlockingQueue<Number> dataQ1 = new ArrayBlockingQueue<Number>(1024);
    private BlockingQueue<Number> dataQ2 = new ArrayBlockingQueue<Number>(1024);

    @FXML
    private CategoryAxis xAxis = new CategoryAxis();
    @FXML
    final NumberAxis yAxis = new NumberAxis();
    @FXML
    final LineChart<String, Number> linechart = new LineChart<String, Number>(xAxis, yAxis);


public void initGraph(){
    xAxis.setAutoRanging(false);

    xAxis.setTickLabelsVisible(false);
    xAxis.setTickMarkVisible(false);

    NumberAxis yAxis = new NumberAxis();
    yAxis.setAutoRanging(true);

    //Graph
    final LineChart<String, Number> lc = new LineChart<String, Number>(xAxis, yAxis){
            @Override 
            protected void dataItemAdded(Series<String, Number> series, int itemIndex, Data<String, Number> item){}
            };
    lc.setAnimated(false);
    lc.setId("liveLineChart");
    lc.setTitle("Animated Line Chart");

    //Graph Series
    series1 = new XYChart.Series<Number, Number>();
    series2 = new XYChart.Series<Number, Number>();
    linechart.getData().addAll(series1, series2);

    series1.setName("T1");
    series2.setName("T2");

    fluidT.setText("0000");
    gasT.setText("0000");

    prepareTimeline();

    Runnable con = new Consumer(this);
    Thread c = new Thread(con);
    c.start();

}

【问题讨论】:

  • 错误出现在您未显示的代码/fxml 中。提供mcve
  • 我更新了一下,我想我得到了所有相关的代码

标签: javafx linechart scenebuilder


【解决方案1】:

不要为@FXML 注入的成员创建新对象

永远不要将new@FXML 结合使用,即永远不要写:

@FXML 
private CategoryAxis xAxis = new CategoryAxis();

相反,只需写:

@FXML 
private CategoryAxis xAxis;

FXMLLoader 将自动为 FXML 文件中的每个元素生成(即创建)一个新对象,并将对该对象的引用注入到您提供 @FXML 注释的控制器中。因此,如果您将@FXML 成员引用重置为您在控制器中创建的新对象,那么该对象与加载程序创建的对象之间将没有关联。

此外,不要在您的 initGraph() 函数中创建 另一个 新 LineChart。您已经有一个由 FXMLLoader 创建的 LineChart,只需引用它即可。 NumberAxis 和您使用 @FXML 注入的其他元素也是如此。

如果您使用 @FXML 注释,请同时使用 &lt;fx:id&gt;

你有:

@FXML
private CategoryAxis xAxis;

所以在你的 fxml 中,你应该定义:

<xAxis fx:id="xAxis">

否则,FXMLLoader 将无法注入对您在 FXML 中定义的轴的引用。

一边

您的代码中可能还有其他错误(例如,关于并发和线程)。所以以上可能不是你所有的错误。通常,在创建 mcve 时,请尝试消除与手头问题无关的任何内容(例如 FXML 的线程代码和非折线图部分),但包括有人可以用来复制和粘贴您的代码的所有内容编译并运行它以复制您的问题。

注意:Ensemble 示例应用程序包含一个示例程序,它根据音频频谱输入数据实时更新图形。

【讨论】:

  • 嗯,你确实修复了连接,但图表仍然没有实时显示。只有当我只将图形设置为场景时才会这样做。任何想法?不能真正提供我完整的复制源代码,因为它是基于 arduino yun 生成的输入......你可以尝试使用随机数据,但由于它自己的图表,我想问题不存在跨度>
  • 我认为(希望)您的原始问题(将程序中的一些数据添加到您在 SceneBuilder 中定义的图形中)已得到解答。您可以提出有关实时更新图形数据的新问题。如果您创建一个新问题,请提供一个 mcve,不需要或不需要完整的源代码 - 只提供复制该问题的最少的可执行代码。真正尝试将您的线程代码和您的 JavaFX UI 相关代码分开 - 我想不出任何人会产生新线程并在 JavaFX 控制器中声明 BlockingQueues 的充分理由。
猜你喜欢
  • 2015-06-10
  • 2017-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-26
  • 2015-07-18
  • 1970-01-01
相关资源
最近更新 更多