Farbe von Buttons mehrmals ändern

javanoob2000

Mitglied
Moin moin,
ich beschäftige mich momentan ausgiebig mit der Erstellung von Buttons.
Ich habe es geschafft Buttons eine Größe, einen Platz und eine Farbe zuzuordnen. Diese Farbe kann mit einem Mausklick durch eine if Schleife verändert werden.
Jedoch möchte ich nun durch einen weiteren Mausklick die vorherige Farbe zurück bekommen. Dies gelingt mir jedoch nicht. Kann mir jemand von euch weiterhelfen ?

Java:
import java.awt.event.*;
import javax.swing.*; 

public class JButtonExample2 extends JFrame implements ActionListener
{
  JButton rotButton;
  JButton gruenButton;
  public static void main(String[] argv)
  {
    JButtonExample2 mainApp = new JButtonExample2();
  }

  public JButtonExample2()
  {
    super("JButton Example");
    setBounds(0, 0, 900, 900);
    getContentPane().setLayout(null);
    setDefaultCloseOperation(EXIT_ON_CLOSE);

    rotButton   = new JButton("");  
    gruenButton = new JButton("");
   
    rotButton.setBackground(new Color(245, 255, 255));
    gruenButton.setBackground(new Color(245, 255, 255));
   
    rotButton.setBounds(50, 50, 170, 150);
    gruenButton.setBounds(250, 50, 170, 150);
   
    rotButton.addActionListener( this );     
    gruenButton.addActionListener( this );
   
    getContentPane().add( rotButton ); 
    getContentPane().add( gruenButton );
   
    setVisible(true);
  }

  public void actionPerformed(ActionEvent e)
  {
    if(e.getSource() == rotButton )
    {
      rotButton.setBackground(new Color(255, 0, 0));
    }
    else if(e.getSource() == gruenButton)
    {
      gruenButton.setBackground(new Color(0, 255, 0));
    }
  }
}
 
@javanoob2000
Du vergibst jedem Button gleich zu Beginn eine (primär) Farbe. Nun musst du in der Methode actionPerformed prüfen, um welchen Erzeuger es sich handelt und weil du schon dabei bist, prüfe doch gleich, ob der Erzeuger primäre Farbe aufweist. Wenn es zutrifft, Farbenwechsel zu der Sekundärfarbe, wenn nicht, zu der Primärfarbe.
Java:
    @Override
    public void actionPerformed(ActionEvent e)
    {

        if (e.getSource() == mButton && mButton.getBackground() == Color.RED)
        {
            mButton.setBackground(Color.GREEN);
        } else
        {
            mButton.setBackground(Color.RED);
        }

    }
 
Vielen Dank @Javinner , das hat schon sehr geholfen
Jedoch hab ich noch ein kleines Problem...
Wenn ich den rotButton drücke wird er rot und wenn ich ihn noch einmal drücke wird er wieder weiß (so wie es sein soll)
Wenn ich jetzt den rotButton drücke wird er rot und wenn ich danach den gruenButton drücke (der momntan weiß ist) wir dieser grün (wie es sein soll). Jedoch wird dabei gleichzeitig der rotButton wieder weiß, obwohl dieser eigentlich rot bleiben sollte.
Hast du ne Ahnung was ich falsch mache ?
Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*; 

public class JButtonExample4 extends JFrame implements ActionListener
{
  JButton rotButton;
  JButton gruenButton;
  public static void main(String[] argv)
  {
    JButtonExample4 mainApp = new JButtonExample4();
  }

  public JButtonExample4()
  {
    super("JButton Example");
    setBounds(0, 0, 900, 900);
    getContentPane().setLayout(null);
    setDefaultCloseOperation(EXIT_ON_CLOSE);

    rotButton   = new JButton("");  
    gruenButton = new JButton("");
   
    rotButton.setBackground(Color.WHITE);
    gruenButton.setBackground(Color.WHITE);
   
    rotButton.setBounds(50, 50, 170, 150);
    gruenButton.setBounds(250, 50, 170, 150);
   
    rotButton.addActionListener( this );     
    gruenButton.addActionListener( this );
   
    getContentPane().add( rotButton ); 
    getContentPane().add( gruenButton );
   
    setVisible(true);
  }

   public void actionPerformed(ActionEvent e)
    {

        if (e.getSource() == rotButton && rotButton.getBackground() == Color.WHITE)
        {
            rotButton.setBackground(Color.RED);
        } else
        {
            rotButton.setBackground(Color.WHITE);
        } 
        if (e.getSource() == gruenButton && gruenButton.getBackground() == Color.WHITE)
        {
            gruenButton.setBackground(Color.GREEN);
        } else
        {
            gruenButton.setBackground(Color.WHITE);
        }

    }
}
 
Naja überleg doch mal wann deine Bedingungen wahr/falsch sind und wann welcher Code ausgeführt wird.
Java:
if(e.getSource() == rotButton && rotButton.getBackground() == Color.WHITE) {
    ...
} else {
   ...
}
Soabald einer der beiden Bedingungen false ist, geht er in den else-Zweig .. bedeutet im Umkehrschluss aber auch, dass dein rotButton immer weiß gemacht wird wenn er nicht gedrückt wurde.
Du solltest lieber else-if nutzen anstatt nur if-else
 
Super jetzt funktioniert es 🙂
Ich habe das Programm jetzt um einen Button (blauButton) erweitert
Hat jemand von euch eine Ahnung, wie ich folgendes hinbekomme:
Wenn zwei Buttons angeklickt worden sind (dann wären die Buttons zum Beispiel rot, blau,weiß), dann soll beim Anklicken des 3. Buttons die anderen beiden Buttons wieder weiß werden (also weiß,weiß,grün) (also so ähnlich wie bei einem Memory)
Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;  

public class JButtonExample4 extends JFrame implements ActionListener
{
  JButton rotButton;
  JButton gruenButton;
  JButton blauButton;
 
  public static void main(String[] argv)
  {
    JButtonExample4 mainApp = new JButtonExample4();
  }

  public JButtonExample4()
  {
    super("JButton Example");
    setBounds(0, 0, 900, 900);
    getContentPane().setLayout(null);
    setDefaultCloseOperation(EXIT_ON_CLOSE);

    rotButton   = new JButton("");   
    gruenButton = new JButton("");
    blauButton   = new JButton("");
   
    rotButton.setBackground(Color.WHITE);
    gruenButton.setBackground(Color.WHITE);
    blauButton.setBackground(Color.white);
   
    rotButton.setBounds(50, 50, 170, 150);
    gruenButton.setBounds(250, 50, 170, 150);
    blauButton.setBounds(450, 50, 170, 150);
   
    rotButton.addActionListener( this );     
    gruenButton.addActionListener( this );
    blauButton.addActionListener( this );   
   
    getContentPane().add( rotButton );  
    getContentPane().add( gruenButton );
    getContentPane().add( blauButton );
    setVisible(true);
  }

   public void actionPerformed(ActionEvent e)
    {

        if (e.getSource() == rotButton && rotButton.getBackground() == Color.WHITE)
        {
            rotButton.setBackground(Color.RED);
        }
        else if (e.getSource() == rotButton && rotButton.getBackground() == Color.red )
        {
            rotButton.setBackground(Color.WHITE);
        }  
        else if (e.getSource() == gruenButton && gruenButton.getBackground() == Color.WHITE)
        {
            gruenButton.setBackground(Color.GREEN);
        }
        else if (e.getSource() == gruenButton && gruenButton.getBackground() == Color.green)
        {
            gruenButton.setBackground(Color.WHITE);
        }
    else if (e.getSource() == blauButton && blauButton.getBackground() == Color.WHITE)
        {
            blauButton.setBackground(Color.BLUE);
        }
    else if (e.getSource() == blauButton && blauButton.getBackground() == Color.BLUE)
        {
            blauButton.setBackground(Color.WHITE);
        }

    }
}
 
Gibt es sicherlich verschiedenste Ansätze. Einer wäre eventuell die Buttons die nicht "weiß" sind in einer Struktur zu speichern und wenn die Struktur eine Länge > 2 hat die ersten 2 Elemente wieder auf "weiß" zu setzen und aus der Struktur zu entfernen.
 

Neue Themen


Zurück
Oben