2011-12-19 13 views
5

Questo mi ha infastidito per un po '. Se io definisco setText su un JButton prima definire setAction, il testo scompare:Java - Il testo JButton scompare se actionPerformed è stato definito in seguito

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

Se è dopo, nessun problema.

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

Inoltre, se imposto il testo nel costruttore JButton, va bene! Yarghh!

Perché succede?

+0

Grazie ragazzi, + 1 tutto intorno. 7 minuti per andare. – Ben

risposta

7

Come descritto nella documentation:

Impostazione dei risultati di azione immediatamente cambiare tutte le proprietà descritti in Swing Components sostenere l'azione.

Queste proprietà sono descritte here e includono testo.

+0

La pistola più veloce ad ovest ... e anche con la documentazione. – Ben

+0

"In caso di dubbio - consultare la documentazione" ... – MByD

1

Dai un'occhiata alla

private void setTextFromAction(Action a, boolean propertyChange) 

in AbstractButton. Puoi vedere che sta chiamando setText() in base all'azione.

Sembra che è possibile chiamare il setHideActionText(true); per risolvere il problema.

+0

http://docs.oracle.com/javase/7/docs/api/javax/swing/Action.html#buttonActions Sto chiamando setHideActionText (true) prima di impostare l'azione ma non funziona, il testo è ancora vuoto.Per risolvere questo ho semplicemente salvato il testo in una variabile temporanea e l'ho reimpostato dopo aver impostato l'azione ... non di fantasia ma funziona. Qualsiasi suggerimento per scrivere un codice migliore è benvenuto. –

1

Questo perché Action ha anche il nome per il controllo. Dato che non stai impostando alcun nome nell'azione, viene impostato su una stringa vuota.

0

1) Listeners mettere tutti gli eventi alla EDT,

2) Tutti gli eventi sono waiting in EDT e output sullo schermo dovrebbe essere fatto in un momento

3) si deve dividere che per i due separati Action all'interno Listener

+0

-1 punti elenco casuali, non correlati alla domanda – kleopatra

0

Se si desidera solo per gestire l'evento, non è necessario Action. È possibile aggiungere un ActionListener:

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

Calling setAction le sostituzioni di testo pre-impostato.