【发布时间】:2018-05-05 01:01:15
【问题描述】:
我有一个JFrame,在这个框架中有一个JPanel,在一个JPanel中有一个JFreeChart(图表从方法中获取数据集),这个图表被添加到在JPanel中创建的ChartPanel,然后ChartPanel被添加到JPanel。此外,我在 JPanel 中有 JComboBox,如果我更改该 JComboBox 中的选项,则 ActionListener 会更新数据集的值。同样返回数据集的方法,从 JComboBox 中获取一个字符串(数据集的数据取决于 JComboBox 输出)。因此,如果我更改 JComboBox 中的选项,我想用新数据集更新 JFreeChart 并将其显示在屏幕上。我知道我需要在那个 ActionListener 中添加代码,但我不应该在那里添加什么,是否有任何方法可以更新已经创建的 JFreeChart?
private class PanelChart extends JPanel { {
this.setLayout(new BorderLayout());
// Create Dataset
//method GUIImplementation.GetDataForChart takes as an input value of combobox
CategoryDataset dataset = GUIImplementation.GetDataForChart(comboBoxCrimeTypeChart.getSelectedItem().toString());
//Create chart
JFreeChart crimeNumberBarChart = ChartFactory.createBarChart(
"Number of crimes by type", //Chart Title
"Fallen within", // Category axis
"Number of crimes", // Value axis
dataset,
PlotOrientation.VERTICAL,
true,true,false
);
ChartPanel panelCrimeNumberBarChart = new ChartPanel(crimeNumberBarChart);
this.add(panelCrimeNumberBarChart, BorderLayout.CENTER);
PanelChartSouth panelChartSouth = new PanelChartSouth(); //there is a combobox
this.add(panelChartSouth, BorderLayout.SOUTH);
}}
private class ChartButtonListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource() == backChart) {
SizeAndTitleSetter(0);
SwapPanelChart(0);
} else if(e.getSource() == comboBoxCrimeTypeChart) { //comboBoxCrimeTypeChart is a JComboBox from PanelChartSouth
String crimeType = comboBoxCrimeTypeChart.getSelectedItem().toString();
System.out.println(crimeType);
dataset = GUIImplementation.GetDataForChart(crimeType); // dataset updated
}
}
}
到目前为止,我只是通过从 JFrame 中删除 PanelChart 然后创建新的 PanelChart 并将其添加到 JFrame 并使用重新绘制和重新验证来设法以某种方式更新该图表。如果我在 JComboBox 中更改了一次选项,它会起作用,在第二次更改后一切都开始在屏幕上停止,旧图表不想消失并且新图表在它下面,如果我调整屏幕大小我可以看到它。
【问题讨论】:
标签: java swing jfreechart