编程语言
首页 > 编程语言> > java-每500毫秒平滑渲染一次Swing组件

java-每500毫秒平滑渲染一次Swing组件

作者:互联网

每500毫秒调用一次paintComponent()以显示更新的图表时,我面临渲染问题.我在面板上使用JFreeChart创建了大约30个条形图.

Rendering with error and
我怎么解决这个问题?

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)是使用MyObject的信息在Panel上构建图表的功能.

解决方法:

不要更换视图组件.而是,更新相应的模型,并且侦听视图将作为响应进行更新.在下面的示例中,由createPane()返回的每个ChartPanel都有一个摆动计时器,该计时器每500毫秒更新其XYSeries.

image

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 https://stackoverflow.com/a/38512314/230513
 * @see https://stackoverflow.com/a/15715096/230513
 * @see https://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();
            }
        });
    }
}

标签:charts,jfreechart,swing,rendering,java
来源: https://codeday.me/bug/20191026/1939644.html