【问题标题】:How to integrate JavaFX with Java Swing application?如何将 JavaFX 与 Java Swing 应用程序集成?
【发布时间】:2014-04-12 07:31:04
【问题描述】:

我想创建一个扩展 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)

我需要在我的应用程序中进行哪些更改?

【问题讨论】:

  • 我不确定你是否可以,因为 UI 环境是由 JavaME - AFAIK 定义的
  • "如何将 javafx 与 java me 集成?" Java ME?这适用于手机,而JFrame 是 Java SE(适用于台式计算机)。你指的是哪个? “请帮帮我!!!” 别再对我们大喊大叫了!键..
  • @MadProgrammer 虽然标题提到了我,但正文指的是 SE 和 JFrame。最令人困惑..
  • @AndrewThompson 它也被标记为 Swing :P

标签: java swing javafx javafx-2


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    场景对象和 JFXPanel.setScene 调用需要在 JavaFX 应用程序线程上发生,如下所示:

    Platform.runLater(() -> {
      setScene(new Scene(chart));
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-12
      • 2011-04-20
      • 1970-01-01
      • 2010-11-23
      • 2016-08-25
      • 1970-01-01
      • 2016-08-26
      • 1970-01-01
      相关资源
      最近更新 更多