Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JFreeChart:从另一个类接收新值时更新/重新绘制折线图_Java_Jfreechart - Fatal编程技术网

Java JFreeChart:从另一个类接收新值时更新/重新绘制折线图

Java JFreeChart:从另一个类接收新值时更新/重新绘制折线图,java,jfreechart,Java,Jfreechart,这只是我的第二篇文章,如果我没有正确遵守规则,请原谅我。我正在尝试自动更新一个使用JFreeChart库创建的折线图。我已经尝试了几天了,并且参考了很多例子,并且 我有一个方法可以获取帐户余额并将其发送到另一个类: public double credit(double d) { int bonus = 10; if (d >= 500){ logData = "CREDITED: + £" + df.format(d) + "\n **********

这只是我的第二篇文章,如果我没有正确遵守规则,请原谅我。我正在尝试自动更新一个使用JFreeChart库创建的折线图。我已经尝试了几天了,并且参考了很多例子,并且

我有一个方法可以获取帐户余额并将其发送到另一个类:

public double credit(double d) 
{
    int bonus = 10;
    if (d >= 500){
        logData = "CREDITED: + £" + df.format(d) + "\n ********** Whohoo a £10.00 bonus has been added to your balance for depositing at least £500 in a single month **********\n";
        currentBalance = currentBalance + d + bonus;
        draw.passBalance(currentBalance);
        draw.paint(currentBalance); //Send balance to Draw class for the graph (CPB)
    } else {
        logData = "CREDITED: + £" + df.format(d) + "\n";
        currentBalance = currentBalance + d;
    } 
    return currentBalance;
}
接收该数据的类处理图形的数据:

public class Draw extends ApplicationFrame {

private double balance;
private ChartPanel chartPanel;
private JFreeChart chart;
private XYDataset dataset;
private Draw graph;

    public Draw(final String title) {

        super(title);

        dataset = createDataset();
        chart = createChart(dataset);
        chartPanel = new ChartPanel(chart);
        chartPanel.setPreferredSize(new Dimension(750, 350));
        setContentPane(chartPanel);
    }

    private XYDataset createDataset() {

        final XYSeries series1 = new XYSeries("Balance");
        series1.add(1.0, balance);
        series1.add(2.0, balance);
        series1.add(3.0, 100.00);
        series1.add(4.0, 100.00);
        series1.add(5.0, 100.00);
        series1.add(6.0, 100.00);
        series1.add(7.0, 100.00);
        series1.add(8.0, 100.00);
        series1.add(9.0, 100.00);
        series1.add(10.0, 100.00);
        series1.add(11.0, 100.00);
        series1.add(12.0, 100.00);

        System.out.println(balance);

        final XYSeriesCollection dataset = new XYSeriesCollection();
        dataset.addSeries(series1);

        return dataset;
    }

    private JFreeChart createChart(final XYDataset dataset) {

      // create the chart...
      final JFreeChart chart = ChartFactory.createXYLineChart(
            "Account Balance", // chart title
            "Month", // x axis label
            "Balance", // y axis label
            dataset, // data
            PlotOrientation.VERTICAL,
            false, // include legend
            true, // tooltips
            false // urls
    );


      chart.setBackgroundPaint(Color.white);

      final XYPlot plot = chart.getXYPlot();
      plot.setBackgroundPaint(Color.white);
      plot.setDomainGridlinePaint(Color.lightGray);
      plot.setRangeGridlinePaint(Color.lightGray);

      final XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer();
      renderer.setSeriesLinesVisible(1, true);
      plot.setRenderer(renderer);

      return chart;

  }

    public double passBalance(double d)
    {
     return balance = d;
    }

    public void paint(double d)
    {   
        //System.out.println(balance);
        createDataset();

    }
}
我的理解是,图表将被重新绘制,因为所有方法都会抛出一个SeriesChangeEvent,但情况似乎并非如此

我对Java比较陌生,非常感谢您的帮助


感谢

为了帮助隔离问题,我将您的代码简化为一个,用于更新
XYSeriesCollection
XYSeriesCollection
中的单个
XYDataItem
。请注意,每个
XYDataItem
封装了
Number
的两个实例;根据XYSeries的要求,每个都是可比的<代码>添加(双x,双y)将每个值转换为
double
。单击“更新”按钮查看效果。项目
索引
每次单击应增加5

导入java.awt.BorderLayout;
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.event.ActionEvent;
导入javax.swing.AbstractAction;
导入javax.swing.JButton;
导入org.jfree.chart.ChartFactory;
导入org.jfree.chart.ChartPanel;
导入org.jfree.chart.JFreeChart;
导入org.jfree.chart.plot.PlotOrientation;
导入org.jfree.data.xy.XYDataset;
导入org.jfree.data.xy.XYSeries;
导入org.jfree.data.xy.XYSeriesCollection;
导入org.jfree.ui.ApplicationFrame;
/**@见https://stackoverflow.com/a/33898324/230513 */
公共类Draw扩展了ApplicationFrame{
私有静态最终整数指数=5;
私人最终XYSeries=新XYSeries(“余额”);
私人双平衡;
公共静态void main(字符串[]args){
EventQueue.invokeLater(()->{
新图纸(“测试”);
});
}
公开抽签(最终字符串标题){
超级(标题);
setDefaultCloseOperation(关闭时退出);
ChartPanel ChartPanel=新建ChartPanel(createChart(createDataset())){
@凌驾
公共维度getPreferredSize(){
返回新尺寸(640360);
}
};
添加(图表面板);
添加(新JButton(新抽象操作(“更新”){
@凌驾
已执行的公共无效操作(操作事件e){
余额+=5;
系列。添加或更新(索引、余额);
}
}),边界布局(南部);
包装();
setLocationRelativeTo(空);
setVisible(真);
}
私有XYDataset createDataset(){
对于(int i=0;i<11;i++){
系列。添加(i,100.00);
}
系列。删除(索引);
系列。添加(索引、平衡);
最终XYSeriesCollection数据集=新的XYSeriesCollection();
dataset.addSeries(系列);
返回数据集;
}
私有JFreeChart createChart(最终XYDataset数据集){
最终JFreeChart图表=ChartFactory.createXYLineChart(
“账户余额”,//图表标题
“月”//x轴标签
“平衡”//y轴标签
数据集,//数据
PlotOrientation.VERTICAL,
false,//包含图例
true,//工具提示
false//url
);
收益表;
}
}

感谢@trashgood的及时回复。很抱歉没有将我的代码作为一个独立的示例提供,我将在下一篇文章中继续介绍,但在您指出之前,我并不知道这个资源。我以您为例,将其合并到我的代码中。现在我的图表正在更新,尽管有点不稳定。我需要最小化它的更新窗口。如果我记得以前有人发布过关于这个问题的帖子,那么我需要添加getContentPane().removeAll();和chartPanel.revalidate();以使窗口正确更新。谢谢你的帮助。我将接受这个答案。是的,这会奏效;但原位更新也应该起作用。对于不稳定的,不要忽略调用。
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 org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
import org.jfree.ui.ApplicationFrame;

/** @see https://stackoverflow.com/a/33898324/230513 */
public class Draw extends ApplicationFrame {

    private static final int INDEX = 5;
    private final XYSeries series = new XYSeries("Balance");
    private double balance;

    public static void main(String[] args) {
        EventQueue.invokeLater(() -> {
            new Draw("Test");
        });
    }

    public Draw(final String title) {
        super(title);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        ChartPanel chartPanel = new ChartPanel(createChart(createDataset())) {

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(640, 360);
            }
        };
        add(chartPanel);
        add(new JButton(new AbstractAction("Update") {

            @Override
            public void actionPerformed(ActionEvent e) {
                balance += 5;
                series.addOrUpdate(INDEX, balance);
            }
        }), BorderLayout.SOUTH);
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }

    private XYDataset createDataset() {
        for (int i = 0; i < 11; i++) {
            series.add(i, 100.00);
        }
        series.remove(INDEX);
        series.add(INDEX, balance);
        final XYSeriesCollection dataset = new XYSeriesCollection();
        dataset.addSeries(series);
        return dataset;
    }

    private JFreeChart createChart(final XYDataset dataset) {
        final JFreeChart chart = ChartFactory.createXYLineChart(
            "Account Balance", // chart title
            "Month", // x axis label
            "Balance", // y axis label
            dataset, // data
            PlotOrientation.VERTICAL,
            false, // include legend
            true, // tooltips
            false // urls
        );
        return chart;
    }
}