快速绘制多个图表的计时问题

2023-12-02

在下面的代码中,我正在进行一个实验,我需要每秒绘制近 10 个图表(时间间隔 100),总共 50 个图表。但是,当我减少时间间隔时时间间隔(第 120 行向下到底部)从 200 毫秒到 100 毫秒,代码引发下面的异常。

我已经厌倦了 invokeLater 等,但我无法解决这个问题。我将生成下图的完整代码粘贴到此处。请看一下并让我知道该怎么做。提前致谢

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Series index out of bounds
    at org.jfree.data.xy.XYSeriesCollection.getSeries(XYSeriesCollection.java:261)
    at org.jfree.data.xy.XYSeriesCollection.getSeriesKey(XYSeriesCollection.java:303)
    at org.jfree.chart.labels.AbstractXYItemLabelGenerator.createItemArray(AbstractXYItemLabelGenerator.java:268)
    at org.jfree.chart.labels.AbstractXYItemLabelGenerator.generateLabelString(AbstractXYItemLabelGenerator.java:238)
    at org.jfree.chart.labels.StandardXYToolTipGenerator.generateToolTip(StandardXYToolTipGenerator.java:165)
    at org.jfree.chart.renderer.xy.AbstractXYItemRenderer.addEntity(AbstractXYItemRenderer.java:1747)
    at org.jfree.chart.renderer.xy.XYLineAndShapeRenderer.drawSecondaryPass(XYLineAndShapeRenderer.java:1196)
    at org.jfree.chart.renderer.xy.XYLineAndShapeRenderer.drawItem(XYLineAndShapeRenderer.java:918)
    at org.jfree.chart.plot.XYPlot.render(XYPlot.java:3776)
    at org.jfree.chart.plot.XYPlot.draw(XYPlot.java:3337)
    at org.jfree.chart.JFreeChart.draw(JFreeChart.java:1226)
    at org.jfree.chart.ChartPanel.paintComponent(ChartPanel.java:1612)
    at javax.swing.JComponent.paint(JComponent.java:1054)
    at javax.swing.JComponent.paintToOffscreen(JComponent.java:5221)
    at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1508)
    at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1439)
    at javax.swing.RepaintManager.paint(RepaintManager.java:1236)
    at javax.swing.JComponent._paintImmediately(JComponent.java:5169)
    at javax.swing.JComponent.paintImmediately(JComponent.java:4980)
    at javax.swing.RepaintManager$3.run(RepaintManager.java:796)
    at javax.swing.RepaintManager$3.run(RepaintManager.java:784)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:784)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:757)
    at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:706)
    at javax.swing.RepaintManager.access$1000(RepaintManager.java:62)
    at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1647)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:733)
    at java.awt.EventQueue.access$200(EventQueue.java:103)
    at java.awt.EventQueue$3.run(EventQueue.java:694)
    at java.awt.EventQueue$3.run(EventQueue.java:692)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:703)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

enter image description here

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.geom.Ellipse2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import org.jfree.chart.*;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.event.ChartChangeListener;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
import org.jfree.util.ShapeUtilities;

public class FastChart extends JFrame {
   private XYSeries [] xySeries ;
   private XYPlot xyPlot;
   private XYSeriesCollection xySeriesCollection;
   private String title;

   private ChartPanel chartPanel;

   public  FastChart(String s) {
      super(s);
      init(s);
   }

   private void init(String s){
      title = s;
      xySeries = new XYSeries[12];
      for (int i = 0; i < xySeries.length; i++) {
         xySeries[i]    = new XYSeries("Plot "+i);  
      }
      xySeriesCollection = new XYSeriesCollection();
      JFreeChart chart = ChartFactory.createScatterPlot(
            title, "X", "Y", xySeriesCollection,
            PlotOrientation.VERTICAL, true, true, false);

      xyPlot =  chart.getXYPlot();
      xyPlot.setDomainCrosshairVisible(true);
      xyPlot.setRangeCrosshairVisible(true);

      chartPanel = createChartPanel(chart);

      add(chartPanel, BorderLayout.CENTER);
      JPanel control = new JPanel();

      add(control, BorderLayout.SOUTH);

      setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
      pack();
      setLocationRelativeTo(null);
      setVisible(true);
   }

   private ChartPanel createChartPanel(JFreeChart chart) {

      XYItemRenderer renderer = xyPlot.getRenderer();
      renderer.setSeriesPaint(0, Color.magenta);
      renderer.setSeriesPaint(1, Color.green);
      renderer.setSeriesPaint(2, Color.blue);
      renderer.setSeriesPaint(4, Color.black);
      renderer.setSeriesPaint(3, Color.yellow);
      Shape cross = ShapeUtilities.createDiagonalCross(3, 0);
      Shape plus = ShapeUtilities.createRegularCross(4,0);

      for (int i = 0; i <=3; i++) {
         renderer.setSeriesShape(0+i,    new Rectangle(-1, -1, 2, 2));
         renderer.setSeriesShape(4+i,    new Ellipse2D.Float(-2F, -2F, 5F, 5F));  
         renderer.setSeriesShape(8+i,    cross);
      }
      // X axis
      NumberAxis domain = (NumberAxis) xyPlot.getDomainAxis();
      domain.setVerticalTickLabels(true);
      // Y axis
      return new ChartPanel(chart);
   }


   public  void plot2d( final int iSeriesN,  final double [] dX,  final double [] dY, final String sT){

      if (dY.length != dX.length){
         throw new IllegalArgumentException("Error! inputs x and y have to be of same size.");
      }
      chartPanel.getChart().removeChangeListener((ChartChangeListener) chartPanel);

      xySeries[iSeriesN].clear();
      xySeriesCollection.removeAllSeries();
      xySeries[iSeriesN]= addXY(iSeriesN,  dX, dY);
      xySeries[iSeriesN].setKey(sT);
      for (int i = 0; i < xySeries.length; i++) {
         xySeriesCollection.addSeries(xySeries[i]);
      }

      chartPanel.getChart().addChangeListener((ChartChangeListener) chartPanel);
      xyPlot.setDataset(xySeriesCollection);
   }

   public XYSeries addXY(final int iSeriesN, final double [] dX, final double [] dY){
      XYSeries series = new XYSeries("Plot ");

      for (int i = 0; i < dX.length; i++) {
         series.add(dX[i], dY[i]);
      }
      return series;
   }
   public  void animatePlot(){
      Thread thread = null;
      thread = new Thread (){
         public void run() {
            final double [] x = new double[1000];
            final double [] y = new double[1000];

            try{    
               for (int k = 1; k < 50; k++) {
                  try {
                     Thread.sleep(200);  //**** TIME INTERVAL *****
                  } catch (InterruptedException e) {
                     e.printStackTrace();
                  }
                  for (int i = 0; i < y.length; i++) {
                     x[i] = i;
                     y[i] = i*i*k;
                  }
                  plot2d(k % 12, x, y,"plot#"+k);
               }
            } catch (Exception e){
               System.out.println();
            }     
         }
      };
      thread.start();
   }

   public static void main(String args[]) {
      FastChart  demo = new FastChart("X Y Plot");
      demo.animatePlot();
   }
}

您正在更新模型Thread thread。要在 EDT 上更新,请使用javax.swing.Timer, 如图所示here, or SwingWorker, 如图所示here.

附录:为了验证假设,我添加了以下内容javax.swing.Timer to init().

Timer t = new Timer(200, new ActionListener() {
    int k = 0;

    @Override
    public void actionPerformed(ActionEvent e) {
        if (k++ < 19) {
            final double[] x = new double[1000];
            final double[] y = new double[1000];
            for (int i = 0; i < y.length; i++) {
                x[i] = i;
                y[i] = i * i * k;
            }
            plot2d(k % 12, x, y, "plot#" + k);
        }
    }
});
t.start();

我也用过invokeLater() in main().

EventQueue.invokeLater(new Runnable() {

    @Override
    public void run() {
        FastChart demo = new FastChart("X Y Plot");
    }
});

image

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

快速绘制多个图表的计时问题 的相关文章

  • Java Try Catch Final 没有 Catch 的情况下会阻塞

    我正在审查一些新代码 该程序只有一个 try 和一个 finally 块 既然排除了 catch 块 那么如果 try 块遇到异常或任何可抛出的内容 它如何工作 它直接进入finally块吗 如果 try 块中的任何代码可以引发已检查异常
  • 无法解析类型为 xxx 的任何 bean;限定符:[@javax.enterprise.inject.Any()]

    我有一个 LoginProvider 接口 public interface LoginProvider boolean login String username String password 以及两种不同的实现 public clas
  • 使用cameltestsupport进行Camel单元测试,模板始终为空

    我正在用 Camel 做一个简单的单元测试 我想做的就是从文件 在资源下 读取 JSON 内容 将其发送到 Java 类进行验证 这是我试图测试的路线 无论我做什么 模板 我用来发送正文 json 始终为空 这是我的代码 public cl
  • 来自数据库的 jfreechart 散点图

    如何使用java中的jfreechart绘制mysql数据库表中数据的散点图 我使用过 Swing 库 任何链接都会有帮助 我搜索了谷歌但找不到理解的解决方案 如果您有代码 请提供给我 实际上我确实做了条形图并使用 jfreechart 绘
  • Java:使用 HttpURLConnection 的 HTTP PUT

    如何执行 HTTP PUT 我正在使用的类似乎认为它正在执行 PUT 但端点将其视为我执行了 GET 我做错了什么吗 URL url new URL https HttpURLConnection conn HttpURLConnectio
  • Condition 接口中的 signalAll 与对象中的 notificationAll

    1 昨天我才问过这个问题条件与等待通知机制 https stackoverflow com questions 10395571 condition vs wait notify mechanism 2 我想编辑相同的内容并在我的问题中添加
  • 在 HTTP 标头中发送 UTF-8 值会导致 Mojibake

    我想使用 servlet 发送阿拉伯语数据HTTPServletResponse给客户 我正在尝试这个 response setCharacterEncoding UTF 8 response setHeader Info arabicWo
  • 无法在 Spring Boot 测试中模拟 persistenceContext

    我正在使用带有 Mockito 框架的 spring boot 测试来测试我的应用程序 存储库类 EntityManager 之一作为参考 我的班级如下所示 Repository Transactional Slf4j public cla
  • 具有共享依赖项的多模块项目的 Gradle 配置

    使用 gradle 制作第一个项目 所以我研究了 spring gradle hibernate 项目如何组织 gradle 文件 并开始制作自己的项目 但是 找不到错误 为什么我的配置不起作用 子项目无法解决依赖关系 所以项目树 Root
  • 无法加载或查找主类,可以在命令行中使用,但不能在 IDE 中使用[重复]

    这个问题在这里已经有答案了 在将其标记为重复之前 请先听我说完 我正在尝试使用 gradle 导入一个 java 项目 功能齐全 适用于所有其他笔记本电脑 没有问题 我的项目 100 正常运行 适用于所有其他笔记本电脑 当我的笔记本电脑被重
  • 如何将 Jfreechart(饼图)添加到 netbeans 的面板中

    我正在使用 netbeans gui 编辑器 并且正在尝试添加一个本身位于内部框架中的 Jfreechart 并且这个内部框架我想将其添加到面板中 正如您在此图中看到的那样 抱歉 我无法直接发布图像 因为我新手 http www flick
  • Cloudfoundry:如何组合两个运行时

    cloundfoundry 有没有办法结合两个运行时环境 我正在将 NodeJS 应用程序部署到 IBM Bluemix 现在 我还希望能够执行独立的 jar 文件 但应用程序失败 APP 0 bin sh 1 java not found
  • Dispatcher-servlet 无法映射到 websocket 请求

    我正在开发一个以Spring为主要框架的Java web应用程序 特别使用Spring core Spring mvc Spring security Spring data Spring websocket 像这样在 Spring 上下文
  • 如何在 Eclipse Java 动态 Web 项目中使用 .properties 文件?

    我正在 Eclipse 中开发动态 Web 项目 我创建了一个 properties 文件来存储数据库详细信息 用户名 密码等 我通过右键单击项目和 New gt File 添加它 我使用了Java util包Properties类 但它不
  • 无法捕获 Spring Batch 的 ItemWriter 中的异常

    我正在编写一个 Spring Batch 流程来将数据集从一个系统迁移到另一个系统 在这种情况下 这就像使用RowMapper实现在传递给查询之前从查询构建对象ItemWriter The ItemWriter称为save我的 DAO 上的
  • 将图像添加到自定义 AlertDialog

    我制作了一个 AlertDialog 让用户可以从我显示的 4 个选项中选择一个 前 3 个让他们在单击号码时直接拨打号码 第 4 个显示不同的视图 现在看起来是这样的 由于第四个选项的目的是不同的任务 我想让它看起来不同 因为用户可能会感
  • JVM:是否可以操作帧堆栈?

    假设我需要执行N同一线程中的任务 这些任务有时可能需要来自外部存储的一些值 我事先不知道哪个任务可能需要这样的值以及何时 获取速度要快得多M价值观是一次性的而不是相同的M值在M查询外部存储 注意我不能指望任务本身进行合作 它们只不过是 ja
  • 解决错误javax.mail.AuthenticationFailedException

    我不熟悉java中发送邮件的这个功能 我在发送电子邮件重置密码时遇到错误 希望你能给我一个解决方案 下面是我的代码 public synchronized static boolean sendMailAdvance String emai
  • 如何在Java中正确删除数组[重复]

    这个问题在这里已经有答案了 我刚接触 Java 4 天 从我搜索过的教程来看 讲师们花费了大量精力来解释如何分配二维数组 例如 如下所示 Foo fooArray new Foo 2 3 但我还没有找到任何解释如何删除它们的信息 从内存的情
  • Java &= 运算符应用 & 或 && 吗?

    Assuming boolean a false 我想知道是否这样做 a b 相当于 a a b logical AND a is false hence b is not evaluated 或者另一方面 这意味着 a a b Bitwi

随机推荐

  • 如何在jdbc postgresql准备好的语句中多次使用相同的值

    有没有办法在 jdbc postgresql 驱动程序的准备语句中多次使用相同的变量 例如 我想使用以下语句 但每个问号具有相同的值 PreparedStatement ps pg prepareCall SELECT FROM mytab
  • xsl for-each:每 n 行添加代码块?

    我正在尝试将一些代表图像库的 xml 转换为 html 表 必须使用 html 而不是 css 来完成 如何添加换行符 tr 每六列左右有 xsl 吗 我有这个 tr
  • 旋转SCNNode相对局部坐标

    我正在尝试旋转节点SCNAction 但它相对于父级的坐标空间旋转 是否可以相对局部坐标系旋转节点 当然 您可以使用以下命令获取父级旋转轴的空间坐标转换向量 method 例如 此操作将绕局部 x 轴旋转 180 度 SCNAction r
  • Linq 中的三元运算符

    var result from payroll in currentMonthPayroll select new SalaryDifference PreviousMonthSalary previousMonthPayroll Wher
  • 静态和非静态字段

    只是为了澄清我的想法是对的 在java中静态字段是一个被整个类使用的变量 字段 或者可以被引用该类的所有对象使用 非静态字段是由对象定义的变量吗 引用与对象 1 相同的类的第二个对象可以具有与对象 1 的静态字段不同的值吗 与实例变量不同
  • 合并日期范围

    这里是 Oracle SQL 新手 也是第一次发布海报 我以为这很简单 直到我意识到我无法弄清楚如何拆分返回作业 这是我的分配表 ASGN ID ST DT END DT POS LOCN STATUS WAGE CD A 12 31 20
  • 如何回显公共文件夹之外的图像

    在此项目中 我将管理员提交的文件上传到公共文件夹之外的文件夹 web the public folder upload uploading image to this which is at the same level as the pu
  • 在 ggplot2 中显示频率和条形图

    我正在尝试在条形图中显示频率 好吧 我想要它们某处在图表中 条形下方 条形内 条形上方或图例区域中 我记得 我可能是错的 它可以在ggplot2 这可能是一个简单的问题 至少看起来很容易 这是代码 p lt ggplot mtcars p
  • 使用方法 update_all

    假设我有一个模型 class Result lt ActiveRecord Base attr accessible x y sum end 而不是做 Result all find each do s s sum compute sum
  • 编写一个批处理文件以按日期和时间删除文件夹

    精确重复 如何编写批处理文件来删除文件夹中 5 天或更早的文件 编写一个批处理文件以从文件夹中删除 6 天前的文件 编写一个批处理文件以从文件夹中删除 5 天前的文件 如何编写批处理文件来定期删除文件夹和文件 如何创建按计划删除文件夹的批处
  • 如何在 Web 组件中使用标签的 querySelector

    我正在使用 Web 组件和普通 javascript 构建一个应用程序 我想使用 vaadin router 进行路由 In my 索引 html我只显示Web组件app module
  • 字符在字符串数组中出现的最大次数

    在 C 中 给定数组 string myStrings new string test test test Winner outputs 6 如何找到该字符出现的最大次数 出现在单个字符串中 我当前的解决方案是 int maxOccurre
  • WP7:获取手机名称

    我正在寻找一个简单的信息 我想获取用户当前使用的设备的名称 例如 我想获取 Eric s Phone 就像在 Zune 中一样 是否可以 我寻找设备扩展属性 参见link 或 UserExtendedProperties 参见link 谢谢
  • 具有评分函数和改装参数的 GridSearchCV

    我的问题似乎类似于this one但那里没有可靠的答案 我正在进行多类多标签分类 为此我定义了自己的评分器 然而 为了有refit参数并获得模型的最佳参数 最后我们需要引入一个评分函数来进行改装 如果我这样做 我会收到以下错误missing
  • 如何以成对方式添加两个数组

    我想将两个具有相同长度的 JavaScript 数组的值相加以获得第三个数组 以便第三个数组的第一个值是两个第一个数组的第一个值的总和 第三个数组的第二个值是array 是前两个数组的第二个值的总和 依此类推 例如 var array1 1
  • z-index 不适用于固定定位

    我有一个div使用默认定位 即position static and a div with a fixed位置 如果我设置元素的 z 索引 似乎不可能使固定元素位于静态元素后面 over width 600px z index 10 und
  • Service Fabric 多租户

    我们计划将 Azure Service Fabric 用于面向数据的多租户应用程序 通常有 100 多个客户 每个客户有 5 100 个用户 查看文档 我得出的结论是 最好的方法是为每个客户使用应用程序实例 而不是尝试使用配置文件来实现多租
  • 如何为 JTextPane 内的文本设置删除线和下划线样式选项?

    我有一个 JTextPane 组件 我试图将用户输入的文本样式设置为同时带有下划线和删除线 应该将下一个键入的字符的删除线属性设置为 true 的相关代码片段是这样的 JEditorPane editor getEditor e if ed
  • Windows Phone 7 键盘尺寸

    我想在键盘出现在屏幕上时调整页面大小 我一整天都在寻找任何线索 但什么也没找到 就我而言 我想要完整的页面文本框和它下面的一些按钮
  • 快速绘制多个图表的计时问题

    在下面的代码中 我正在进行一个实验 我需要每秒绘制近 10 个图表 时间间隔 100 总共 50 个图表 但是 当我减少时间间隔时时间间隔 第 120 行向下到底部 从 200 毫秒到 100 毫秒 代码引发下面的异常 我已经厌倦了 inv