【问题标题】:JFreeChart CategoryDataset - Axis refresh/repaint problemsJFreeChart CategoryDataset - 轴刷新/重绘问题
【发布时间】:2018-06-14 10:09:33
【问题描述】:

在将 CategoryDataset 的零值设置为非常大的数字后,我在刷新/重新绘制 BarChart 时遇到问题。

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

这是一个零值的图表。

将值设置为一个非常大的数字。

在图表内单击。

如何正确刷新图表?我尝试重新绘制 ChartPanel,但没有成功。

【问题讨论】:

    标签: java swing jfreechart


    【解决方案1】:

    务必event dispatch thread 上构造和操作Swing GUI 对象。此外,覆盖getPreferredSize(),如here 所示,以建立图表的初始大小。在下面的变体中,请注意重复单击 ClearZeroUpdate 按钮如何使图表本身保持不变,同时更新数据集,绘制、范围轴和图例。

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

    【讨论】:

    • 感谢您的回答,显然,这并不能解决我的问题。将您的“更新”机制更改为更大的整数,例如Integer.MAX_VALUE 而不是添加像 10 这样的小数。仅当将零值更新为非常大的数字时才会出现问题。
    • 如果我一开始就明确初始化DefaultCategoryDataset,我会看到整数溢出但没有异常。
    • 整数溢出,当然,如果你添加 Integer.MAX_VALUE 两次。因此,这里是重现的步骤: 1. 启动应用程序 2. “更新”-> 结果:Y 轴向左移动,无法读取刻度标签。您可以将其设置回零(使用“零”按钮,而不是“清除”按钮)并再次更新 -> 发生同样的事情。
    • 我明白了,现在;我不知道为什么会这样; set.addValue(1, "Test", "1") in display() 可能会为您的用例建议一种解决方法。
    猜你喜欢
    • 1970-01-01
    • 2020-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多