簡體   English   中英

如何將JavaFX與Java Swing應用程序集成?

[英]How to integrate JavaFX with Java Swing application?

我想創建一個擴展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

Scene對象和JFXPanel.setScene的調用需要在JavaFX應用程序線程上發生,如下所示:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM