Action before actionPerformed!

Status
Nicht offen für weitere Antworten.

jambusa

Mitglied
Hallo zusammen,

ich habe eine recht simple Anforderung, aber komme bisher zu keiner zufriedenstellenden Lösung und hoffe mir hier einen Ansatz holen zu können. Folgende vereinfachte Situation:

Ich habe eine Applikation mit mehreren Buttons. Diese sind setFocusable( false ); eingestellt. Aus diesem Grund habe ich meine eigene Buttonklasse geschrieben, die sich standardmäßig nicht fokussieren lässt (natürlich kann die noch mehr, aber für diese Situation unerheblich).

Im Konstruktor dieser Klasse gebe ich jeweils eine Action mit. Nun habe ich festgestellt, dass bevor der Button seine actionPerformed ausführt noch immer eine andere bestimmte Action ausgeführt werden muss.

Ein FocusListener kommt nicht in Frage, da dieser Button kein Fokus erhalten kann und einen weiteren ActionListener anmelden sollte ich auch vermeiden, da ich meine gelesen zu haben, dass man sich auf die Reihenfolge nicht verlassen kann. Gibt es noch andere Optionen?

Hier ein zweckmäßiges Example:

Code:
public class ActionBeforeActionExample extends JFrame
{
  private ColorButton blue;
  private ColorButton green;
  private ColorButton red;

  public ActionBeforeActionExample()
  {
    setDefaultCloseOperation( EXIT_ON_CLOSE );
    setBounds( 200, 200, 300, 300 );
    setLayout( new FlowLayout() );
    initComponents();
    setVisible( true );
  }


  private void initComponents()
  {
    blue = new ColorButton( new ColorBlueAction() );
    blue.setText( "blue" );
    green = new ColorButton( new ColorGreenAction() );
    green.setText( "green" );
    red = new ColorButton( new ColorRedAction() );
    red.setText( "red" );

    add( blue );
    add( green );
    add( red );
  }

  private class ColorButton extends JButton
  {
    public ColorButton( Action action )
    {
      super( action );
      setFocusable( false );
    }
  }

  private class ColorBlueAction extends AbstractAction
  {
    @Override
    public void actionPerformed( ActionEvent e )
    {
      System.out.println( "setColor: -> Blue" );
    }
  }

  private class ColorRedAction extends AbstractAction
  {
    @Override
    public void actionPerformed( ActionEvent e )
    {
      System.out.println( "setColor: -> Red" );
    }
  }

  private class ColorGreenAction extends AbstractAction
  {
    @Override
    public void actionPerformed( ActionEvent e )
    {
      System.out.println( "setColor: -> Green" );
    }
  }

  private class ResetOldColorAction extends AbstractAction
  {
    @Override
    public void actionPerformed( ActionEvent e )
    {
      System.out.println( "reset Color!" );
    }
  }

  public static void main( String[] args )
  {
    new ActionBeforeActionExample();
  }
}

Wie implementier ich am geschicktesten, dass immer bevor eine Farbe initialisiert wird die ResetOldColorAction aufgerufen wird, egal welchen Button ich anklicke? Natürlich wäre eine Lösung ResetOldColorAction in allen Actions jeweils aufrufen zu lassen, aber das würd ich gern vermeiden, da es in der richtigen Applikation zahlreiche Actions sind, die dann überarbeitet werden müssten.

Hoffe ihr habt eine schöne objektorientierte Idee!

Vielen Dank,
MfG,
Jambusa
 

Michael...

Top Contributor
einen weiteren ActionListener anmelden sollte ich auch vermeiden, da ich meine gelesen zu haben, dass man sich auf die Reihenfolge nicht verlassen kann.
Das war mir jetzt nicht bewusst - bin allerdings noch nie in die Verlegenheit gekommen.
1. Möglichkeit: Das was in ResetOldColorAction ausgeführt wird - sofern noch nicht geschehen - in eine Methode auslagern und diese dann in den anderen Actions aufrufen
2. Möglichkeit: Alle betroffenen Actions von ResetOldColorAction erben lassen und dann in deren actionPerformed(..) zuerst super.actionPerformed() aufrufen.
 

Marco13

Top Contributor
Ohne da jetzt 100% in die Tiefe nachgedacht zu haben, was spontanes: Sowas wie eine
Java:
  private class ChainedAction extends AbstractAction
  {
    private Action actions[];

    public ChainedAction(Action ...actions)
    {
        this.actions = actions.clone(); // null-check etc...
    }

    @Override
    public void actionPerformed( ActionEvent e )
    {
      for (Action action : actions) action.actionPerformed(e);
    }
  }

Das kann man dann auf unterschiedliche Arten verwenden, z.B.
Java:
 private class ColorButton extends JButton
  {
    public ColorButton( Action action )
    {
      super( new ChainedAction(new ResetColorAction(), action) );
      setFocusable( false );
    }
  }

oder so...
 

jambusa

Mitglied
Hey, dank euch beiden für die Vorschläge. Entschieden hab ich mich für die Implementierung von marco13. Sehr gute Idee, genau dass was ich gesucht habe. Ärgere mich, dass ich nicht selber drauf gekommen bin.

Vielen Dank,
Jambusa
 

Marco13

Top Contributor
Ggf. müßte/sollte bei diesen Buttons dann noch setAction passend überschrieben werden, damit das Verhalten konsistent ist...
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M JavaFX Button action abhängigkeit von Tab AWT, Swing, JavaFX & SWT 1
B Probleme Action Listener Taschenrechner AWT, Swing, JavaFX & SWT 27
Z Befehl Action Event Verlassen AWT, Swing, JavaFX & SWT 4
J Action Listener Rückgabewert AWT, Swing, JavaFX & SWT 14
3 JComboBox - Action - Auslesen & Umwandeln AWT, Swing, JavaFX & SWT 9
J Java -8 Action Listener für mehrere Buttons AWT, Swing, JavaFX & SWT 9
S Action durchführen beim Programm beenden AWT, Swing, JavaFX & SWT 3
K Swing KeyBinding: Action wird nicht ausgelöst AWT, Swing, JavaFX & SWT 3
K Array von einer Action zur anderen bringen AWT, Swing, JavaFX & SWT 7
T action für Button übergeben - bitte um Segen AWT, Swing, JavaFX & SWT 1
F In Action Listener TextFields einlesen und prüfen. Abbruch bei falschen Eingaben. Wie mache ich das? AWT, Swing, JavaFX & SWT 2
G mehrere Action-Abfolgen erfassen AWT, Swing, JavaFX & SWT 6
I Button Action AWT, Swing, JavaFX & SWT 6
C Swing MenuItem feuert Action nur wenn disabled AWT, Swing, JavaFX & SWT 2
K Action Listener implementieren über Objekt AWT, Swing, JavaFX & SWT 14
H Problem mit dem Action listener.... AWT, Swing, JavaFX & SWT 2
J SWT Rechteck Füllfarbe wird bei Action falsch gefüll AWT, Swing, JavaFX & SWT 2
S Action Listener in innerer Klasse ausführen. AWT, Swing, JavaFX & SWT 8
D Drag-Action: Innerhalb meiner View? AWT, Swing, JavaFX & SWT 3
alex_fairytail Swing Textfeld Action wenn geschrieben wird? AWT, Swing, JavaFX & SWT 6
R innere Action -> auf äußeres this zugreifen AWT, Swing, JavaFX & SWT 3
L Action listener in bestimmter spalte AWT, Swing, JavaFX & SWT 2
P Action Event abfangen etwas anders? AWT, Swing, JavaFX & SWT 2
J AWT Action Listener etc. AWT, Swing, JavaFX & SWT 7
N Swing nach Fensterrand Action ausführen? HILFE AWT, Swing, JavaFX & SWT 7
L ComboBox in Action AWT, Swing, JavaFX & SWT 4
M SWT Jface Action und localised Strings AWT, Swing, JavaFX & SWT 6
I Button Action AWT, Swing, JavaFX & SWT 4
K GUI, Action AWT, Swing, JavaFX & SWT 4
B Frage zu Button-Action AWT, Swing, JavaFX & SWT 3
S Combo Box action listener AWT, Swing, JavaFX & SWT 2
A Action listener von Button AWT, Swing, JavaFX & SWT 5
K Swing Wie ändere ich die default action für Drag&Drop AWT, Swing, JavaFX & SWT 6
M JButton Action Problem AWT, Swing, JavaFX & SWT 3
K Action.MNEMONIC mit char belegen. AWT, Swing, JavaFX & SWT 2
M Action.DISPLAYED_MNEMONIC_INDEX_KEY geht nicht mehr AWT, Swing, JavaFX & SWT 2
O Action Event auslösen bei unbekanntem JTextField AWT, Swing, JavaFX & SWT 3
G SWT ApplicationActionBarAdvisor Action AWT, Swing, JavaFX & SWT 11
G Action? AWT, Swing, JavaFX & SWT 2
0 (Action)Listener auslagern? AWT, Swing, JavaFX & SWT 9
K kleine frage zum Spinner (bezüglich Action) AWT, Swing, JavaFX & SWT 2
F Problem mit Action Listener in privater inneren Klasse AWT, Swing, JavaFX & SWT 6
S Action Handler JButton AWT, Swing, JavaFX & SWT 15
S Buttons werden nach action grau AWT, Swing, JavaFX & SWT 4
S Action mit 2 verschiednen texten AWT, Swing, JavaFX & SWT 2
A SWT: Action über Hotkey ausführen AWT, Swing, JavaFX & SWT 2
G Action.setCheck(boolean)? AWT, Swing, JavaFX & SWT 6
A Mit der Combobox eine Action auslösen AWT, Swing, JavaFX & SWT 2
X Action aktivieren AWT, Swing, JavaFX & SWT 2
J mehrere Action Buttons mit einer ActionListener Methode AWT, Swing, JavaFX & SWT 7
A Action Listener AWT, Swing, JavaFX & SWT 14
S JMenuBar mit Action belegen! AWT, Swing, JavaFX & SWT 5
R action performed und IOException AWT, Swing, JavaFX & SWT 4
F Wo kann ich eine Action einsetzen? AWT, Swing, JavaFX & SWT 2
F Action ausführen? AWT, Swing, JavaFX & SWT 3
G Action Listener erzeugen AWT, Swing, JavaFX & SWT 6
C tree action AWT, Swing, JavaFX & SWT 8
W Bei hinzufügen der Action verliert Button Text,Tooltip, etc AWT, Swing, JavaFX & SWT 5
B Problem mit Übergabe bei action in andere Klasse AWT, Swing, JavaFX & SWT 4
X Action und Frame AWT, Swing, JavaFX & SWT 3
K Jtree und Action Event AWT, Swing, JavaFX & SWT 6
M clear JPanel before repainting AWT, Swing, JavaFX & SWT 1
T JComboBox before change AWT, Swing, JavaFX & SWT 3
J actionperformed wird nicht aufgerufen/ repaint() AWT, Swing, JavaFX & SWT 6
G lastFocusedComponent in ActionPerformed AWT, Swing, JavaFX & SWT 4
B AWT actionPerformed Method funktioniert nicht AWT, Swing, JavaFX & SWT 12
K Event Handling Mit ActionPerformed und java.io arbeiten AWT, Swing, JavaFX & SWT 3
Q AWT Methodenaufruf aus actionPerformed-Methode AWT, Swing, JavaFX & SWT 4
L ActionPerformed Variable übergeben AWT, Swing, JavaFX & SWT 3
J in actionPerformed() Koordinaten ändern AWT, Swing, JavaFX & SWT 9
C actionPerformed mit mehren Aktionen AWT, Swing, JavaFX & SWT 3
C Actionperformed funktioniert nicht AWT, Swing, JavaFX & SWT 13
H actionPerformed aufteilen AWT, Swing, JavaFX & SWT 12
G if-bedinung in actionperformed AWT, Swing, JavaFX & SWT 4
P Swing actionPerformed()-Methode funktioniert nicht AWT, Swing, JavaFX & SWT 3
S AWT Java actionPerformed "Ok" Button AWT, Swing, JavaFX & SWT 4
V Labeltext ändert sich nicht in actionPerformed AWT, Swing, JavaFX & SWT 5
M actionPerformed() wird zu oft aufgerufen AWT, Swing, JavaFX & SWT 10
M Arbeiten mit actionPerformed(ActionEvent) oder Alternative AWT, Swing, JavaFX & SWT 7
M Swing Anfängerfrage: ActionPerformed AWT, Swing, JavaFX & SWT 3
B Swing NullPointerException bei actionPerformed() AWT, Swing, JavaFX & SWT 2
B actionPerformed Problem AWT, Swing, JavaFX & SWT 3
D JTree DefaultMutableTreeNode ActionPerformed AWT, Swing, JavaFX & SWT 3
J Aus ActionPerformed ein Plugin starten AWT, Swing, JavaFX & SWT 4
R paintComponent direkt bei actionPerformed aufrufen AWT, Swing, JavaFX & SWT 2
S ActionPerformed Fehler... AWT, Swing, JavaFX & SWT 9
O Button (ActionPerformed) soll neues JFrame erzeugen AWT, Swing, JavaFX & SWT 8
E ActionListener/actionPerformed() feuert nicht AWT, Swing, JavaFX & SWT 2
E AWT Implementierung einer Anweisung in Methode ActionPerformed AWT, Swing, JavaFX & SWT 2
B Komisches Problem mit actionPerformed() AWT, Swing, JavaFX & SWT 2
K Swing: 2 Buttons und actionPerformed AWT, Swing, JavaFX & SWT 4
B actionPerformed reagiert nicht auf das Canvas-objekt AWT, Swing, JavaFX & SWT 11
B Objekt in "actionPerformed" erzeugen und nutzen AWT, Swing, JavaFX & SWT 3
F actionPerformed und static? AWT, Swing, JavaFX & SWT 20
B Exceptions in actionPerformed() weiterleiten AWT, Swing, JavaFX & SWT 9
S Variablenübergabe bei actionPerformed funktioniet nicht? AWT, Swing, JavaFX & SWT 12
X actionPerformed in einer Klasse Buttons AWT, Swing, JavaFX & SWT 2
T public void actionPerformed(...) ist statisch?? AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben