JFreeChart在线程的每次迭代中都不显示图形?

时间:2014-01-02 14:03:01

标签: java multithreading graph jfreechart

我在一个类中使用线程获取计数器值并在另一个线程中编写JFreeChart。在执行时,它可以交替工作,但最后只显示图形。它还将y轴标签值显示为Float,但实际检索值为int。我该如何解决这些问题?

        XYDataset Dataset;
        TimeSeries Series = new TimeSeries("Random Data");
        Second sec = new Second();
        ChartPanel CPanel;
        Value = Integer.parseInt(MySQLClass.Map_MySql.get(""+MainWindow.SelectedNode+""));

        String CounterName = MainWindow.SelectedNode.toString();
        Series.add(sec, Value);
        Dataset = new TimeSeriesCollection(Series);
        System.out.println("Ds="+Dataset);
        Chart = ChartFactory.createTimeSeriesChart(CounterName, "Time", "Range", Dataset, true, false, false);
        System.out.println("Chart Created");
        XYPlot Plot = (XYPlot)Chart.getPlot();
        Plot.setBackgroundPaint(Color.LIGHT_GRAY);
        Plot.setDomainGridlinePaint(Color.WHITE);
        Plot.setRangeGridlinePaint(Color.RED);
        Panel1.revalidate();
        CPanel = new ChartPanel(Chart);
        CPanel.setVisible(true);
        Panel1.add(CPanel);
        System.out.println("Chart Added");
        Panel1.validate();

        Thread.sleep((int)MainWindow.Interval_Combo.getSelectedItem() * 1000);
        System.gc();

这个线程用于访问那两个类

        while(true)
        {
            MySQLClass m = new MySQLClass();
            Thread t1 = new Thread(m);
            t1.start();
            t1.join();
            Graph g = new Graph();
            Thread t2 = new Thread(g);
            t2.start();
            t2.join();
        }

在MySql类中,我必须获取计数器名称和值,并以跟随方式将其存储在名为Map_Mysql的Hashmap中。

   while(rs.next())
   {
     Map_MySql.put(rs.getString(1), rs.getString(2));
   }

我不知道实际问题是什么,请解决这个问题。输出看起来像,

发生MySql com.mysql.jdbc.JDBC4Connection@2c8ab0
图表出现 42913个
Ds=org.jfree.data.time.TimeSeriesCollection@c204e809
发生MySql com.mysql.jdbc.JDBC4Connection@1930b4b
图表出现 44217

最后显示Y轴上的浮点值为最后一个值的图形,没有图形表示。

2 个答案:

答案 0 :(得分:1)

不要event dispatch thread (EDT)上睡觉。如Concurrency in Swing所示,使用工作线程在process()中更新EDT上的数据集。显示了一个完整的示例here

答案 1 :(得分:1)

对于第二个问题(整数轴标签而不是浮点数),可以通过调用轴上的setStandardTickUnits()方法来处理。您可以传递任何TickUnitSource,但最简单的可能是NumberAxis.createIntegerTickUnits()