当前位置: 首页 > 面试题库 >

Java中的实时绘图

苏健柏
2023-03-14
问题内容

我有一个应用程序,该应用程序每秒更新一次变量约5到50次,并且我正在寻找某种实时绘制此变化的连续XY图的方法。

尽管不建议使用JFreeChart来获得如此高的更新速率,但是许多用户仍然说它适用于他们。我尝试使用此演示并将其修改为显示随机变量,但似乎一直都在使用100%的CPU。即使我忽略了这一点,我也不希望限于JFreeChart的ui类来构造表单(尽管我不确定其功能到底是什么)。可以将其与Java的“表单”和下拉菜单集成吗?(如VB中可用)否则,我是否可以寻找其他选择?

编辑:
我是Swing的新手,所以我整理了一个代码来测试JFreeChart的功能(同时避免使用JFree的ApplicationFrame类,因为我不确定这将如何与Swing的组合一起使用框和按钮)。现在,该图将立即更新,并且CPU使用率很高。是否可以使用新的Millisecond()缓冲值并每秒更新两次?另外,是否可以在不中断JFreeChart的情况下向JFrame的其余部分添加其他组件?我该怎么做?frame.getContentPane()。add(new
Button(“ Click”))似乎覆盖了图形。

package graphtest;

import java.util.Random;
import javax.swing.JFrame;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.XYPlot;
import org.jfree.data.time.Millisecond;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;

public class Main {
    static TimeSeries ts = new TimeSeries("data", Millisecond.class);

    public static void main(String[] args) throws InterruptedException {
        gen myGen = new gen();
        new Thread(myGen).start();

        TimeSeriesCollection dataset = new TimeSeriesCollection(ts);
        JFreeChart chart = ChartFactory.createTimeSeriesChart(
            "GraphTest",
            "Time",
            "Value",
            dataset,
            true,
            true,
            false
        );
        final XYPlot plot = chart.getXYPlot();
        ValueAxis axis = plot.getDomainAxis();
        axis.setAutoRange(true);
        axis.setFixedAutoRange(60000.0);

        JFrame frame = new JFrame("GraphTest");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        ChartPanel label = new ChartPanel(chart);
        frame.getContentPane().add(label);
        //Suppose I add combo boxes and buttons here later

        frame.pack();
        frame.setVisible(true);
    }

    static class gen implements Runnable {
        private Random randGen = new Random();

        public void run() {
            while(true) {
                int num = randGen.nextInt(1000);
                System.out.println(num);
                ts.addOrUpdate(new Millisecond(), num);
                try {
                    Thread.sleep(20);
                } catch (InterruptedException ex) {
                    System.out.println(ex);
                }
            }
        }
    }

}

问题答案:

如果您的变量更新速度如此之快,那么每次更新图表都是没有意义的。

您是否考虑过缓冲变量更改,并在其他线程(例如每5s)刷新一次图表?您应该发现JFreeChart可以很好地处理这种更新率。

由于JFreeChart是普通的桌面库,因此您可以非常轻松地将其与标准的Swing应用程序集成。或者,您可以使用它通过Web应用程序绘制图表(通过渲染为JPEG
/ PNG等。JFreeChart也可以自动生成图像地图,因此可以使用鼠标悬停等)。



 类似资料:
  • 问题内容: 我以两个数组获取一些数据:一个用于时间,另一个用于值。当我达到1000点时,我会触发信号并绘制这些点(x =时间,y =值)。 我需要保持与之前相同的图形,但只有一个合理的数字才能避免减慢处理速度。例如,我想在图表上保留10,000点。matplotlib交互式绘图工作正常,但是我不知道如何删除第一个点,这会很快减慢计算机速度。我查看了matplotlib.animation,但它似乎

  • 问题内容: 我正在开发的Java Swing GUI需要根据程序中生成的x和y坐标绘制2D图形。 为此有一个Swing组件吗? 还是有其他目的的开源软件包? 问题答案: 您应该查看具有Swing支持的JFreeChart。以下是一些示例: http://www.jfree.org/jfreechart/samples.html

  • 问题内容: 这是基于@trashgod的有关实时绘图的示例的代码: 运行Java之后,尽管从0开始,但是我仍然不明白为什么图形从40秒开始?遍历代码;找不到任何要在40秒后开始的设置。 另外,如何向后滚动图形以查看以前的数据。 问题答案: 该图在构造传递到的日期的午夜之后的16分40秒处开始。这是在构造函数参数中指定的相同的1000个间隔,每个间隔一秒。在给定的时间设置为午夜的情况下,获取基于零的

  • 我目前正在开发一种实时数据绘图解决方案,该解决方案能够频繁接收新数据(高达1kHz)并以较低的速率(例如50hz)执行重绘。我使用FLTK进行了第一次实现,但我想尝试一下GTK,因为我以前从未使用过它,它看起来对我来说很有希望。 为了简短起见,我注意到与我使用FLTK测量的结果相比,在绘制线条时调用cairo_stroke()需要花费很多时间(FLTK中没有笔划,fust一个fl_line()函数

  • 我目前正在尝试用java绘制sin(x)的图形。作业说明要求我只使用drawLine()作为绘制图形的方法。我似乎不知道如何正确设置y值。现在我有一个while循环,用于逐个像素绘制线,但无法获得正确的y值。这是我目前所掌握的。 } 是的,我知道有很多事情我可以整理或简化,这只是一个粗略的草稿,本身,一旦我一切正常,我会清理。我已经尝试了多种方法来正确设置 y 值,我得到的最接近的方法最终绘制了一

  • 问题内容: 我正在开发一个Swing应用程序(当前在Java 1.6 Update 11上运行),该应用程序存在一些间歇性的刷新刷新问题(例如,有工件等)。这只会发生在我们应用程序的某些用户上,而其他用户则不会。 经过研究后,我发现将该属性设置为可能有用,实际上,它对我们的一位用户有所帮助。 既然其他一些用户对此问题有所抱怨,我正在考虑将所有用户的属性设置为。 我的基本问题如下: 究竟是什么原因造