Frage Java - JButton Text verschwindet, wenn actionPerformed danach definiert wird


Das nervt mich schon eine Weile. Wenn ich definiere setText auf einem JButton Vor Definieren setAction, der Text verschwindet:

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

Wenn es nach, keine Probleme.

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

Außerdem, wenn ich den Text im JButton-Konstruktor setze, ist es in Ordnung! Yarghh!

Warum passiert das?


5
2017-12-19 07:20


Ursprung


Antworten:


Wie in der Dokumentation:

Durch das Festlegen der Aktion werden alle Eigenschaften sofort geändert   beschrieben in Swing Components Supporting Action.

Diese Eigenschaften werden beschrieben Hierund Text enthalten.


7
2017-12-19 07:26



Schau es dir an

  private void setTextFromAction(Action a, boolean propertyChange)

in AbstraktButton. Sie können sehen, dass setText () basierend auf der Aktion aufgerufen wird.

Es sieht so aus als könntest du anrufen setHideActionText(true); um dein Problem zu lösen.


1
2017-12-19 07:25



Dies liegt daran, dass Action auch den Namen für das Steuerelement hat. Da Sie in der Aktion keinen Namen festlegen, wird er auf eine leere Zeichenfolge gesetzt.


1
2017-12-19 07:26



1) Zuhörer setze alle Events in den EDT,

2) alle Ereignisse sind Warten im EDT und die Ausgabe an den Bildschirm würde in einem Moment erfolgen

3) Sie müssen das auf die zwei separaten teilen Action Innerhalb Listener


0
2017-12-19 07:27



Wenn Sie nur das Ereignis behandeln möchten, brauchen Sie nicht Action. Sie können ein hinzufügen ActionListener:

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

Berufung setAction überschreibt vordefinierten Text.


0
2017-11-15 13:11