双jfreechart不运行;只有一个跑步
请让我知道如何在 jframe
中为 jfreechart
制作程序。有两个 JFReecharts
,两者都可见,但只有一个正在运行。另一个仍然是,为什么会发生?我的代码中有任何顺序错误吗?
如果您解释或提供任何提示,我将感谢您。
请仔细阅读,您可以在笔记本电脑/PC上运行,它正在运行代码。
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JPanel;
import javax.swing.Timer;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.XYPlot;
import org.jfree.data.time.DynamicTimeSeriesCollection;
import org.jfree.data.time.Second;
import org.jfree.data.xy.XYDataset;
import org.jfree.ui.ApplicationFrame;
/**
* @see http://stackoverflow.com/a/15521956/230513
* @see http://stackoverflow.com/questions/5048852
*/
public class Grid_Layout extends ApplicationFrame {
private static final long serialVersionUID = 1L;
private static final String TITLE1 = "X-Axis";
private static final String TITLE2 = "Y-Axis";
private static final String TITLE3 = "Z-Axis";
private static final String START = "Start";
private static final String STOP = "Stop";
private static final float MINMAX = 100;
private static final int COUNT = 2 * 60;
private static final int FAST = 100;
private static final int SLOW = FAST * 5;
private static final Random random = new Random();
private static final Random random2 = new Random();
private Timer timer;
private Timer timer2;
public Grid_Layout(final String title) {
super(title);
final XYDataset dataset = createDataset1();
JFreeChart chart = createChart(dataset);
final XYDataset dataset2 = createDataset2();
JFreeChart chart2 = createChart2(dataset2);
final JButton run = new JButton(STOP);
run.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String cmd = e.getActionCommand();
if (STOP.equals(cmd)) {
timer.stop();
run.setText(START);
} else {
timer.start();
run.setText(STOP);
}
}
});
final JComboBox<String> combo = new JComboBox<String>();
combo.addItem("Fast");
combo.addItem("Slow");
combo.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if ("Fast".equals(combo.getSelectedItem())) {
timer.setDelay(FAST);
} else {
timer.setDelay(SLOW);
}
}
});
this.add(new ChartPanel(chart) {
private static final long serialVersionUID = 1L;
@Override
public Dimension getPreferredSize() {
return new Dimension(640, 480);
}
}, BorderLayout.CENTER);
this.add(new ChartPanel(chart2) {
private static final long serialVersionUID = 1L;
@Override
public Dimension getPreferredSize() {
return new Dimension(640, 480);
}
}, BorderLayout.CENTER);
JPanel btnPanel = new JPanel(new FlowLayout());
btnPanel.add(run);
btnPanel.add(combo);
this.add(btnPanel);
}
private float randomValue() {
return (float) (random.nextGaussian() * MINMAX / 3);
}
private float[] gaussianData() {
float[] a = new float[COUNT];
for (int i = 0; i < a.length; i++) {
a[i] = randomValue();
}
return a;
}
private JFreeChart createChart(final XYDataset dataset) {
final JFreeChart result = ChartFactory.createTimeSeriesChart(TITLE1, "Time (seconds)", "Intensity (cm/s)",
dataset, true, true, false);
final XYPlot plot = result.getXYPlot();
ValueAxis domain = plot.getDomainAxis();
domain.setAutoRange(true);
ValueAxis range = plot.getRangeAxis();
range.setRange(-MINMAX, MINMAX);
range.setAutoRange(true);
return result;
}
private JFreeChart createChart2(final XYDataset dataset) {
final JFreeChart result = ChartFactory.createTimeSeriesChart(TITLE2, "Time (seconds)", "Intensity (cm/s)",
dataset, true, true, false);
final XYPlot plot = result.getXYPlot();
ValueAxis domain = plot.getDomainAxis();
domain.setAutoRange(true);
ValueAxis range = plot.getRangeAxis();
range.setRange(-MINMAX, MINMAX);
range.setAutoRange(true);
return result;
}
public void start() {
timer.start();
}
private XYDataset createDataset1() {
final DynamicTimeSeriesCollection dataset = new DynamicTimeSeriesCollection(1, COUNT, new Second());
dataset.setTimeBase(new Second(0, 0, 0, 24, 5, 2022));
dataset.addSeries(gaussianData(), 0, "X");
timer = new Timer(FAST, new ActionListener() {
float[] newData = new float[1];
@Override
public void actionPerformed(ActionEvent e) {
newData[0] = randomValue();
dataset.advanceTime();
dataset.appendData(newData);
}
});
return dataset;
}
private XYDataset createDataset2() {
final DynamicTimeSeriesCollection dataset = new DynamicTimeSeriesCollection(1, COUNT, new Second());
dataset.setTimeBase(new Second(0, 0, 0, 26, 5, 2022));
dataset.addSeries(gaussianData(), 0, "Y");
timer2 = new Timer(FAST, new ActionListener() {
float[] newData2 = new float[1];
@Override
public void actionPerformed(ActionEvent e) {
newData2[0] = randomValue();
dataset.advanceTime();
dataset.appendData(newData2);
}
});
return dataset;
}
public static void main(final String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
Grid_Layout demo = new Grid_Layout("Vibration Analyser");
demo.setLayout(new GridLayout(3, 1));
demo.pack();
demo.setLocationRelativeTo(null);
demo.setVisible(true);
demo.start();
}
});
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
基于此示例,我已经重新使用了您的变体,以反映有关 jfreechart swing。
如@camickr所述,您需要参考
timer
和timer2
在您的处理程序中。使用 gridlayout(0,1) 允许在列中添加多个网格,而无需添加图表时不断更新。
考虑
gridchart
,ChartPanel的子类
,如下所示。尽可能使用命名常数。
该示例说明迁移 问题/标记/jfreechart“ class =” post-tag“ title =”显示问题标记为'jfreechart'“ rel =“ tag”> jfreechart v1.5.3,当前版本。
Based on this example, I've re-factored your variation to reflect several points about multiple instances of jfreechart in Swing.
As noted by @camickr, you need to reference both
timer
andtimer2
in your handlers.Use
GridLayout(0, 1)
to allow adding multiple grids in a column, without the continual need to update as charts are added.Consider
GridChart
, a subclass ofChartPanel
, shown below.Use named constants whenever possible.
The example illustrates migrating to jfreechart v1.5.3, the current release.