每500毫秒平滑渲染Swing组件

当我每隔500毫秒调用paintComponent()来显示更新的图表时,我面临渲染问题。 我在Panel上使用JFreeChart创建了大约30个JFreeChart

渲染错误,我该如何解决这个问题?

 private void ShowGraphs() { FirstChart.removeAll(); SecondChart.removeAll(); ThirdChart.removeAll(); FirstChart.add(Label1); SecondChart.add(Label2); ThirdChart.add(Label3); ChartUpdate(P1,FirstChart); ChartUpdate(P2,SecondChart); ChartUpdate(P3,ThirdChart); //FirstChart, SecondChart, ThirdChart is JPanels //Tabb is JTabbedPane paintComponents(Tabb.getGraphics()); } 

此代码每500毫秒调用一次, ChartUpdate(MyObject, Panel)Panel使用MyObject信息的图表构建function。

请勿替换视图组件。 相反,更新相应的模型,监听视图将自行更新。 在下面的示例中, createPane()返回的每个ChartPanel都有一个Swing Timer ,每500 ms更新一次XYSeries

图片

 import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Random; import javax.swing.JFrame; 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.plot.PlotOrientation; import org.jfree.data.xy.XYSeries; import org.jfree.data.xy.XYSeriesCollection; /** * @see http://stackoverflow.com/a/38512314/230513 * @see http://stackoverflow.com/a/15715096/230513 * @see http://stackoverflow.com/a/11949899/230513 */ public class Test { private static final int N = 128; private static final Random random = new Random(); private int n = 1; private void display() { JFrame f = new JFrame("TabChart"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel p = new JPanel(new GridLayout(0, 1)); for (int i = 0; i < 3; i++) { p.add(createPane()); } f.add(p, BorderLayout.CENTER); f.pack(); f.setLocationRelativeTo(null); f.setVisible(true); } private ChartPanel createPane() { final XYSeries series = new XYSeries("Data"); for (int i = 0; i < random.nextInt(N) + N / 2; i++) { series.add(i, random.nextGaussian()); } XYSeriesCollection dataset = new XYSeriesCollection(series); new Timer(500, new ActionListener() { @Override public void actionPerformed(ActionEvent e) { series.add(series.getItemCount(), random.nextGaussian()); } }).start(); JFreeChart chart = ChartFactory.createXYLineChart("Test", "Domain", "Range", dataset, PlotOrientation.VERTICAL, false, false, false); return new ChartPanel(chart) { @Override public Dimension getPreferredSize() { return new Dimension(480, 240); } }; } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { new Test().display(); } }); } }