Update normal distribution graph using JTextField in JFreeChart

时间:2016-10-20 20:10:29

标签: java swing events jpanel jfreechart

I have a class that extends JPanel for JFreeChart. Inside of setMean(), I tried updating values of dataset or just the Function2D, but nothing changes on the graph even with repaint().

    public class JFreeChartPanel extends JPanel {
        Function2D normal = new NormalDistributionFunction2D(0.0, 3.0);
        XYDataset dataset = DatasetUtilities.sampleFunction2D(normal, -5.0, 5.0, 100, "Normal");

        double mean = 0.0, std = 1.0;

        public double getMean() {
            return mean;
        }

        public void setMean(double mean) {
            this.mean = mean;
            normal = new NormalDistributionFunction2D(mean,std);
            dataset = DatasetUtilities.sampleFunction2D(normal, -5.0, 5.0, 100, "Normal");
            repaint();
        }

        public double getStd() {
            return std;
        }

        public void setStd(double std) {
            this.std = std;
        }

        public JFreeChartPanel(){        

            JFreeChart chart = ChartFactory.createXYLineChart(
                "Normal Distribution",
                "X", 
                "Y", 
                dataset,
                PlotOrientation.VERTICAL,
                true,
                true,
                false
            );


            final ChartPanel chartPanel = new ChartPanel(chart);
            setLayout(new BorderLayout());
            add(chartPanel);
        }
}

And this is executed everytime I change the value in my JTextField.

public void updateMean()
    {
        String meanS = mean.getText();
        double mean = 0.0;
        try{
            mean = Double.parseDouble(meanS);
            System.out.println("Mean: "+mean);
            jFreeChartPanel.setMean(mean);
        }catch(Exception e){
            System.out.println("Mean: incorrect input");
        }
    }

1 个答案:

答案 0 :(得分:4)

通常,您只需更新用于创建XYDataset的{​​{1}},并且听取图表会自行更新。作为@Hovercraft notes,仅JFreeChart不足以告诉图表您已替换数据集的情节。在下面的示例中,我重构了数据集的初始化并将其作为参数传递给repaint()

setDataset()

请参阅相关的source以检查事件接线。添加到public void setMean(double mean) { this.mean = mean; plot.setDataset(initDataset()); } 的{​​{1}}可能比ChangeListener更容易操作。

image

JSpinner