在 JPanel 中添加 JavaFX 饼图
Adding JavaFX PieChart in JPanel
我想在 JPanel 中添加饼图。我经历了 and this。但这对我没有帮助。
我在调试器中尝试了这段代码,但它没有通过 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);
}
我不确定为什么会这样。请帮助..
感谢任何帮助。
提前致谢...
Swing 和 JavaFX 都是单线程 UI 工具包,每个工具包都有自己的线程来呈现 UI 和处理用户事件。修改 Swing 组件和创建 Swing windows(例如 JFrame
s)必须 在 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;
}
我想在 JPanel 中添加饼图。我经历了
我在调试器中尝试了这段代码,但它没有通过 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);
}
我不确定为什么会这样。请帮助..
感谢任何帮助。 提前致谢...
Swing 和 JavaFX 都是单线程 UI 工具包,每个工具包都有自己的线程来呈现 UI 和处理用户事件。修改 Swing 组件和创建 Swing windows(例如 JFrame
s)必须 在 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;
}