java得到500毫秒_java-每500毫秒平滑渲染一次Swing套件

每500毫秒呼叫一次paintComponent()以顯示更新的圖表時,我面臨渲染問題.我在面板上使用JFreeChart建立了大約30個長條圖.

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.

4b6cC.png

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