【问题标题】:Adding JavaFX PieChart in JPanel在 JPanel 中添加 JavaFX PieChart
【发布时间】:2021-08-31 14:33:25
【问题描述】:

我想在 JPanel 中添加一个饼图。我经历过thisthis。但这对我没有帮助。

我在调试器中尝试了这段代码,但它没有通过 X 行。不知何故,setScene 函数不起作用,并且面板中看不到饼图。

这是我的代码:

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);

    }

我不确定为什么会这样。请帮忙..

感谢任何帮助。 提前谢谢...

【问题讨论】:

  • “它没有越过 X 行”是什么意思?它是否抛出异常?如果是这样,请发布完整的堆栈跟踪。执行不能无缘无故停止。
  • 这个方法在哪个线程上被调用?其中一部分应该在 FX 应用程序线程上,一部分在 AWT 事件调度线程上。
  • @James_D 时间太长了,什么也没发生,我无法跨步。我认为它以某种方式陷入了无限循环或其他东西..
  • 怎么会陷入死循环?这看起来像一个线程问题。这是在哪个线程上执行的?创建并发布minimal reproducible example
  • @James_D 我提到了stackoverflow.com/questions/37742836/…。但是我没有将它们组合成一个单独的方法来生成饼图,而不是单独的方法。如果有问题请告诉我

标签: java swing javafx jpanel pie-chart


【解决方案1】:

Swing 和 JavaFX 都是单线程 UI 工具包,每个都有自己的线程来呈现 UI 和处理用户事件。修改 Swing 组件和创建 Swing 窗口(例如 JFrames)必须在 AWT 事件调度线程上完成。修改 JavaFX 组件必须在 FX 应用程序线程上完成。

因此,当您同时使用这两个工具包时,您必须小心地将适当的操作委托给适当的线程。 Javadocs for JFXPanel 有更多详细信息。

这是一个完整的示例,其中包括对代码的轻微修改,并展示了如何将代码的不同部分移动到适当的线程:

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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    • 2018-09-25
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多