我目前正在用java做Agent项目。在某一点上,我需要显示一个米,例如:电池的水平。我的程序中有5个代理,每个代理都创建自己的仪表图,上面有名字,但不知怎么的,它们没有更新数据集。或者他们正在更新数据集,只是它没有显示在计量图上。知道吗?
以下是我的代码:car.java
{
private CarMeter meter;
meter = new CarMeter(getLocalName());
meter.update(currentBatteryCharge);
}meterplot.java
public class CarMeter extends ApplicationFrame {
private static DefaultValueDataset dataset1;
public CarMeter(String s) {
super(s);
JPanel panel = createPanel();
panel.setPreferredSize(new Dimension(500, 350));
setContentPane(panel);
pack();
setVisible(true);
}
public CarMeter() {
super("s");
JPanel panel = createPanel();
panel.setPreferredSize(new Dimension(500, 350));
setContentPane(panel);
pack();
setVisible(true);
}
private static JFreeChart createChart(ValueDataset valuedataset) {
MeterPlot meterplot = new MeterPlot(valuedataset);
//set minimum and maximum value
meterplot.setRange(new Range(0.0D, 100000D));
meterplot.addInterval(new MeterInterval("Battery LOW", new Range(0.0D, 10000D),
Color.red, new BasicStroke(2.0F), new Color(255, 0, 0, 128)));
meterplot.addInterval(new MeterInterval("Moderate", new Range(10001D, 90000D),
Color.yellow, new BasicStroke(2.0F), new Color(255, 255, 0, 64)));
meterplot.addInterval(new MeterInterval("Battery FULL", new Range(90001D, 100000D),
Color.green, new BasicStroke(2.0F), new Color(0, 255, 0, 64)));
meterplot.setNeedlePaint(Color.darkGray);
meterplot.setDialBackgroundPaint(Color.white);
meterplot.setDialOutlinePaint(Color.black);
meterplot.setDialShape(DialShape.CHORD);
meterplot.setMeterAngle(180);
meterplot.setTickLabelsVisible(true);
meterplot.setTickLabelFont(new Font("Arial", 1, 12));
meterplot.setTickLabelPaint(Color.black);
meterplot.setTickSize(5D);
meterplot.setTickPaint(Color.gray);
meterplot.setValuePaint(Color.black);
meterplot.setValueFont(new Font("Arial", 1, 14));
JFreeChart jfreechart = new JFreeChart("Battery Level",
JFreeChart.DEFAULT_TITLE_FONT, meterplot, true);
return jfreechart;
}
public static JPanel createPanel() {
dataset1 = new DefaultValueDataset(0);
JFreeChart chart = createChart(dataset1);
ChartPanel chartpanel = new ChartPanel(chart);
return chartpanel;
}
public void update(int data){
dataset1.setValue(data);
System.out.println(""+dataset1 +" " +data);
}发布于 2013-11-07 10:41:13
正如@ As 2410所指出的,您的代码工作如下所示。正如@Outlaw引用的answer中所指出的那样,绘图(视图)侦听数据集(模型)。一些笔记,
setPreferredSize()时,不要使用getPreferredSize()。

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JPanel;
import javax.swing.Timer;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.DialShape;
import org.jfree.chart.plot.MeterInterval;
import org.jfree.chart.plot.MeterPlot;
import org.jfree.data.Range;
import org.jfree.data.general.DefaultValueDataset;
import org.jfree.data.general.ValueDataset;
import org.jfree.ui.ApplicationFrame;
public class CarMeter extends ApplicationFrame {
private DefaultValueDataset dataset;
private int value = 50000;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new CarMeter();
}
});
}
public CarMeter(String s) {
super(s);
JPanel panel = createPanel();
setContentPane(panel);
pack();
setLocationRelativeTo(null);
setVisible(true);
Timer t = new Timer(250, new ActionListener() {
Random r = new Random();
@Override
public void actionPerformed(ActionEvent e) {
value -= (int) (Math.abs(100 * r.nextGaussian()));
update(value);
}
});
t.start();
}
public CarMeter() {
this("Test");
}
private JFreeChart createChart(ValueDataset valuedataset) {
MeterPlot meterplot = new MeterPlot(valuedataset);
meterplot.setRange(new Range(0.0D, 100000D));
meterplot.addInterval(new MeterInterval("Battery LOW", new Range(0.0D, 10000D),
Color.red, new BasicStroke(2.0F), new Color(255, 0, 0, 128)));
meterplot.addInterval(new MeterInterval("Moderate", new Range(10000D, 90000D),
Color.yellow, new BasicStroke(2.0F), new Color(255, 255, 0, 64)));
meterplot.addInterval(new MeterInterval("Battery FULL", new Range(90000D, 100000D),
Color.green, new BasicStroke(2.0F), new Color(0, 255, 0, 64)));
meterplot.setNeedlePaint(Color.darkGray);
meterplot.setDialBackgroundPaint(Color.white);
meterplot.setDialOutlinePaint(Color.black);
meterplot.setDialShape(DialShape.CHORD);
meterplot.setMeterAngle(180);
meterplot.setTickLabelsVisible(true);
meterplot.setTickLabelFont(new Font("Arial", 1, 14));
meterplot.setTickLabelPaint(Color.black);
meterplot.setTickSize(5D);
meterplot.setTickPaint(Color.gray);
meterplot.setValuePaint(Color.black);
meterplot.setValueFont(new Font("Arial", 1, 14));
JFreeChart jfreechart = new JFreeChart("Battery Level",
JFreeChart.DEFAULT_TITLE_FONT, meterplot, true);
return jfreechart;
}
private JPanel createPanel() {
dataset = new DefaultValueDataset(value);
JFreeChart chart = createChart(dataset);
ChartPanel chartpanel = new ChartPanel(chart) {
@Override
public Dimension getPreferredSize() {
return new Dimension(640, 480);
}
};
return chartpanel;
}
public void update(int data) {
dataset.setValue(data);
}
}发布于 2013-11-07 09:39:22
认为这是对Jfreechart - Refresh a chart according to changing data的复制
您需要以某种方式重新绘制图表,update方法只会设置数据雪崩,而将图表本身保持不变。
对于快速和肮脏的修复,无需进一步研究,我建议再次调用createChart方法(在您的更新方法中),并更新图表对象。
只是为了验证这是否能解决问题。我建议您阅读GOF观察者模式,这是将GUI从数据中分离出来并在需要pattern时更新GUI的好方法。
https://stackoverflow.com/questions/19831953
复制相似问题