[Problem]Hintergrundfarbe mehrerer JPanels glz. ändern

Joergi

Mitglied
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)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$1.run(Unknown Source)
at java.awt.EventQueue$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$2.run(Unknown Source)
at java.awt.EventQueue$2.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

Hier ist das Programm:

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

Joergi

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

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

Gesperrter Benutzer
Darf ich raten? Er geht gar nicht in die ifs rein? Du solltest zumindest sowas anhängen:
Java:
[...]
} else {
    System.err.println("unknown actionCommand: " + arg0.getActionCommand());
    // bzw. Logger oder was auch immer
}
 

Joergi

Mitglied
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

Mitglied
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

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

Joergi

Mitglied
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

Mitglied
Also habs jetzt so gemacht wie du gesagt hast:

Java:
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:
Java:
Uuuund...ACTION: zurueck
Uuuund...ACTION: Farben
unknown actionCommand: Farben

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

lG,
Jörg
 

Joergi

Mitglied
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

Top Contributor
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

Mitglied
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

Top Contributor
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!
 
Zuletzt bearbeitet:

Joergi

Mitglied
Hallo Marco13,

Danke für die Hilfe :p

Es funktioniert jetzt, hier is der Code:
Java:
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
 

Neue Themen


Oben