2011-09-07 64 views
7

我正在開發一個應用程序,我希望用戶可以通過更新JTextArea的內容來觸發某些事件,也可以通過按JButton來手動觸發。在DocumentListener中使用動作

我已經完成了第一部分,使用DocumentListener並將相關代碼放入其insertUpdate方法中。

我以前沒有用過Action,但是我聽說它們對於需要某些東西被多個控件觸發的情況很有用。是否有可能從DocumentListener觸發操作?是不是一個好主意,或者我應該把我的代碼放在一個普通的方法中?

(在構造函數):

textAreaInput.getDocument().addDocumentListener(new DocumentListener() { 
     public void insertUpdate(DocumentEvent e) { 
      // do something 
     } 
     public void removeUpdate(DocumentEvent e) {} 
     public void changedUpdate(DocumentEvent e) {} 
    }); 

和操作,這是一個字段:

Action doSomething = new AbstractAction("Do Something!") { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     // do it 
    } 
}; 

澄清:

的JTextArea中會收到在粘貼的文本由我想要自動解析的用戶提供。解析依賴於GUI中別處設置的其他值;如果用戶更改這些其他值,他可能需要重新解析文本,因此需要通過按下按鈕來執行相同的操作。

回答

3

您可以調用actionPerformed()方法,無論它是否在Action中。有一個例子here

+0

「行動」的好處通常超過輕微的邊際開銷,如[這裏]所述(http://stackoverflow.com/questions/7253712/java-swing-using-actionmap/7255711#7255711)。 – trashgod

+0

你的意思是在insertUpdate方法中添加類似'doSomething.actionPerformed(new ActionEvent(???))'的東西? –

+0

是的;但是,正如@camickr指出的那樣,你必須決定是否有意義。爲什麼不只是一個普通的方法? – trashgod

4

我想通過用戶更新JTextArea的內容或通過按JButton來手動觸發某些內容。

這是沒有道理給我。

爲什麼要點擊一個按鈕調用與用戶在文本區域中輸入文本相同的動作?

我以前沒有使用過的動作,但我聽說他們是在你需要的東西由多個控件

該聲明是爲控制被觸發的情況下非常有用,用戶點擊,像JMenuItems,JButtons或在文本字段上敲擊Enter。一般而言,它們可以在使用ActionListner時使用。

一個DocumentListener不是一個ActionListener,所以我前面說過使用一個Action似乎並不合適。

我認爲你需要澄清你的要求。

編輯的基礎上,澄清

如果用戶改變這些值,他可能要重新解析文本

爲什麼用戶有選擇嗎?如果您更改文本區域的字體,文本,前景,背景以及它自動重新繪製的組件,則不必要求完成此操作。如果你看看這些方法的代碼,它們總是最終調用revalidate()和repaint()方法。

解析依賴於GUI中別處設置的其他值;

聽起來像你需要一個自定義的類。也許是一個ParsedTextArea或ParsedDocument。該類將包含可以在GUI中的其他位置設置的「屬性」。它會影響DocumentListener。它也會支持你的「parseTheText」方法。因此,無論何時更改屬性或生成DocumentEvent,您都會自動調用「parseTheText」方法。這樣您就不需要單獨的按鈕,並且組件將始終保持同步,因爲解析是自動的。

+0

我在上面的要求中添加了一些說明。我可能會誤解Actions的用途,所以也許你是對的,在這裏他們不合適。 –

+0

不錯的輪廓:-)只挑選 - 除了最可能的自定義類不會_implement_ DocumentListener(但是使用一個),也不擴展Document/TextComponent – kleopatra

+0

+1來詢問是否需要按鈕。 – trashgod

2

我認爲你不需要創建Action對象。您可以將ActionListener添加到Button,就像您已將DocumentListener添加到輸入的Document一樣。如果我沒有理解你的問題,可能是你應該做這樣的事情:

textInput.getDocument().addDocumentListener(new DocumentListener(){    
    @Override 
    public void insertUpdate(DocumentEvent e) { 
     doIt(); 
    }    
    @Override 
    public void removeUpdate(DocumentEvent e) {}     
    @Override 
    public void changedUpdate(DocumentEvent e) {} 
}); 

button.addActionListener(new ActionListener(){ 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     doIt(); 
    } 
}); 

doIt()是在其中,你會做你想做的事的方法。

+0

預計一些專家會在我的文章中添加一些建議。 – Mohayemin

+0

你得到你所要求的:-) -1贊成ActionListener over Action(規則是:使用最高的abstractcion,始終)+1常用方法 – kleopatra

+0

@kleopatra:謝謝。我從來沒有使用過Action。我訪問了你的個人資料,我同意我得到了我所要求的:)。 – Mohayemin