2012-07-27 30 views
1

我在使用Java時遇到了JFreeChart的一些問題。 我正在從遠程數據庫中檢索數據,以使它們從我的應用程序顯示在面板中。帶動態數據的Java JFreeChart

  1. 問題:當我得到數據時,它不直接顯示在面板上。我必須最小化和最大化表單以使數據加載。

  2. 我需要這些數據才能刷新每分鐘。我在想Timer,但我真的不知道如何整合它。

下面是部分代碼:

import java.io.BufferedReader; 
import java.net.Socket; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.util.List; 
import java.util.ArrayList; 
import javax.swing.JPanel; 

public class GetRequest implements Runnable{ 

    public BufferedReader _input = null; 
    public Socket clientSocket = null; 
    public DrawChart draw; 
    public List<Double> values_1, values_2, values_3, values_4; 
    public JPanel _panel; 

    public GetRequest(Socket socket, JPanel panel){ 
     clientSocket = socket; 
     draw = new DrawChart(); 
     _panel = panel; 
     values_1 = new ArrayList<Double>(); 
     values_2 = new ArrayList<Double>(); 
     values_3 = new ArrayList<Double>(); 
    } 

    @Override 
    public void run(){ 
     while(true){ 

      try{ 
       _input = new BufferedReader(
        new InputStreamReader(clientSocket.getInputStream())); 
       String line = _input.readLine(); 

       String[] clineComat = line.split (","); 
       for(int i = 0 ;i<clineComat.length;i++){ 

        String[] clineSemiComa_ = clineComat[i].split (";"); 
        System.out.println(">"+clineComat[i]); 
        values_1.add (Double.parseDouble (clineSemiComa_[0])+1); 
        values_2.add (Double.parseDouble (clineSemiComa_[1])+1); 
        values_3.add (Double.parseDouble (clineSemiComa_[2])); 
       } 

       EventQueue.invokeLater (new Runnable(){ 
       public void run(){ 
        draw.displayPie (_panel, values_1, values_2, values_3); 
       } 
      }); 
      } 
      catch(IOException e){e.printStackTrace();} 
     } 
    }} 

,這是的DrawChart.java

import org.jfree.chart.ChartFactory; 
import org.jfree.chart.ChartPanel; 
import org.jfree.chart.JFreeChart; 
import org.jfree.data.general.DefaultPieDataset; 
import javax.swing.JPanel; 
import java.awt.BorderLayout; 
import org.jfree.chart.plot.PlotOrientation; 
import java.awt.Dimension; 
import org.jfree.data.category.DefaultCategoryDataset; 
import org.jfree.data.category.CategoryDataset; 
import java.util.List; 
import java.lang.Float; 
import java.util.Timer; 
import java.util.TimerTask; 

public class DrawChart { 

    public void displayPie(JPanel jpanel, List<Double> values_1, List<Double> values_2, List<Double> values_3) { 

     CategoryDataset data = createDataset(values_1, values_2, values_3); 
     //create a chart... 
     JFreeChart chart=ChartFactory.createBarChart ("", null, null, data, PlotOrientation.VERTICAL, true, true, false); 
     chart = ChartFactory.createLineChart ("", null, null, data, PlotOrientation.VERTICAL, true, true, false); 

     //create and display a frame... 
     ChartPanel panel=new ChartPanel(chart); 
     panel.setPreferredSize (new Dimension(700,300)); 
     jpanel.setLayout(new java.awt.BorderLayout()); 
     jpanel.add (panel, BorderLayout.CENTER); 
     jpanel.setVisible(true); 
     } 

    public static CategoryDataset createDataset(List<Double> a, List<Double> b, List<Double> c) { 

     String series1 = "Series1"; 
     String series2 = "Series2"; 
     String series3 = "Series3"; 

     final DefaultCategoryDataset dataset = new DefaultCategoryDataset(); 

     if(a.size() != 0 && b.size() != 0 && c.size() != 0) { 

      for(int i=0;i<a.size();i++) { 
       dataset.addValue(a.get (i), series1, i+1+""); 
      } 

      for(int i=0;i<b.size();i++) { 
       dataset.addValue(b.get (i), series2, i+1+""); 
      } 

      for(int i=0;i<c.size();i++) { 
       dataset.addValue(c.get (i), series3, i+1+""); 
      } 

     } 

     return dataset; 
    } 
} 

我怎樣才能解決這個問題的代碼?有沒有人做過類似的? 感謝

回答

2

我可俯瞰JFreeChart的問題,但在Swing 必須繪製發生在event dispatch thread。相比之下,您致電displayPie()發生在GetRequest的匿名Runnable。常見的補救措施包括以下:

  • EventQueue.invokeLater所示here

  • SwingWorker,說明here

  • javax.swing.Timer定期更新,圖示herehere

+0

嗨@trashgod我編輯了代碼並添加了你所說的但沒有任何事情發生。仍然遇到同樣的問題。當JFreeChart加載它沒有顯示,我必須儘量減少和最大化之前,我看到它在JPanel – DeathCoder 2012-07-30 07:17:24

+0

沒有你[[sscce](http://sscce.org/)我不知道。你可以嘗試'revalidate();在'jpanel.add()'後面重繪()'。更新模型會更容易。 – trashgod 2012-07-30 15:08:47

+0

感謝它現在的作品 – DeathCoder 2012-09-04 07:28:33