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:
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
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