2011-09-07 14 views
7

Sto sviluppando un'applicazione in cui voglio che venga attivato qualcosa sia dall'utente che aggiorna il contenuto di un JTextArea, sia manualmente premendo un JButton.Uso di Actions con DocumentListener

Ho eseguito la prima parte utilizzando DocumentListener e inserendo il codice pertinente nel suo metodo insertUpdate.

Non ho usato prima Action s, ma ho sentito che sono utili per situazioni in cui è necessario attivare un'azione da più controlli. È possibile attivare l'azione da DocumentListener? È una buona idea usare le azioni o dovrei semplicemente inserire il mio codice in un metodo normale?

(nel costruttore):

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

e l'azione, che è un campo:

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

precisazione:

Il JTextArea riceveranno testo che viene incollato in dall'utente, che voglio analizzare automaticamente. L'analisi dipende da altri valori impostati altrove nella GUI; se l'utente cambia questi altri valori, potrebbe voler ri-analizzare il testo, quindi la necessità di eseguire la stessa azione premendo un pulsante.

risposta

3

È possibile richiamare il metodo actionPerformed(), indipendentemente dal fatto che si trovi in ​​un Action o meno. C'è un esempio here.

+0

I vantaggi di "Azione" generalmente superano il lieve sovraccarico marginale, come menzionato [qui] (http://stackoverflow.com/questions/7253712/java-swing-using-actionmap/7255711#7255711). – trashgod

+0

Vuoi dire aggiungere qualcosa come 'doSomething.actionPerformed (new ActionEvent (???))' nel metodo insertUpdate? –

+0

Sì; ma, come nota @camickr, dovrai decidere se ha senso farlo. Perché non solo calla un metodo comune? – trashgod

4

Voglio che qualcosa venga attivato sia dall'utente che aggiorna il contenuto di un JTextArea, sia manualmente premendo un JButton.

Questo non ha senso per me.

Perché fare clic su un pulsante richiama la stessa azione di un utente che digita testo in un'area di testo?

Non ho usato azioni prima, ma ho sentito dire che sono utili per le situazioni in cui è necessario qualcosa che deve essere innescato da più controlli

Tale affermazione è destinato per i controlli che l'utente fa clic , come JMenuItems, JButtons o premendo Invio su un campo di testo. In generale possono essere utilizzati quando si utilizza ActionListner.

Un DocumentListener non è un ActionListener così come ho affermato in precedenza l'uso di un'azione non sembra appropriato.

Penso che sia necessario chiarire il requisito.

Modifica, sulla base di un chiarimento

se l'utente cambia questi altri valori, si può decidere di ri-analizzare il testo

Perché l'utente ha una scelta? Se modifichi il carattere, il testo, il primo piano, lo sfondo di un'area di testo, il componente che ridisegna automaticamente, non devi chiedere che questo venga eseguito.Se si guarda il codice per questi metodi, finiscono sempre per invocare i metodi revalidate() e repaint().

L'analisi dipende da altri valori impostati altrove nella GUI;

Sembra che tu abbia bisogno di una lezione personalizzata. Forse un ParsedTextArea o ParsedDocument. Questa classe conterrà le "proprietà" che possono essere impostate altrove nella GUI. Avrebbe impiantato il DocumentListener. Supporterà anche il tuo metodo "parseTheText". Pertanto, ogni volta che una proprietà viene modificata o viene generato un oggetto DocumentEvent, viene automaticamente richiamato il metodo "parseTheText". In questo modo non hai bisogno di un pulsante separato e il componente sarà sempre sincronizzato perché l'analisi è automatica.

+0

Ho aggiunto alcuni chiarimenti sulla mia richiesta di cui sopra. Potrei non capire a cosa servono le Azioni, quindi forse hai ragione e non sono appropriate qui. –

+0

nice outline :-) solo nitpicking - eccetto che molto probabilmente la classe custom non dovrebbe _implement_ un DocumentListener (ma ne usa uno) né estendere Document/TextComponent – kleopatra

+0

+1 per mettere in discussione la necessità del pulsante. – trashgod

2

Penso che non sia necessario creare l'oggetto Azione. È possibile aggiungere ActionListener al pulsante proprio come è stato aggiunto DocumentListener al documento di input. Se ho capito bene il problema, può essere che si dovrebbe fare qualcosa di simile:

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() è un metodo in cui si farà quello che volevi fare.

+0

Mi aspettavo che alcuni esperti aggiungano qualche raccomandazione sul mio post. – Mohayemin

+0

ottieni ciò che hai chiesto :-) -1 per favorire ActionListener su Action (la regola è: Usa la più alta abstractcion disponibile, sempre) +1 per il metodo comune – kleopatra

+0

@kleopatra: Grazie. Non ho mai usato l'azione in realtà. Ho visitato il tuo profilo e sono d'accordo che ho ottenuto quello che ho chiesto :). – Mohayemin