JFreeChart:update/repaint 从另一个 class 接收到新值时的折线图
JFreeChart: update/repaint line graph when a new value is received from another class
这只是我的第二次post,所以如果我还没有正确遵守规则,请原谅我。我正在尝试自动更新使用 JFreeChart 库创建的折线图。我已经尝试了几天,并参考了 api and followed many examples here, here and here.
我有一个方法可以获取一个帐户的余额并将其发送到另一个帐户class:
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;
}
接收到的class为图处理数据:
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 比较陌生,非常感谢任何帮助!!!
谢谢
为了帮助隔离问题,我已将您的代码缩减为 self-contained example,它更新 XYSeriesCollection
中的 XYSeries
中的单个 XYDataItem
。注意每个XYDataItem
封装了两个Number
的实例;每个都是Comparable
,按要求按XYSeries
; add(double x, double y)
将每个转换为 Double
。点击更新按钮可以看到效果。项目 INDEX
应在每次点击时增加 5。
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 */
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;
}
}
这只是我的第二次post,所以如果我还没有正确遵守规则,请原谅我。我正在尝试自动更新使用 JFreeChart 库创建的折线图。我已经尝试了几天,并参考了 api and followed many examples here, here and here.
我有一个方法可以获取一个帐户的余额并将其发送到另一个帐户class:
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;
}
接收到的class为图处理数据:
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 比较陌生,非常感谢任何帮助!!!
谢谢
为了帮助隔离问题,我已将您的代码缩减为 self-contained example,它更新 XYSeriesCollection
中的 XYSeries
中的单个 XYDataItem
。注意每个XYDataItem
封装了两个Number
的实例;每个都是Comparable
,按要求按XYSeries
; add(double x, double y)
将每个转换为 Double
。点击更新按钮可以看到效果。项目 INDEX
应在每次点击时增加 5。
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 */
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;
}
}