2011-12-19 13 views
5

To od pewnego czasu mnie dręczy. Gdybym określić setText na JButton przed definiowania setAction tekst znika:Java - Tekst JButton znika, jeśli actionPerformed został zdefiniowany później

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

Jeśli to po, żadnych problemów.

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

Co więcej, jeśli ustawię tekst w konstruktorze JButton, jest w porządku! Yarghh!

Dlaczego tak się dzieje?

+0

Dzięki, chłopaki, + 1s dookoła. 7 minut przed końcem. – Ben

Odpowiedz

7

Jak opisano w documentation:

Ustawianie wyników działania w zmieniających się natychmiast wszystkie właściwości opisane w Swing Components wspieranie działań.

Właściwości te są opisane here i zawierają tekst.

+0

Najszybszy pistolet na zachodzie ... i także z dokumentacją. – Ben

+0

"W razie wątpliwości - zapoznaj się z dokumentacją" ... – MByD

1

Wystarczy popatrzeć na

private void setTextFromAction(Action a, boolean propertyChange) 

w AbstractButton. Możesz zobaczyć, że to wywołanie setText() na podstawie akcji.

Wygląda na to, że można zadzwonić pod numer setHideActionText(true);, aby rozwiązać problem.

+0

http://docs.oracle.com/javase/7/docs/api/javax/swing/Action.html#buttonActions Wywołuję setHideActionText (true) przed ustawieniem akcji, ale nie działa, tekst jest wciąż pusta.Aby rozwiązać ten problem, po prostu zapisałem tekst w zmiennej tymczasowej i przywróciłem go po ustawieniu akcji ... nie jest to wymyślne, ale działa. Wszelkie sugestie dotyczące pisania lepszego kodu są mile widziane. –

1

Dzieje się tak, ponieważ Action ma również nazwę dla kontroli. Ponieważ nie ustawiasz żadnej nazwy w Akcji, która jest ustawiona na pusty łańcuch.

0

1) Listeners umieścić wszystkie zdarzenia do EDT,

2) Wszystkie zdarzenia są waiting in EDT i wyjście do ekranu byłoby zrobić w jednej chwili

3) trzeba podzielić to na dwa oddzielne Action wewnątrz Listener

+0

-1 losowe pociski, niezwiązane z pytaniem – kleopatra

0

Jeśli chcesz tylko obsługiwać zdarzenie, nie trzeba Action. Można dodać ActionListener:

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

Wywołanie setAction nadpisuje wstępnie ustawiony tekst.

Powiązane problemy