2013-01-22 37 views
-1

,這裏是我的問題: 交通是一個JTextArea,我插入文本從一個串口快到了,我沒有實現一個的DocumentListener:的paintComponent()條件

Java代碼:

Traffic.getDocument(). AddDocumentListener (new MyDocumentListener()); 

中的JTextArea「交通「顯示我想要什麼,程序運行沒有任何問題。 現在我想要做的是按行插入行爲(這是測試的目的),我將舉一個例子:

==>我收到了「掛機」,我把一個圖像放在手機的JPanel上,如果我收到「OFF-HOOK」,我把一個圖像放到手機的JPanel中,摘機並且列表中會顯示...

我沒有undrestand如何做到這一點,當我想要如何調用paintComponent並使其繪製我想要的,因爲我只能在paintComponent()中執行圖形操作。 這是對的DocumentListener類:

protected class MyDocumentListener extends JPanel implements javax.swing.event.DocumentListener 
{ 
@Override 
    public void changedUpdate(javax.swing.event.DocumentEvent e) { 
    // text has been altered in the textarea 

    } 

@Override 
    public void insertUpdate(javax.swing.event.DocumentEvent e) 
    { 
     // text has been added to the textarea 
    try { 

     if (!Traffic.getText(Traffic.getLineStartOffset(Traffic.getLineCount()-1),Traffic.getLineEndOffset(Traffic.getLineCount()-1)-Traffic.getLineStartOffset(Traffic.getLineCount()-1)).contains(">>")) 
     { 

      if (Traffic.getLineCount() == (lastreplace + 2)) 
      { 
       System.err.println(Traffic.getText(Traffic.getLineStartOffset(lastreplace),Traffic.getLineEndOffset(lastreplace) - Traffic.getLineStartOffset(lastreplace))); 
      lastreplace +=1; 

      } 


      else 
      { 
      System.err.println(Traffic.getText(Traffic.getLineStartOffset(lastreplace), 
         Traffic.getLineEndOffset(lastreplace) - 
           Traffic.getLineStartOffset(lastreplace))); 
      } 
     } 
     Traffic.setCaretPosition(Traffic.getDocument().getLength()); 

    } catch (BadLocationException ex) { 
     Logger.getLogger(TrafficSerialPort.class.getName()).log(Level.SEVERE, null, ex); 
    } 

} 

@Override 
public void removeUpdate(javax.swing.event.DocumentEvent e) { 
    // text has been removed from the textarea 

} 

} 

我試圖用一種叫做"PortArchitecture (..)"方法會得出什麼我想我用getGraphics()但有人告訴我,它不應該被用來paintComponent(),現在我真的卡住請幫忙。

+3

1)*「我想要一個entant數據」 *什麼是「entant ' 意思? 2)爲了更快地獲得更好的幫助,請發佈[SSCCE](http://sscce.org/)。 3)對代碼塊使用一致的邏輯縮進。代碼的縮進旨在幫助人們理解程序流程。 4)你的問題是什麼? –

+0

完成,並感謝安德魯希望現在清楚 –

回答

1

首先,我不會在文檔監聽器中這樣做。從串行端口讀取一行時,您已經有了更新JTextAea的方法。我會在這同樣的方法改變顯示的圖像:

private void lineReceivedFromSerialPort(String line) { 
    traffic.append(line); 
    updateImage(line); 
} 

而要改變形象,我不會用paintComponent()可言。只要有一個JLabel somwewhere在你的面板,並且當接收到一條線,加載相應的圖像圖標並將其設置爲標籤:

private void updatImage(String line) { 
    ImageIcon iconToDisplay = null; 
    if (line.equals("ON-HOOK")) { 
     iconToDisplay = phoneOnIcon; 
    } 
    else if (line.equals("OF-HOOK")) { 
     iconToDisplay = phoneOffIcon; 
    } 
    ... 
    imageLabel.setIcon(iconToDisplay); 
} 
+0

謝謝,但我需要把圖像放在一個JPanel的原因,當所有的傳輸或通信從串口停止我會有一個完整的picture.What我想獲得的是一個電話網絡這就是爲什麼我無法分清我正在繪製的東西,不僅有圖像,而且還有我需要在JPanel上繪製的字符串和線條。 –

+0

然後每次您收到一行時,都要更改必須繪製的數據的狀態,並調用repaint()。在paintComponent()方法中,讀取數據並繪製它。 –

+0

感謝您的快速響應,但我將如何更改數據的狀態?請你給我舉個例子吧! –