JFreeChart CategoryDataset-轴刷新/重绘问题 [英] JFreeChart CategoryDataset - Axis refresh/repaint problems
问题描述
在将CategoryDataset的零值设置为非常大的数字后,刷新或重新绘制BarChart时遇到问题.
I'm having issues with refreshing/repainting a BarChart after setting a zero value of a CategoryDataset to a very large number.
private class Test
extends ApplicationFrame {
private DefaultCategoryDataset set;
public Test(
String newTitle) {
super(newTitle);
set = new DefaultCategoryDataset();
set.addValue(0, "Test", "1");
JFreeChart barChart = ChartFactory.createBarChart(
"Test",
"Category",
"Score",
set,
PlotOrientation.VERTICAL,
true,
true,
false);
JPanel mainPanel = new JPanel(new GridLayout());
ChartPanel chartPanel = new ChartPanel(barChart);
chartPanel.setPreferredSize(new java.awt.Dimension(560, 367));
mainPanel.add(chartPanel);
JButton b = new JButton();
createDataset();
b.addActionListener(e -> {
set.setValue(Integer.MAX_VALUE, "Test", "1");
});
mainPanel.add(b);
setContentPane(mainPanel);
pack();
setVisible(true);
}
这是图表的零值.
将值设置为非常大的数字.
Setting the value to a very large number.
在图表内单击.
如何正确刷新图表?我试图重新绘制ChartPanel,但是没有用.
How can the chart be properly refreshed? I've tried to repaint the ChartPanel, but it hasn't worked.
推荐答案
请确保在getPreferredSize()
(如此处所示)以建立图表的初始大小.在下面的变体中,请注意在重复更新数据集时,如何在 Clear , Zero 和 Update 按钮上反复单击,从而使图表本身保持不变. ,范围轴和图例.
Be sure to construct and manipulate Swing GUI objects only on the event dispatch thread. In addition, override getPreferredSize()
, as shown here, to establish the chart's initial size. In the variation below, note how repeated clicks on the Clear, Zero and Update buttons leave the chart itself unchanged, while updating the dataset, plot, range axis and legend.
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;
/**
* @see https://stackoverflow.com/q/50854965/230513
*/
public class Test {
private final DefaultCategoryDataset set = new DefaultCategoryDataset();
private int i;
private void display() {
JFrame f = new JFrame("Test");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
set.addValue(0, "Test", "1");
JFreeChart barChart = ChartFactory.createBarChart(
"Test", "Category", "Score", set,
PlotOrientation.VERTICAL, true, true, false);
JPanel mainPanel = new JPanel(new BorderLayout());
mainPanel.add(new ChartPanel(barChart) {
@Override
public Dimension getPreferredSize() {
return new Dimension(567, 345);
}
});
JPanel p = new JPanel();
p.add(new JButton(new AbstractAction("Clear") {
@Override
public void actionPerformed(ActionEvent e) {
set.clear();
i = 0;
}
}));
p.add(new JButton(new AbstractAction("Zero") {
@Override
public void actionPerformed(ActionEvent e) {
set.setValue(0, "Test", "1");
i = 0;
}
}));
p.add(new JButton(new AbstractAction("Update") {
@Override
public void actionPerformed(ActionEvent e) {
set.setValue(i += 10, "Test", "1");
}
}));
mainPanel.add(p, BorderLayout.SOUTH);
f.add(mainPanel);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Test()::display);
}
}
这篇关于JFreeChart CategoryDataset-轴刷新/重绘问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!