Variable übergeben Fehler

Ich habe einen Startbildschirm programmiert der die Spielfeldgröße an eine zweite Klasse übergeben soll.
Jedoch funktioniert es nicht .

Was muss ich tun , damit es klappt?

Hier die Fehlermeldung und die zwei Klassen;

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: rows and cols cannot both be zero
at java.awt.GridLayout.<init>(Unknown Source)
at java.awt.GridLayout.<init>(Unknown Source)
at Reactor.<init>(Reactor.java:53)
at Startbildschirm.actionPerformed(Startbildschirm.java:47)
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$200(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$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)

Java:
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class Startbildschirm implements ActionListener {
   
	JPanel startpanel=new JPanel();
	JButton Leicht=new JButton("Leicht");
	JButton Mittel=new JButton("Mittel");
	JButton Schwierig=new JButton("Schwierig");
	JFrame fenster = new JFrame();
	
	int spielfeldgröße;
	
	public  Startbildschirm() {
		
	
		startpanel.setLayout(new GridLayout(3,1));
		Leicht.addActionListener(this);
		Leicht.setActionCommand("Leicht");
		Mittel.addActionListener(this);
		Mittel.setActionCommand("Mittel");
		Schwierig.addActionListener(this);
		Schwierig.setActionCommand("Schwierig");
		startpanel.add(Leicht);
		startpanel.add(Mittel);
		startpanel.add(Schwierig);
		fenster.getContentPane().add(startpanel);
		fenster.setVisible(true);
		fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		fenster.pack();
		fenster.setLocationRelativeTo(null);

	}
	

	public void actionPerformed(ActionEvent arg0) {

		String Schwierigkeit = arg0.getActionCommand();
		if(Schwierigkeit.equals("Leicht")){
			spielfeldgröße = 25;
			Reactor rleicht = new Reactor(spielfeldgröße);
		}
		if(Schwierigkeit.equals("Mittel")){
			spielfeldgröße = 49;
			Reactor rmittel = new Reactor(spielfeldgröße);
		}
		if(Schwierigkeit.equals("Schwierig")){
			spielfeldgröße = 81;
			Reactor rschwierig = new Reactor(spielfeldgröße);
		}
	}
	public static void main(String[] args) {
		Startbildschirm sb = new Startbildschirm();

	}
}



Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Reactor  implements ActionListener  {

	JButton[] btns = new JButton[25];
	int punktzahl = 0;
	int schwierigkeit = 5;
	int sekundenzähler = 0;
	int limit = 1000000000;
	int wartezeit = 1000;
	int high = 26;
	int low = 1;
	int spielfeldgröße ;
	int mommentaneZahl ;
	int spielfeldlänge = (int) Math.sqrt(spielfeldgröße);
	boolean start = false;
	JLabel label=new JLabel(); 
	JPanel verliererpanel = new JPanel();
	JPanel unterverliererpanel = new JPanel();
	JPanel panel = new JPanel();
	JTextField text1=new JTextField("Du hast verloren !");
	JTextField text2=new JTextField("Deine Punktzahl :"+punktzahl+"");
	JPanel spielfeld = new JPanel();
	JFrame f = new JFrame();
	JButton button=new JButton("OK");
	
	public Reactor(int spielfeldgröße) {

		initializeButtons();
		
	
		button.addActionListener(this);
		button.setActionCommand("OK");
		panel.setLayout(new BorderLayout());
		verliererpanel.setLayout(new GridLayout(2,1));
		unterverliererpanel.setLayout(new GridLayout(2,1));
		unterverliererpanel.add(text1);
		text1.setHorizontalAlignment(0);
		unterverliererpanel.add(text2);
		text2.setHorizontalAlignment(0);
		verliererpanel.add(unterverliererpanel,BorderLayout.CENTER);
		verliererpanel.add(button);
		spielfeld.setLayout(new GridLayout(spielfeldlänge, spielfeldlänge));

		for (int zeile = 0; zeile < spielfeldgröße; zeile++) {

			spielfeld.add(btns[zeile]);

			btns[zeile].addActionListener(this);
			btns[zeile].setBackground(Color.WHITE);
			btns[zeile].setText("" + (zeile) + "");

			btns[zeile].setActionCommand("" + zeile + "");

		}
		btns[((spielfeldgröße-1)/2)].setBackground(Color.RED);
		mommentaneZahl = ((spielfeldgröße-1)/2);
		panel.add(spielfeld, BorderLayout.CENTER);
		panel.add(label, BorderLayout.NORTH);
		f.getContentPane().add(panel);
		f.setVisible(true);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.pack();
		f.setLocationRelativeTo(null);

	}

	private void initializeButtons() {
		for (int a = 0; a < spielfeldgröße; a++) {
			btns[a] = new JButton(" ");
		}
		while (start == true) {
			while (sekundenzähler < limit) {
		 sekundenzähler++;
		
		 	try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		 	
		 	}
		 }
	}

	@Override
	public void actionPerformed(ActionEvent arg0) {

		String gedrückteZahl = arg0.getActionCommand();
		
		
		if(gedrückteZahl.equals("OK")){
			Startbildschirm st=new Startbildschirm();
		}
		
		
		start = true;
		if (gedrückteZahl.equals(""+mommentaneZahl+"")) {
			

			punktzahl++;
			label.setText(""+punktzahl+"");
			
			
			
			if (punktzahl > 5) {
				int zufallszahlextra1 = (int) (Math.random() * (spielfeldgröße ));
				btns[zufallszahlextra1].setBackground(Color.BLUE);
			}
			if (punktzahl > 10) {
				int zufallszahlextra2 = (int) (Math.random() * (spielfeldgröße ));
				btns[zufallszahlextra2].setBackground(Color.GREEN);
			}
			if (punktzahl > 15) {
				int zufallszahlextra3 = (int) (Math.random() * (spielfeldgröße));
				btns[zufallszahlextra3].setBackground(Color.YELLOW);
			}
			if (punktzahl > 20) {
				int zufallszahlextra4 = (int) (Math.random() * (spielfeldgröße ));
				btns[zufallszahlextra4].setBackground(Color.ORANGE);
			}
			if (punktzahl > 25) {
				int zufallszahlextra5 = (int) (Math.random() * (spielfeldgröße ));
				btns[zufallszahlextra5].setBackground(Color.BLACK);
			}
			if (punktzahl == 30) {
				for (int zeile = 0; zeile < spielfeldgröße; zeile++) {
					btns[zeile].setBackground(Color.WHITE);
			}
			}
			if (punktzahl >30) {
				int zufallszahlextra6 = (int) (Math.random() * (spielfeldgröße ));
				btns[zufallszahlextra6].setBackground(Color.PINK);
				int zufallszahlextra7 = (int) (Math.random() * (spielfeldgröße ));
				btns[zufallszahlextra7].setBackground(Color.MAGENTA);
			}
			if (punktzahl >50) {
				int zufallszahlextra8 = (int) (Math.random() * (spielfeldgröße ));
				btns[zufallszahlextra8].setBackground(Color.CYAN);
				int zufallszahlextra9 = (int) (Math.random() * (spielfeldgröße ));
				btns[zufallszahlextra9].setBackground(Color.BLUE);
			}
			if (punktzahl >100) {
				int zufallszahlextra8 = (int) (Math.random() * (spielfeldgröße ));
				btns[zufallszahlextra8].setBackground(Color.CYAN);
				int zufallszahlextra9 = (int) (Math.random() * (spielfeldgröße ));
				btns[zufallszahlextra9].setBackground(Color.BLUE);
				int zufallszahlextra6 = (int) (Math.random() * (spielfeldgröße ));
				btns[zufallszahlextra6].setBackground(Color.PINK);
				int zufallszahlextra10 = (int) (Math.random() * (spielfeldgröße ));
				btns[zufallszahlextra10].setBackground(Color.MAGENTA);
				int zufallszahlextra11 = (int) (Math.random() * (spielfeldgröße ));
				btns[zufallszahlextra11].setBackground(Color.BLACK);
				int zufallszahlextra12 = (int) (Math.random() * (spielfeldgröße ));
				btns[zufallszahlextra12].setBackground(Color.GREEN);
				
			}
			if (punktzahl >150) {
				int zufallszahlextra13 = (int) (Math.random() * (spielfeldgröße ));
				btns[zufallszahlextra13].setBackground(Color.CYAN);
				int zufallszahlextra14= (int) (Math.random() * (spielfeldgröße ));
				btns[zufallszahlextra14].setBackground(Color.BLUE);
				int zufallszahlextra15 = (int) (Math.random() * (spielfeldgröße ));
				btns[zufallszahlextra15].setBackground(Color.PINK);
				int zufallszahlextra16 = (int) (Math.random() * (spielfeldgröße ));
				btns[zufallszahlextra16].setBackground(Color.MAGENTA);
				int zufallszahlextra17 = (int) (Math.random() * (spielfeldgröße ));
				btns[zufallszahlextra17].setBackground(Color.BLACK);
				int zufallszahlextra18 = (int) (Math.random() * (spielfeldgröße ));
				btns[zufallszahlextra18].setBackground(Color.GREEN);
				int zufallszahlextra19 = (int) (Math.random() * (spielfeldgröße));
				btns[zufallszahlextra19].setBackground(Color.YELLOW);
				
			}
			btns[mommentaneZahl].setBackground(Color.WHITE);
			int zufallszahl = (int) (Math.random() * (spielfeldgröße ));
			btns[zufallszahl].setBackground(Color.RED);
			mommentaneZahl = zufallszahl;
			System.out.print(""+sekundenzähler+"");
			sekundenzähler = 0;
		}

		else {
			for (int zeile = 0; zeile < spielfeldgröße; zeile++) {

				btns[zeile].removeActionListener(this);
				start = false;
			    f.remove(panel);
				f.add(verliererpanel, BorderLayout.CENTER);
				
			
			}
		}

	}
}
 
DIe Spielfeldlänge wird immer 0 sein, da du die Wurzel aus 0 ziehst. Du musst die initialisierung von spielfeldlänge im konstruktor von Reactor machen, nachdem die spielfeldgröße initialisiert wurde
 
@Typ mit Frage

In Zeile 23 sagst du nur, _dass_ es eine Variable namens Spielfeldgröße gibt, weißt ihr aber keinen Wert zu. Damit hat der Compiler zwei Zeilen weiter bei der Länge einfach "keinen Wert", bzw. null, wenn er die Länge berechnen soll.

Zieh das runter in den Konstruktor.
Java:
public Reactor (int spielfeldgroesse){

spielfeldlaenge = Math.sqrt(spielfeldgroesse);

}

btw: es ist besser, wenn du versuchst, auf Umlaute, Sonderzeichen oder dergleichen zu vermeiden.


Ich hätte noch einen Tipp für dich:
Du hast relativ viele If-Anweisungen. Probiere mal, die durch einen Switch zu ersetzen:
Java:
switch(Variable){
case $MöglicherWert:
$Do 
break;
[...]
default:
$Do
break;

}

Das sieht besser und lesbarer aus.
 
Zuletzt bearbeitet:

Zurück
Oben