Java 将JFreeChart添加到JPanel
我正在创建一个swing应用程序,希望将JfreeChart添加到Jpanel。我创建了一个方法,在该方法中创建了图表,如下所示:Java 将JFreeChart添加到JPanel,java,swing,jpanel,jfreechart,Java,Swing,Jpanel,Jfreechart,我正在创建一个swing应用程序,希望将JfreeChart添加到Jpanel。我创建了一个方法,在该方法中创建了图表,如下所示: JButton btnReporting = new JButton("Reporting"); btnReporting.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) {
JButton btnReporting = new JButton("Reporting");
btnReporting.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
createChart();
}
});
已创建全局变量:
JFreeChart chart;
创建图表的方法:
public void createChart(){
XYSeries series = new XYSeries("XYGraph");
series.add(1, 1);
series.add(1, 2);
series.add(2, 1);
series.add(3, 9);
series.add(4, 10);
// Add the series to your data set
XYSeriesCollection dataset = new XYSeriesCollection();
dataset.addSeries(series);
// Generate the graph
chart = ChartFactory.createXYLineChart(
"XY Chart", // Title
"x-axis", // x-axis Label
"y-axis", // y-axis Label
dataset, // Dataset
PlotOrientation.VERTICAL, // Plot Orientation
true, // Show Legend
true, // Use tooltips
false // Configure chart to generate URLs?
);
}
然后,我创建了ChartPanel并将其添加到附加到JFrame的JPanel中:
JPanel reporting = new JPanel();
ChartPanel CP = new ChartPanel(chart);
reporting.add(CP,BorderLayout.CENTER);
reporting.validate();
reporting.setBounds(47, 59, 921, 439);
frame.getContentPane().add(reporting);
reporting.setLayout(new BorderLayout(0, 0));
我还创建了一个按钮,其中包含一个操作侦听器,我在其中调用该方法,如下所示:
JButton btnReporting = new JButton("Reporting");
btnReporting.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
createChart();
}
});
由于某些原因,当我单击按钮时,图表没有显示。大量上下文之外的代码不便于准确理解您正在做的事情,但类似于 首先,您需要从UI中删除以前显示的任何内容,否则您将在屏幕上显示多个图表,这可能会导致其他问题 接下来,当您创建图表时,您需要实际添加到屏幕上。它不会仅仅因为你创建了一个新的图表就“神奇地”更新
// import free chart classes
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
private JPanel reportingPane;
public TestPane() {
setLayout(new BorderLayout());
reportingPane = new JPanel(new BorderLayout());
JButton btnReporting = new JButton("Reporting");
btnReporting.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
JFreeChart chart = createChart();
reportingPane.removeAll();
reportingPane.add(new ChartPanel(chart));
revalidate();
repaint();
}
});
add(reportingPane);
add(btnReporting, BorderLayout.SOUTH);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
g2d.dispose();
}
}
public JFreeChart createChart() {
XYSeries series = new XYSeries("XYGraph");
series.add(1, 1);
series.add(1, 2);
series.add(2, 1);
series.add(3, 9);
series.add(4, 10);
// Add the series to your data set
XYSeriesCollection dataset = new XYSeriesCollection();
dataset.addSeries(series);
// Generate the graph
JFreeChart chart = ChartFactory.createXYLineChart(
"XY Chart", // Title
"x-axis", // x-axis Label
"y-axis", // y-axis Label
dataset, // Dataset
PlotOrientation.VERTICAL, // Plot Orientation
true, // Show Legend
true, // Use tooltips
false // Configure chart to generate URLs?
);
return chart;
}
}
至少应该演示一下基本概念…createChart()使用的是局部,而不是全局。无论如何,使用全局搜索引擎不是一个好主意。您应该只使用createChart()返回它正在制作的图表。您还应该1-确保从框架中删除上一个图表,2-在框架上调用
revalidate
和repaint
,以更新UI。@Appak我已经编辑了我的问题,并确保图表
是全局图表,但它仍然没有显示。@MadProgrammer你是什么意思是否删除以前的图表?我只有一个?你的意思是revalidate
和repaint
JPanel吗?另一条评论是,我在更新图表时经常使用JFreeChart,但我从未替换过整个图表,我不知道你为什么不应该这样做。我只需要修改几个系列,因此我保留了对XYSeriesCollection
的引用,并更改了其中加载的XYSeries
。修改后会触发数据更改事件,因此我不需要调用repaint()。您的意思是新建图表面板(图表)
?在哪里?我不是这样做的吗?