当前位置: 首页 > 知识库问答 >
问题:

每500毫秒平滑渲染Swing组件

夏侯昊明
2023-03-14

当我每500毫秒调用PaintComponent()来显示更新的图表时,我面临着呈现问题。我使用Panel上的JFreeChart创建了大约30个Barchart。

有错误的渲染和我如何解决这个问题?

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上构建图表的函数。

共有1个答案

姜振濂
2023-03-14

不要替换视图组件。相反,更新相应的模型,监听视图将自我更新作为响应。在下面的示例中,createPane()返回的每个ChartPanel都有一个Swing计时器,该计时器每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();
            }
        });
    }
}
 类似资料:
  • 我用基本的图形用户界面创建了一个小画板程序。我使用了画图组件方法。我想每毫秒更新正在绘制的图形。这样,用户可以在释放鼠标点击之前看到他们将要绘制的内容。例如,如果我正在绘制一个矩形,我想在绘制矩形时看到它。如果你不明白我到底在说什么,打开微软油漆,点击矩形工具。画一个矩形。注意它是如何持续更新的,而不是在释放鼠标后。我想一定有办法让它每毫秒更新我的图形。做这件事最好的方法是什么?抱歉,如果这是一个

  • 我在Java中的JLabel存在一个渲染问题:我使用oberver observable模式,当我的模型通知我的视图JLabel已经更改了JLabel的内容,或者特别是在我的JLabel区域中显示的内容是随机的时。有时它渲染另一个面板中按钮的一部分,有时它渲染我在视图的其他组件中设置的颜色!但是,如果我最小化然后最大化我的帧,所有的渲染都是正确的。 对不起,我的英语不好。 EDIT这是我的JPan

  • 我有一个swing应用程序,它在JScrollPane中包含一个SVG画布。应用程序修改显示的SVG文档,这也会导致文档大小的更改。此大小更改需要反映在应用程序中。调整SVG画布的大小,滚动JScrollPane的视口,以便它显示画布的正确部分。 然而,这导致了类似“视觉跳跃”的东西,因为用户首先看到画布大小的变化,然后看到滚动操作。 有没有一种方法可以告诉java停止处理给定组件(及其子组件)上

  • 我正在尝试使用ffmpeg 4.3录制屏幕和音频。但在最终输出中,我的音频比视频慢500到1秒。为什么会这样?如何解决这个问题?以下是我在Windows 10计算机上使用的命令: ffmpeg。exe-threads 4-rtbufsize 1024m-f dshow-i audio=“麦克风(Realtek audio)”-f gdigrab-offset_x 0-offset_y 0-vide

  • 问题内容: 我尝试运行RichFaces4应用,但组件未渲染。例如,当我尝试这个演示:演示时,我得到如下信息: 我的代码与演示中的代码几乎相同。我刚刚添加了表单标签,因为它对此有所抱怨。 问题答案: 这就是Crome开发人员工具告诉我的内容 http://img571.imageshack.us/i/rfnotdefined.jpg (未捕获的ReferenceError:未定义RichFaces

  • This group contains all Components that have to do with rendering in-game and user interface elements. Lighting and special effects are also included in this group. 这个组包括在游戏中渲染和界面元素的所有组件。光照和特定效果也包含在这个