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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值