2011-09-07 8 views
7

Estoy desarrollando una aplicación en la que deseo que se active algo tanto por parte del usuario actualizando el contenido de un JTextArea, como manualmente presionando un JButton.Uso de Actions with DocumentListener

He hecho la primera parte utilizando un DocumentListener y poniendo el código correspondiente en su método insertUpdate.

No he usado Action antes, pero he oído que son útiles para situaciones donde necesita que se activen varios controles. ¿Es posible activar la acción desde DocumentListener? ¿Es una buena idea usar Actions en absoluto, o debería poner mi código en un método normal?

(en el constructor):

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

y la acción, que es un campo:

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

aclaración:

El JTextArea recibirá el texto que se pega en por el usuario, que quiero analizar automáticamente. El análisis depende de otros valores establecidos en otra parte de la GUI; si el usuario cambia estos otros valores, es posible que desee volver a analizar el texto, de ahí la necesidad de realizar la misma acción presionando un botón.

Respuesta

3

Puede invocar el método actionPerformed(), ya sea en un Action o no. Hay un ejemplo here.

+0

Las ventajas de 'Action' generalmente superan la ligera sobrecarga marginal, como se menciona [aquí] (http://stackoverflow.com/questions/7253712/java-swing-using-actionmap/7255711#7255711). – trashgod

+0

Quieres decir agregar algo como 'doSomething.actionPerformed (new ActionEvent (???))' en el método insertUpdate? –

+0

Sí; pero, como dice @camickr, tendrás que decidir si tiene sentido hacerlo. ¿Por qué no simplemente calla un método común? – trashgod

4

Quiero que se active algo tanto por parte del usuario actualizando los contenidos de un JTextArea, como manualmente presionando un JButton.

Esto no tiene sentido para mí.

¿Por qué hacer clic en un botón invocar la misma acción que un usuario escribiendo texto en un área de texto?

No he utilizado acciones antes, pero he oído que son útiles para situaciones donde se necesita algo para ser accionado por múltiples controles

Esa declaración es para controles que el usuario hace clic , como JMenuItems, JButtons o pulsando Enter en un campo de texto. En general, pueden usarse cuando usa un ActionListner.

Un DocumentListener no es un ActionListener, como dije antes, el uso de una Acción no parece apropiado.

Creo que necesita aclarar su requisito.

Editar, basado en la clarificación

si el usuario cambia estos otros valores, es posible que desee volver a analizar el texto

¿Por qué el usuario tiene una opción? Si cambia la fuente, el texto, el primer plano, el fondo de un área de texto, el componente se vuelve a pintar automáticamente, no tiene que pedir que lo haga.Si observa el código de estos métodos, siempre terminan invocando los métodos revalidate() y repaint().

El análisis depende de otros valores establecidos en otra parte de la GUI;

Parece que necesita una clase personalizada. Tal vez un ParsedTextArea o ParsedDocument. Esta clase contendría las "propiedades" que se pueden establecer en otro lugar en la GUI. Implicaría el DocumentListener. También sería compatible con su método "parseTheText". Por lo tanto, cada vez que se cambia una propiedad o se genera un evento DocumentEvent, se invoca automáticamente el método "parseTheText". De esta manera no necesita un botón por separado y el componente siempre estará sincronizado porque el análisis es automático.

+0

He agregado algunas aclaraciones sobre mi requisito anterior. Podría estar entendiendo mal para qué son las Acciones, así que quizás tengas razón y no sean apropiadas aquí. –

+0

con un buen contorno :-) solo con nitidez, excepto que lo más probable es que la clase personalizada no implemente un DocumentListener (pero use uno) ni extienda Document/TextComponent – kleopatra

+0

+1 para cuestionar la necesidad del botón. – trashgod

2

Creo que no necesita crear el objeto Acción. Puede agregar ActionListener al botón del mismo modo que ha agregado DocumentListener al documento de la entrada. Si lo entiendo correctamente su problema, puede ser que usted debe hacer algo como esto:

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() es un método en el que va a hacer lo que quería hacer.

+0

Esperando que algunos expertos agreguen alguna recomendación sobre mi publicación. – Mohayemin

+0

obtienes lo que pediste :-) -1 para favorecer ActionListener sobre Action (la regla es: Utiliza la abstracción más alta disponible, siempre) +1 para el método común – kleopatra

+0

@kleopatra: Gracias. Nunca usé Action en realidad. Visité su perfil y acepto que obtuve lo que solicité :). – Mohayemin