Ein Action Objekt für einen JButton, jedoch ohne Action-Text?

DarthShader

Erfahrenes Mitglied
Hallo,

ich würde gerne eine AbstractAction (javax.swing.AbstractAction) mehrere JButtons hinzufügen. Was ich jedoch nicht möchte ist, dass der Text der Action den Text des Button setzt.

Da ich für die Buttons leicht verschiedene Beschriftungen benötige, ist es ärgerlich, dass das Setzen der Action die Beschriftung der Buttons ändert.

Kann man das irgendwie verhindern?


Vielen Dank für Eure Hilfe
 
Hallo,

ich "konstruier" mal etwas, ist aus dem Kopf geschrieben, also keine Garantie ;) Aber es spiegelt exakt die Problematik wieder:


Eine Action wird definiert:

Java:
public class MyAction extends AbstractSatelliteAction {
	@Override
	public void actionPerformed( ActionEvent e ) {
		System.out.println( "action" );
	}
}

Und so wird sie verwendet:

Java:
// Irgendwo in einer GUI-Klasse:

MyAction myAction = new MyAction();

JButton button = new JButton
button.setText("Action ausführen");
button.setAction( myAction );



Der Button hat dann nicht mehr den Text "Action ausführen", sondern gar keinen Text mehr (da ich den Text der Action nicht gesetzt habe). Ich möchte aber meine normale Button-Beschriftung erhalten. (Ich kann die Button-Klasse nicht verändern, z.B. ableiten, weil es sich um ein großes Projekt handelt und ich nicht anfange, alle Buttons zu ersetzen.)

Also die Frage ist nochmal, kann ich verhindern, dass der Button den Action Text übernimmt?
 
Hallo,
und wenn du erst die Action und dann den Text setzt - d.h. die beiden entsprechenden Code-Zeilen vertauschst - müsste es doch gehen?
 
Hi,

das ist eben das Problem dieser konstruierten Beispiele :) Das obige ist viel zu trivial und spiegelt die Applikation nicht wieder, sondern nur die Problemstellung.

Das Tauschen der beiden Zeilen ist keine annehmbare Lösung. Was, wenn später die Action nochmal gesetzt wird, oder durch eine andere aktualisiert wird?

Ich dachte, man könne die Action irgendwie so parametrisieren, dass nur bestimmte Properties gesetzt werden. Ich glaube, das Setzen der Properteis wie z.B. der Buttontext kommt vom Button selbst, oder? Sonst hätte ich ja meine Action zu umschreiben können, dass das Text Property des Buttons nicht gesetzt wird, aber das geht glaube ich nicht.
 
Und wenn du in deiner Action einfach den Text holst und am Ende wieder setzt?

ps: Keine Garantie, dass ich dein Problem verstanden habe ;)
 
Die Frage ist eher wieso du für die gleiche Aktion unterschiedliche Labels benötigst.

Eine Aktion hat nunmal ein eindeutiges Label.

Wenn du unterschiedliche Labels brauchst deutet das eher darauf hin, dass du unterschiedliche Aktionen hast, die dann in eigenen Ableitungen von AbstractAction umgesetzt werden sollten.
 
Zuletzt bearbeitet:
Hi,

[... ]Ich glaube, das Setzen der Properteis wie z.B. der Buttontext kommt vom Button selbst, oder? Sonst hätte ich ja meine Action zu umschreiben können, dass das Text Property des Buttons nicht gesetzt wird, aber das geht glaube ich nicht.

Da hast Du Recht. Sobald du setAction(...) ausführst wird unter anderem diese Methode aus der AbstractButton-Klasse ausgeführt:

Java:
protected void configurePropertiesFromAction(Action a) {
        setMnemonicFromAction(a);
        setTextFromAction(a, false);
        AbstractAction.setToolTipTextFromAction(this, a);
        setIconFromAction(a);
        setActionCommandFromAction(a);
        AbstractAction.setEnabledFromAction(this, a);
        if (AbstractAction.hasSelectedKey(a) &&
                shouldUpdateSelectedStateFromAction()) {
            setSelectedFromAction(a);
        }
        setDisplayedMnemonicIndexFromAction(a, false);
    }

Dort wird auch der Text gesetzt...
 
Die Lösung wäre also, eine eigene Klasse MyButton abzuleiten und die obene genannte Methode zu überschreiben.
und darin dann kein setText() aufzurufen.
 
Zurück