gpt4 book ai didi

java - 如何将 JavaFX 与 Java Swing 应用程序集成?

转载 作者:行者123 更新时间:2023-12-02 06:06:09 24 4
gpt4 key购买 nike

我想创建一个扩展 JFXPanel 的类来处理折线图,并将这个 JFXPanel 与我用 Java SE 制作的应用程序集成,我还将数据从我的 JFrame 应用程序实时传递到图表。

这是我的示例代码:

    public class LineChartJFXPanel extends JFXPanel {

private final LineChart<Number,Number> chart;
private final HashMap<String, XYChart.Series<Number,Number>> series;
private final NumberAxis xAxis, yAxis;

public LineChartJFXPanel() {
Platform.setImplicitExit(false);
series = new HashMap<>();
xAxis = new NumberAxis(0.0,10.0,1.0);
yAxis = new NumberAxis(0.0,10.0,1.0);
chart = new LineChart<>(xAxis,yAxis);
setScene(new Scene(chart));
}

public void setSeries(String idSeries, String nameSeries, Number xIni, Number yIni){
XYChart.Series<Number,Number> newSeries = new XYChart.Series<>();
newSeries.setName(nameSeries);
newSeries.getData().add(new XYChart.Data<>(xIni,yIni));
chart.getData().add(newSeries);
series.put(idSeries, newSeries);
}
}

******************************************

public class PanelChart extends JPanel{

LineChartJFXPanel lineChart;

public PanelChart(){
setLayout(new GridLayout(1, 2));
lineChart = new LineChartJFXPanel();
add(lineChart);
}
}


********************************

public class Main extends JFrame{
PanelChart chartPanel;
public Main(){
setPreferredSize(new Dimension(800, 600));
chartPanel = new PanelChart();
getContentPane().add(chartPanel);
setVisible(true);
}

public static void main(String args[]){
Main main = new Main();
main.setVisible(true);
}

}

但是当我运行代码时,它显示以下错误:

Exception in thread "main" java.lang.IllegalStateException: Not on FX application thread; currentThread = main

at com.sun.javafx.tk.Toolkit.checkFxUserThread(Toolkit.java:237)
at com.sun.javafx.tk.quantum.QuantumToolkit.checkFxUserThread(QuantumToolkit.java:400)
at javafx.scene.Scene.<init>(Scene.java:290)
at javafx.scene.Scene.<init>(Scene.java:198)
at javachartdemo.LineChartJFXPanel.<init>(LineChartJFXPanel.java:39)
at javachartdemo.PanelChart.<init>(PanelChart.java:22)
at javachartdemo.Main.<init>(Main.java:21)
at javachartdemo.Main.main(Main.java:27)

我的申请需要更改哪些内容?

最佳答案

错误消息告诉您,您必须在 FX 应用程序线程中运行涉及 JavaFX 的所有内容,因为 JavaFX 不是线程安全的。

为了在该线程上执行某些操作,您可以使用 Platform.runLater

请注意,Swing 也有类似的限制,不同之处在于,没有任何内容会引发异常。相反,你迟早会遇到奇怪的行为。对于 SwingUtilities.invokeLater

关于java - 如何将 JavaFX 与 Java Swing 应用程序集成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22279109/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com