2011-12-19 11 views
5

Esto me ha estado molestando por un tiempo. Si defino setText en un JButton antessetAction definición, el texto desaparece:Java - El texto JButton desaparece si actionPerformed se define después

JButton test = new JButton(); 
test.setText("test"); // Before - disappears! 
test.setAction(new AbstractAction() { 
    public void actionPerformed(ActionEvent e) { 
     // do something 
    } 
}); 
this.add(test); 

Si se trata de después, no hay problemas.

JButton test = new JButton(); 
test.setAction(new AbstractAction() { 
    public void actionPerformed(ActionEvent e) { 
     // do something 
    } 
}); 
test.setText("test"); // After - no problem! 
this.add(test); 

Por otra parte, si fijo el texto en el constructor JButton, está bien! Yarghh!

¿Por qué sucede esto?

+0

Gracias amigos, + 1s por todas partes. 7 minutos para ir. – Ben

Respuesta

7

Como se describe en la documentation:

Ajuste de los resultados de la acción en el cambio inmediatamente todas las propiedades descritos en Componentes Swing acción de apoyo.

Estas propiedades se describen here, e incluyen texto.

+0

Pistola más rápida en el oeste ... y con documentación también. – Ben

+0

"En caso de duda, consulte la documentación" ... – MByD

1

Tenga una mirada en

private void setTextFromAction(Action a, boolean propertyChange) 

en AbstractButton. Puedes ver que está llamando a setText() en función de la acción.

Parece que puede llamar al setHideActionText(true); para solucionar su problema.

+0

http://docs.oracle.com/javase/7/docs/api/javax/swing/Action.html#buttonActions Llamo a setHideActionText (verdadero) antes de establecer la acción pero no está funcionando, el texto es todavía vacíoPara resolver esto, simplemente guardé el texto en una variable temporal y lo ajustó después de configurar la acción ... no es lujoso, pero funciona. Cualquier sugerencia para escribir un código mejor es bienvenida. –

1

Esto es porque Action también tiene un nombre para el control. Como no está estableciendo ningún nombre en la Acción, se establece en una cadena vacía.

0

1) Listeners poner todos los eventos a la EDT,

2) todos los eventos son waiting in EDT y salida a la pantalla se haría en un momento

3) que tiene que dividir que a los dos separados Action dentro Listener

+0

-1 viñetas aleatorias, no relacionadas con la pregunta – kleopatra

0

Si sólo desea controlar el evento, que no es necesario Action. Se puede añadir una ActionListener:

JButton test = new JButton(); 
test.setText("test"); 
test.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     // do something 
    } 
}); 
this.add(test); 

Calling setAction anulaciones de texto pre-establecido.

Cuestiones relacionadas