2011-04-30 14 views
1

我正在使用JChart2d(http://jchart2d.sourceforge.net/index.shtml)動態跟蹤雙數組的值。當我在主要方法中編寫配置並運行它時,它運行得很完美。如何使用另一個JFrame調用JChart2D動態圖

enter image description here

這裏是代碼。

public class WaveTracer { 

    ITrace2D trace ; 
    Chart2D chart ; 
    double dataArray []; 
    JFrame frame; 

public WaveTracer(int limit , double [] data){ 

trace = new Trace2DLtd(limit); 

    dataArray = data; 

} 

public void configure(String framename, int fwidth , int fheight, int xpos , int ypos){ 
    try{ 

    chart = new Chart2D(); 

    trace.setColor(Color.RED); 

    frame = new JFrame(framename); 

    frame.addWindowListener(new WindowAdapter() { 
     /** 
     * @see java.awt.event.WindowAdapter#windowClosing(java.awt.event.WindowEvent) 
     */ 

     @Override 

     public void windowClosing(final WindowEvent e) { 

      System.exit(0); 

     } 

     }); 

     frame.getContentPane().add(chart); 

     frame.setSize(fwidth, fheight); 

     frame.setLocation(xpos, ypos); 

    }catch (Throwable f) { 
     System.exit(0); 
    } 
} 

public void trace(int speed) throws InterruptedException{ 

    frame.setVisible(true); 

    chart.addTrace(trace); 

     for (int j = 0; j < dataArray.length; j++) { 

      trace.addPoint(j,dataArray[j]); 

      Thread.sleep(speed); 

     } 

    System.exit(0); 

} 

public static void main(String args []){ 

     Random random = new Random(); 

    double d[] = new double[2000]; 

    int count=1; 

    for(int i=200;i>=0;i--){ 

     d[200-i] = random.nextDouble()*10.0; 

    } 

     WaveTracer wavetracer = new WaveTracer(5000, d); 

     wavetracer.configure("plying wave form with time", 1000, 500, 200, 200); 

     try { 

      wavetracer.trace(150); 

     } catch (InterruptedException ex) { 

      Logger.getLogger(FrequencyDitectorForm.class.getName()).log(Level.SEVERE, null, ex); 
     } 

} 

} 

但我需要繪製圖表,當我點擊一個「繪製」按鈕,在另一種形式。我創建了一個包含「Draw」按鈕的表單,並將以下代碼添加到動作單擊中。

JFrame dialog = new JFrame(); 

Random random = new Random(); 

    double d[] = new double[2000]; 

    int count=1; 

    for(int i=200;i>=0;i--){ 

     d[200-i] = random.nextDouble()*10.0; 

    } 

WaveTracer wavetracer = new WaveTracer(5000, d); 

     wavetracer.configure("plying wave form with time", 1000, 500, 200, 200); 

     try { 

      wavetracer.trace(150); 
     } catch (InterruptedException ex) { 
      Logger.getLogger(FrequencyDitectorForm.class.getName()).log(Level.SEVERE, null, ex); 
     } 

enter image description here

但是當我點擊該按鈕只有新的框架加載和顯示沒有在框架中。然後我通過在循環中添加一個消息框來測試循環。在這種情況下,它會顯示循環的每次迭代的圖形。

enter image description here

可以有一個人請幫助我在這個問題上。我怎樣才能從一個單獨的表單繪製此圖,而不會在循環的每個循環中觸發一個消息框。

回答

1

您在Event Dispatch Thread或EDT(主負責繪圖和用戶交互的主Swing線程)上調用Thread.sleep(...),從而使整個GUI進入睡眠狀態。不要這樣做,而是使用Swing Timer或後臺線程。

此外,只是一個設計問題:你確定你想要顯示在一個單獨的JFrame而不是JPanel,或者如果你需要一個單獨的窗口,一個JDialog?你確定你想從圖形類中調用System.exit(0)嗎?

+0

嗨氣墊船,謝謝你的提示。我將它改爲定時器,然後用我的代碼刪除這些system.exit(0)。現在它工作正常。然後我用JDialog替換了jFrame。現在它工作正常。 :) – Thilanka 2011-05-02 04:16:36

+0

@Thilanka:很高興它有幫助,但你可能再次想要接受我的答案,然後在你以前的線程中的其他答案。 – 2011-05-02 04:27:10

1

您使用的是jchart2d的最新版本3.2.1嗎?我修復了一些與「treelock」有關的僵局。如果是這樣,我必須看得更近。然後,我建議你提交一個錯誤以及你的代碼。

親切的問候, 阿希姆

相關問題