scenebuilder javafx线条图

scenebuilder javafx线条图,javafx,linechart,scenebuilder,Javafx,Linechart,Scenebuilder,所以这里的交易,我试图编码一个图形用户界面,显示实时数据的折线图。 到目前为止还不错,我可以让折线图工作,但不能进入GUI 使用scenebuilder,我创建了一个带有折线图对象的视图,以便将其链接到生成的图表。但由于某些原因,这似乎不适用于我的mainApp中的此代码 public void showSes() { try { // Load the fxml file and set into the center of the main layout

所以这里的交易,我试图编码一个图形用户界面,显示实时数据的折线图。 到目前为止还不错,我可以让折线图工作,但不能进入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


控制器

    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();

}
private static final int MAX_DATA_POINTS=50;
私有字符串xSeriesData=“”;
私有XYChart系列1;
私有XYChart系列2;
私人遗嘱执行人;
private BlockingQueue dataQ1=新的ArrayBlockingQueue(1024);
private BlockingQueue dataQ2=新的ArrayBlockingQueue(1024);
@FXML
私有CategoryAxis xAxis=新CategoryAxis();
@FXML
最终数字axis yAxis=新数字axis();
@FXML
最终线形图线形图=新线形图(xAxis,yAxis);
公共void initGraph(){
xAxis.setAutoRanging(假);
xAxis.setTickLabelsVisible(假);
xAxis.setTickMarkVisible(false);
NumberAxis yAxis=新的NumberAxis();
yAxis.setAutoRanging(真);
//图表
最终线形图lc=新线形图(xAxis,yAxis){
@凌驾
已添加受保护的无效dataItemAdded(Series系列、int itemIndex、数据项){}
};
立法会第二题(错);;
lc.setId(“liveLineChart”);
立法会:setTitle(“动画折线图”);
//图形系列
series1=新的XYChart.Series();
series2=新的XYChart.Series();
linechart.getData().addAll(系列1、系列2);
系列1.集合名(“T1”);
序列2.集合名(“T2”);
fluidT.setText(“0000”);
加斯特·塞特克斯(“0000”);
制备美林();
Runnable con=新消费者(本);
螺纹c=新螺纹(con);
c、 start();
}
不要为@FXML注入成员创建新对象

切勿将
new
@FXML
结合使用,即切勿写入:

@FXML 
private CategoryAxis xAxis = new CategoryAxis();
相反,只需写下:

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

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

如果使用
@FXML
注释,也可以使用

你有:

@FXML
private CategoryAxis xAxis;
因此,在fxml中,您应该定义:

<xAxis fx:id="xAxis">

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

旁白

您的代码中可能存在其他错误(例如,并发和线程)。所以以上可能不是你所有的错误。一般来说,在创建mcve时,尽量消除与当前问题无关的任何内容(例如,FXML的线程代码和非线形图部分),但应包括有人可以用来复制和粘贴代码以编译和运行代码以复制问题的所有内容


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

错误在代码/fxml中,您没有显示。提供一个。我更新了一点,我想我在ithmm中得到了所有相关的代码,嗯,你确实修复了连接,但是图形仍然不能实时显示。仅当我仅将图形设置为场景时,它才会这样做。有什么想法吗?无法给出复制的完整源代码,因为它是基于arduino程序生成的输入。。。您可以尝试使用随机数据,但由于它自己的图形工作,我想问题不在这里。我想(希望)您最初的问题(在程序中向您在SceneBuilder中定义的图形中添加一些数据)得到了回答。您可以提出一个关于实时更新图形数据的新问题。如果您创建了一个新问题,请提供一个mcve,不需要或不需要完整的源代码-只提供复制该问题的最小可执行代码。真正尝试将线程代码和JavaFXUI相关代码分开——我想不出有什么好的理由让任何人在JavaFX控制器中产生新线程并声明阻塞队列。
<xAxis fx:id="xAxis">