繁体   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