簡體   English   中英

在JPanel中添加JavaFX PieChart

[英]Adding JavaFX PieChart in JPanel

我想在 JPanel 中添加一個餅圖。 我經歷了這個這個 但這對我沒有幫助。

我在調試器中嘗試了這段代碼,但它沒有通過 X 行。不知何故setScene function 不起作用,並且面板中看不到餅圖。

這是我的代碼:

private void add_pie_chart(JPanel panel)
    {
    JFXPanel dataPanel = new JFXPanel();
    
    PieChart pieChart = new PieChart();

    ObservableList<PieChart.Data> data= FXCollections.observableArrayList(
            new PieChart.Data("test1", 25),
            new PieChart.Data("test 2", 25),
            new PieChart.Data("test 3", 25),
            new PieChart.Data("test 4", 25)
        );
    pieChart.setData(data);
    pieChart.setTitle("test");
    pieChart.setLabelsVisible(true);

    Group root = new Group();

    root.getChildren().add(pieChart);
    
    Scene scene = new Scene(root);
    dataPanel.setScene(scene);   //line X
    //not getting executing

    panel.add(dataPanel, BorderLayout.CENTER);
    panel.setVisible(true);

    }

我不確定為什么會這樣。 請幫忙..

任何幫助表示贊賞。 提前致謝...

Swing 和 JavaFX 都是單線程 UI 工具包,每個都有自己的線程來渲染 UI 和處理用戶事件。 Modifying Swing components and creating Swing windows (eg JFrame s) must be done on the AWT event dispatch thread. 修改 JavaFX 組件必須在 FX 應用程序線程上完成。

因此,當您同時使用這兩個工具包時,您必須小心地將適當的操作委托給適當的線程。 JFXPanel的 Javadocs有更多詳細信息。

這是一個完整的示例,其中包括對代碼的輕微修改,並顯示了如何將代碼的不同部分移動到適當的線程:

package org.jamesd.examples.piechartswing;

import java.awt.BorderLayout;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

import javafx.application.Platform;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.embed.swing.JFXPanel;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.chart.PieChart;


public class App  {

    public void startUI() {
        JFrame frame = new JFrame();
        JFXPanel fxPanel = new JFXPanel();
        Platform.runLater(() -> createChart(fxPanel));
        
        JPanel panel = new JPanel();
        panel.setLayout(new BorderLayout());
        panel.add(fxPanel, BorderLayout.CENTER);
        
        frame.add(panel);
        frame.setSize(600,  600);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
    
    private void createChart(JFXPanel dataPanel) {
        PieChart pieChart = new PieChart();

        ObservableList<PieChart.Data> data= FXCollections.observableArrayList(
                new PieChart.Data("test1", 25),
                new PieChart.Data("test 2", 25),
                new PieChart.Data("test 3", 25),
                new PieChart.Data("test 4", 25)
            );
        pieChart.setData(data);
        pieChart.setTitle("test");
        pieChart.setLabelsVisible(true);

        Group root = new Group();

        root.getChildren().add(pieChart);
        
        Scene scene = new Scene(root);
        dataPanel.setScene(scene); 
    }

    public static void main(String[] args) {
        App app = new App();
        SwingUtilities.invokeLater(app::startUI);
    }

}

對於完整性, module-info.java

module org.jamesd.examples.piechartswing {
    requires javafx.controls;
    requires java.desktop ;
    requires javafx.swing ;
    exports org.jamesd.examples.piechartswing;
}

暫無
暫無

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

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