# [Problem]Hintergrundfarbe mehrerer JPanels glz. ändern



## Joergi (29. Apr 2011)

Hallo,

Ich habe ein Problem mit meinem Programm:

Das Programm ist eine Art "Spiel" in dem es 49 JPanels gibt, welche man a) ALLE mit einem Button durch  zufällige Farben färben kann oder durch einen jeweiligen Klick auf ein einzelnes JPanel.
Die JPanel Kästchen sind stardmäßig auf weiß, und durch den Rücksetz- Button kann man die gefärbten JPanels auch wieder "zurücksetzen", sprich, weiß färben.

Nun zum Problem: 
Ich habe bereits erfolgreich das Färben von einzelnen Kästchen ausprogrammiert, nur beim Zurücksetzen der Farben kommt ständig ein Fehler:



> Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
> at Kacheln$FarbButtonlauscher.actionPerformed(Kacheln.java:110)
> at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
> at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
> ...



Hier ist das Programm:


```
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.*;


public class Kacheln{
	
	JFrame frame;
	JPanel[] panels;
	JButton farben;
	JButton zsetzen;
	JPanel bigPanel;

	
	public void start(){
		
//		Anlegen des Frames und Buttons
		frame = new JFrame();
		farben = new JButton();
		zsetzen = new JButton();
		bigPanel = new JPanel();
		
//		Eigenschaften vom Frame und den Buttons
		frame.setLayout(null);
		frame.setTitle("Kacheln");
		frame.setSize(520,600);
		frame.setVisible(true);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		farben.setText("Farben");
		farben.setBounds(20, 520, 100, 20);
		zsetzen.setActionCommand("farben");
		farben.addActionListener(new FarbButtonlauscher());
		
		zsetzen.setText("Zurücksetzen");
		zsetzen.setBounds(130, 520, 120, 20);
		zsetzen.setActionCommand("zurueck");
		zsetzen.addActionListener(new FarbButtonlauscher());
		
		bigPanel.setBounds(4, 0, 500, 500);
		bigPanel.setLayout(new GridLayout(7,7,1,1));
		
//		49 kleine Panels anlegen
		for(int i=0; i < 49; i++){
			panels = new JPanel[49];
			panels[i] = new JPanel();
			panels[i].setBackground(Color.WHITE);
			bigPanel.add(panels[i]);
			
			panels[i].addMouseListener(new PanelGedrueckt());
			
		}
		
//		Hinzufügen zum Frame
		frame.getContentPane().add(bigPanel);
		frame.getContentPane().add(farben);
		frame.getContentPane().add(zsetzen);

		
		
	} // Start- Methoden- Ende
	
	class PanelGedrueckt implements MouseListener{

		public void mouseClicked(MouseEvent e) {
			
			JPanel geklicktesPanel = new JPanel();
			
			int rot = (int) (Math.random() *255);
			int grün = (int) (Math.random() *255);
			int blau = (int) (Math.random() *255);
			Color neueFarbe = new Color(rot, grün, blau);
			
			geklicktesPanel = (JPanel) e.getComponent();
			geklicktesPanel.setBackground(neueFarbe);
			
		}
		@Override
		public void mouseEntered(MouseEvent arg0) {
			// TODO Auto-generated method stub
			
		}
		@Override
		public void mouseExited(MouseEvent arg0) {
			// TODO Auto-generated method stub
			
		}
		@Override
		public void mousePressed(MouseEvent arg0) {
			// TODO Auto-generated method stub
			
		}
		@Override
		public void mouseReleased(MouseEvent arg0) {
			// TODO Auto-generated method stub
			
		}

	} // Klasse PanelGedrückt ENDE
	
	public class FarbButtonlauscher extends Kacheln implements ActionListener {
		
		public void actionPerformed(ActionEvent arg0) {
			if(arg0.getActionCommand().equals("zurueck")){
				for(int k = 0; k < 49; k++){
					panels[k].setBackground(Color.WHITE);
				}
			}

		}

	}
	

	public static void main(String[] args){
		
		Kacheln los = new Kacheln();
		los.start();
		

	}

}
```

Ich wollte das Zurücksetzen lösen, indem ich einen Listener auf den Button setze, und abfange falls dieser gedrückt wird. Anschließend wird die innere Klasse aufgerufen wo sich der Code befindet zum Zurücksetzen der Farben.

Leider funktionert das halt leider nicht =(

Ich habe schon stundenlang überlegt aber mir fällt kein anderer Lösungsweg ein wie ich es noch lösen könnte.

Wäre froh wenn mir jemand helfen könnte!

Liebe Grüße, 
Jörg


----------



## Marco13 (29. Apr 2011)

Das  
panels = new JPanel[49];
muss VOR die Schleife, sonst wird bei jedem Durchlauf ein neuer (leerer) Array erstellt.


----------



## Joergi (29. Apr 2011)

Hey danke für die Hilfe =)
Hab den fehler mit einem Freund vor 10 min selbst entdeckt 

Danke vielmals!!! =)


----------



## Joergi (29. Apr 2011)

Hey

Ich hab nun ein neues Problem =(

Ich möchte mit dem "Farben" Button ALLE Panels auf einmal mit einer jeweiligen Zufallsfarbe "anmalen".

Nur leider kommt, trotz fehlerlosem Code, kein Effekt =(

Ich wollte fragen ob jemand vielleicht einen anderen Lösungsweg vorschlagen könnte oder, falls der von mir nicht ganz falsch ist, vielleicht die Fehlerursache finden kann?

hier der Code:


```
public class FarbButtonlauscher implements ActionListener {
		
		int k;
		
		public void actionPerformed(ActionEvent arg0) {
			if(arg0.getActionCommand().equals("zurueck")){
				for(k =0; k < 49; k++){
					panels[k].setBackground(Color.WHITE);
				}
			}
			
			else if(arg0.getActionCommand().equals("farben")){
				
				JPanel[] allePanel = new JPanel[49];
				Object einesVonAllen = new JPanel();
				
				for(k = 0; k < 49; k++){
					
					int rot = (int) (Math.random() *255);
					int grün = (int) (Math.random() *255);
					int blau = (int) (Math.random() *255);
					Color neueFarbe = new Color(rot, grün, blau);
			
					
					einesVonAllen = arg0.getSource();
					allePanel[k] = (JPanel) einesVonAllen;
					allePanel[k].setBackground(neueFarbe);
					
				}
			}

		}

	}
```

liebe Grüße =)


----------



## faetzminator (30. Apr 2011)

Darf ich raten? Er geht gar nicht in die ifs rein? Du solltest zumindest sowas anhängen:

```
[...]
} else {
    System.err.println("unknown actionCommand: " + arg0.getActionCommand());
    // bzw. Logger oder was auch immer
}
```


----------



## Joergi (30. Apr 2011)

Hey,

Doch in die ifs müsste er eigentlich reingehen, da er in das erste if mit dem zurücksetzen ja auch reingeht, aber ich werde jetzt mal ein else dran hängen und dann noch einmal schauen ob das 2.te if funktioniert 

liebe Grüße,
Jörg


----------



## Joergi (30. Apr 2011)

Ich habe das else nun eingebaut, und wenn ich auf den Farben Button klicke, springt er sofort in das von dir gepostete else rein =| 

Ich hab jedoch keinen Plan, was ich falsch mache 

Würde mich freuen, wenn mir noch jemand helfen könnte.

Liebe Grüße,
Jörg


----------



## Marco13 (30. Apr 2011)

Ein
System.out.println("Uuuund...ACTION: "+arg0.getActionCommand());
als erste Zeile in der actionPerformed könnte der nächste Schritt sein...


----------



## Joergi (30. Apr 2011)

Hey,

Ich wollte fragen, wieso du das vorschlägst?
Weil es funktioniert ja nur die zweite if- Anweisung nicht, die erste funktioniert ohne Probleme.

Liebe Grüße,
Jörg


----------



## Joergi (30. Apr 2011)

Also habs jetzt so gemacht wie du gesagt hast:


```
public class FarbButtonlauscher implements ActionListener {
		
		int k;
		
		public void actionPerformed(ActionEvent arg0) {
			
			System.out.println("Uuuund...ACTION: "+arg0.getActionCommand());
```

Wenn ich auf Zurücksetzen klicke, funktioniert es (erstes if)
Wenn ich aber auf Farben klicke, funktioniert es nicht (zweites if)

Hier kommt die Ausgabe:

```
Uuuund...ACTION: zurueck
Uuuund...ACTION: Farben
unknown actionCommand: Farben
```

Wieso "unknown actionCommand ? 
Das versteh ich echt nicht >.<

lG,
Jörg


----------



## Marco13 (30. Apr 2011)

System.out.println("Farben".equals("farben"));
System.out.println("Farben".equalsIgnoreCase("farben"));


----------



## Joergi (30. Apr 2011)

Hey was genau soll das bewirken?

Wenn ich den Text "Farben" mit dem Text "farben" vergleiche? Da kommt doch immer false raus?

liebe Grüße


----------



## Marco13 (1. Mai 2011)

Hm. Schwierig?

Der Block unter
else if(arg0.getActionCommand().equals("farben")){
wird ausgeführt, wenn das ActionCommand "farben" ist. Es ist aber nie "farben", sondern, wie man an der Ausgabe sieht, nur "Farben". 



> Wenn ich den Text "Farben" mit dem Text "farben" vergleiche? Da kommt doch immer false raus?


Und was hat das jetzt für Auswirkungen auf dein Programm?


----------



## Joergi (1. Mai 2011)

Hallo :>

Also zu dem "schwierig?" ... JA *g* Sorry, wenn ich so am Schlauch stehe *g* 

Also wird immer "Farben" übergeben? Aber das kann doch garnicht sein, ich habe nirgends "Farben" verwendet in meinem Programm... 

Und das mit dem Vergleich von den 2 Strings versteh ich ehrlich gesagt nicht ganz =|
Du vergleichst mit dem equals 2 Strings nämlich "farben" (klein geschrieben) und "Farben" (groß geschrieben). Aber was genau soll die Ausgabe bezwecken? 

Und danke, dass du mir weiterhilfst =)

liebe Grüße und für heute auch gute Nacht,
Jörgi


----------



## Marco13 (1. Mai 2011)

Das mit dem equals vs. equalsIgnoreCase sollte ein Wink mit dem Zaunpfahl sein, um anzudeuten dass es an der Groß/Kleinschreibung liegt. Üblicherweise tendiere ich ja nicht dazu, jemanden mit solchen hingeworfenen Info-Brocken am langen Arm verhungern zu lassen, aber ... jetzt mache ich es noch ein mal :bae:  : Schau' dir mal in deinem ersten Posting an, ob du nicht vielleicht doch irgendwo den String "farben" (statt "Farben") verwendest.... (Computer können schon unausstehlich sein, gell?   )

EDIT: Aaah, das war jetzt dann vielleicht DOCH zu wenig - noch die Zusatzinfo: Wenn man einem Button NICHT explizit ein ActionCommand zuweist, dann wird seine _Aufschrift_ als ActionCommand verwendet!


----------



## Joergi (2. Mai 2011)

Hallo Marco13,

Danke für die Hilfe 

Es funktioniert jetzt, hier is der Code:

```
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.*;


public class Kacheln{
	
	JFrame frame;
	JPanel[] panels = new JPanel[49]; // NICHT in der Schleife anlegen sonst wird jedesmal ein neuer leerer Array erstellt
	JButton farben;
	JButton zsetzen;
	JPanel bigPanel;

	
	public void start(){
		
//		Anlegen des Frames und Buttons
		frame = new JFrame();
		farben = new JButton();
		zsetzen = new JButton();
		bigPanel = new JPanel();
		
//		Eigenschaften vom Frame und den Buttons
		frame.setLayout(null);
		frame.setTitle("Kacheln");
		frame.setSize(520,600);
		frame.setVisible(true);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		farben.setText("Farben");
		farben.setBounds(20, 520, 100, 20);
		farben.setActionCommand("farben");
		farben.addActionListener(new FarbButtonlauscher());
		
		zsetzen.setText("Zurücksetzen");
		zsetzen.setBounds(130, 520, 120, 20);
		zsetzen.setActionCommand("zurueck");
		zsetzen.addActionListener(new FarbButtonlauscher());
		
		bigPanel.setBounds(4, 0, 500, 500);
		bigPanel.setLayout(new GridLayout(7,7,1,1));
		
//		49 kleine Panels anlegen
		for(int i=0; i < 49; i++){
			
			panels[i] = new JPanel();
			panels[i].setBackground(Color.WHITE);
			bigPanel.add(panels[i]);
			
			panels[i].addMouseListener(new PanelGedrueckt());
			
		}
		
		
		
//		Hinzufügen zum Frame
		frame.getContentPane().add(bigPanel);
		frame.getContentPane().add(farben);
		frame.getContentPane().add(zsetzen);

		
		
	} // Start- Methoden- Ende
	
	class PanelGedrueckt implements MouseListener{

		public void mouseClicked(MouseEvent e) {
			
			JPanel geklicktesPanel = new JPanel();
			
			int rot = (int) (Math.random() *255);
			int grün = (int) (Math.random() *255);
			int blau = (int) (Math.random() *255);
			Color neueFarbe = new Color(rot, grün, blau);
			
			geklicktesPanel = (JPanel) e.getComponent();
			geklicktesPanel.setBackground(neueFarbe);
			
		}
		@Override
		public void mouseEntered(MouseEvent arg0) {
			// TODO Auto-generated method stub
			
		}
		@Override
		public void mouseExited(MouseEvent arg0) {
			// TODO Auto-generated method stub
			
		}
		@Override
		public void mousePressed(MouseEvent arg0) {
			// TODO Auto-generated method stub
			
		}
		@Override
		public void mouseReleased(MouseEvent arg0) {
			// TODO Auto-generated method stub
			
		}

	} // Klasse PanelGedrückt ENDE
	
	public class FarbButtonlauscher implements ActionListener {
		
		public void actionPerformed(ActionEvent arg0) {
			
			System.out.println("Uuuund...ACTION: "+arg0.getActionCommand());
			System.out.println("Farben".equals("farben"));
			System.out.println("Farben".equalsIgnoreCase("farben")); 
			
			if(arg0.getActionCommand().equals("zurueck")){
				for(int k =0; k < 49; k++){
					panels[k].setBackground(Color.WHITE);
				}
			}
			
			else if(arg0.getActionCommand().equals("farben")){
				
				JPanel[] allePanel = new JPanel[49];
				Object einesVonAllen = new JPanel();
				
				for(int v = 0;v < 49; v++){
					
					int rot = (int) (Math.random() *255);
					int grün = (int) (Math.random() *255);
					int blau = (int) (Math.random() *255);
					Color neueFarbe = new Color(rot, grün, blau);
			
					System.out.println("wurde erkennt");
					
//					panels[v] = (JPanel) einesVonAllen;
					panels[v].setBackground(neueFarbe);
					
				}
			}
			
		 else {
		    System.err.println("unknown actionCommand: " + arg0.getActionCommand());
	
		}

		}

	}
	

	public static void main(String[] args){
		
		Kacheln los = new Kacheln();
		los.start();
		

	}

}
```

liebe Grüße


----------

