# JRadioButtonMenuItem



## blaues_etwas (27. Jan 2008)

Ich hab folgendes Problem:
Ich habe eine Klasse Oberflaeche, die für das Menu zuständig ist. In diesem Menu hab ich zwei JRadioButtonMenuItems in einer Gruppe. Nun möchte ich von einem JPanel aus abfragen, welches der beiden ausgewählt ist. Aber mir gibt die Methode dafür immer den gleichen Wert zurück, egal welches ausgewählt ist.

Teil aus Oberflaeche:
	
	
	
	





```
[..]
public boolean getGewaehlt()
	{
		boolean gewaehlt = true;
		if(miP1.isSelected() == true)
			gewaehlt = true;
		if(miP2.isSelected() == true)
			gewaehlt = false;
		return gewaehlt;
	}
[..]
```

Teil aus dem JPanel:


```
[..]
if(ob.getGewaehlt() == false)
		{
			aktion();
		}
[..]
```


----------



## Beni (27. Jan 2008)

Bist du sicher, dass du nicht zwei verschiedene Objekte befragst?
Kannst ja mal in "getGewaehlt()" folgendes ausgeben:

```
System.out.println( miP1.isSelected() + " " + miP2.isSelected())
```
Wenn die angezeigten Werte im Menü nicht zu diesen Ausgaben passen, dann hast du verschiedene Objekte.


----------



## blaues_etwas (27. Jan 2008)

nein, die zwei Objekte sind die richtigen. Er gibt mir das aus, was ich im Menu ausgewählt habe ..


----------



## blaues_etwas (27. Jan 2008)

Wenn ich die Methode klassenintern in Oberflaeche aufrufe "funktioniert" die Methode. Da werden JLabels mit einem Icon gezeichnet. Wenn ich die Meth. im JPanel aufrufe "funktioniert" sie nicht. Hier soll sie beim Programmablauf was ändern.


----------



## blaues_etwas (3. Feb 2008)

Schade, dass mir bisher keiner Helfen konnte. Weil ich es noch nicht selbst lösen konnte, hab ich die Problematik mal kurz als Quell-Code zusammengefasst. 
Bei dem Download handelt es sich um das besagte Projekt:Click mich!
Wenn hier Links nicht gern gesehen sind, kann ich gern das auch als _Code_ posten.
mfg blaues_etwas


----------



## outbreaker (4. Feb 2008)

Da dein Link auf eine exe führt wird es schwer werden jemanden zu finden der das ausführt
also eine gepacktes Archiv wie ein rar wäre hier angebrachter  :wink:


----------



## blaues_etwas (4. Feb 2008)

@outbreaker
Stimmt, daran hab ich gar nicht gedacht. Will hier auch niemand etwas böses tun. Die *.exe ist ein selbstentpackendes Archiv da es doch einige User gibt, die *.rar Archive nicht unterstützen ..
Das Projekt nochmal als rar-Archiv 

Hier der Code zweier Klassen. Vllt. kann man mir auch so helfen.. 


```
//Klasse Oberflaeche
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Oberflaeche extends JFrame implements ActionListener
{
	JMenuItem start = new JMenuItem("Start");
	JRadioButtonMenuItem p1 = new JRadioButtonMenuItem ("P1");
	JRadioButtonMenuItem co = new JRadioButtonMenuItem ("Co");
	JMenuItem ende = new JMenuItem("Quit");
	
	KZ kz;
	Brett brett;
	
	public Oberflaeche(){	 }
	public Oberflaeche(KZ y)
	{
		kz = y;
		
		brett = new Brett();
		brett.setVisible(false);
		
		JMenuBar menubar = new JMenuBar();
		menubar.add( erstelleMenu() );
		setJMenuBar(menubar);
		start.setEnabled(false);
		
		start.addActionListener(this);
		p1.addActionListener(this);
		co.addActionListener(this);
		ende.addActionListener(this);	

		this.setSize(300,300);
		setLocationRelativeTo(null);
		setBackground(Color.gray);
	}
	private JMenu erstelleMenu()
	{
		JMenu g = new JMenu("Menu");
		ButtonGroup bgGruppe = new ButtonGroup();	
      		g.add(start);
		bgGruppe.add(p1);
		bgGruppe.add(co);
		g.add(p1);
		g.add(co);
      		g.add(ende);
		return g;
	}
	public void actionPerformed(ActionEvent e)
	{
		String name = e.getActionCommand();
		if(name.equals("Start"))
		{
			getContentPane().add(brett);
			brett.setVisible(true);
			brett.auswahl.setText("P1: "+p1.isSelected()+" Co: "+co.isSelected());
		}
		if(name.equals("P1"))
		{
			start.setEnabled(true);
		}
		if(name.equals("Co"))
		{
			start.setEnabled(true);
		}
		if(name.equals("Quit"))
		{
			setVisible(false);
			dispose();
			System.exit(0);
		}
	}
	public boolean getModus()
	{
		boolean gewaehlt = true;
		if(p1.isSelected() == true)
			gewaehlt = true;		//für P1
		else
			gewaehlt = false;		//für Co
		return gewaehlt;
	}
}
```


```
//Klasse Brett
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class Brett extends JPanel implements ActionListener
{
	JToggleButton button[] = new JToggleButton[10];
	JLabel auswahl;
	boolean spielerwechsel = false;
	
	Oberflaeche ob;

	public Brett()
	{	
		ob = new Oberflaeche();
		
		auswahl = new JLabel("");
		auswahl.setText("Auswahl");
		add(auswahl);
	
		for( int i = 0; i < button.length; i++ )
		{
  			button[i] = new JToggleButton(""+(i+1));
			add(button[i]);
			button[i].addActionListener(this);
		}
	}
			
	public void actionPerformed(ActionEvent e)
	{
 		for( int i = 0; i < button.length; i++ )
		{
 			if( e.getSource() == button[i] )
			{
				wechselSpieler();
    				break;
 			}
		}
	}
	public void wechselSpieler()
	{
		if(spielerwechsel == true)
			spielerwechsel = false;
		else
			spielerwechsel = true;

		/*Hier soll überprüft werden, ob nun P1 gespielt wird, oder Co.
		ob.getModus() liefert hier immer den selben Wert zurück, unabhängig 
		von dem was ausgewählt wurde, was nicht sein soll !*/
		if(ob.getModus() == false)	//Methode liefert true für P1 & false für Co
		{
			if(spielerwechsel == true)
				waehleButton();
		}
	}
	public void waehleButton() //Hier wählt der Rechner ein noch nicht gedrückten Button
	{
		int i = (int)(Math.random()*10);
		if(button[i].isSelected() == false)
		{
			button[i].setSelected(true);
			wechselSpieler();
		}
		else
			waehleButton();
	}
}
```

mfg blaues_etwas


----------



## outbreaker (4. Feb 2008)

Nur so eine Frage 
warum instantiierst du zweimal deine Oberflaeche?

einmal in Brett und einmal in KZ

könnte wohl da dein Fehler liegn! Das bedeutet nämlich das du zwei Objekte von Oberflaeche hast


----------



## blaues_etwas (4. Feb 2008)

Könnte sein, dass da der Fehler drin liegt. Kannst du mit helfen das Prob. zu lösen, denn ich steh grad sowas von auf der Leitung .. :-/


----------



## outbreaker (4. Feb 2008)

gucke mir gerade deinen Code mal genauer an
Willst du erreichen das wenn der spieler P1 einen Button gedrückt hat das dann automatisch der CO dran ist?


----------



## outbreaker (4. Feb 2008)

So jetzt welchselt der Button und der CO berechnet automatisch sein Button

Oberflaeche.java:


```
package testen2;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JRadioButtonMenuItem;

public class Oberflaeche extends JFrame implements ActionListener
{
	private JMenuItem start = new JMenuItem("Start");
	private JRadioButtonMenuItem p1 = new JRadioButtonMenuItem ("P1");
	private JRadioButtonMenuItem co = new JRadioButtonMenuItem ("Co");
	private JMenuItem ende = new JMenuItem("Quit");
	
	private ButtonGroup bgGruppe;
	
	private KZ kz;
	private Brett brett;
	
	public Oberflaeche(){	 }
	
	public Oberflaeche(KZ y)
	{
		kz = y;
		
		brett = new Brett(this);
		brett.setVisible(false);
		
		//Menuleiste menubar
		JMenuBar menubar = new JMenuBar();
		menubar.add( erstelleMenu() );
		setJMenuBar(menubar);
		start.setEnabled(false);
		
		start.addActionListener(this);
		p1.addActionListener(this);
		co.	addActionListener(this);
		ende.addActionListener(this);	

		this.setSize(300,300);
		setLocationRelativeTo(null);
		setBackground(Color.gray);
	}
	private JMenu erstelleMenu()
	{
		JMenu g = new JMenu("Menu");
		bgGruppe = new ButtonGroup();	
      		g.add(start);
		bgGruppe.add(p1);
		bgGruppe.add(co);
		g.add(p1);
		g.add(co);
      		g.add(ende);
		return g;
	}
	public void actionPerformed(ActionEvent e)
	{
		String name = e.getActionCommand();
		if(name.equals("Start"))
		{
			getContentPane().add(brett);
			brett.setVisible(true);
			brett.getAuswahl().setText("P1: "+p1.isSelected()+" Co: "+co.isSelected());
		}
		if(name.equals("P1"))
		{
			start.setEnabled(true);
		}
		if(name.equals("Co"))
		{
			start.setEnabled(true);
		}
		if(name.equals("Quit"))
		{
			setVisible(false);
			dispose();
			System.exit(0);
		}
	}
	
	public void nextPlayer()
	{
		if (p1.isSelected())
		{
			co.setSelected(true);
		}
		else
		{
			p1.setSelected(true);
		}
	}
	
	public boolean getModus()
	{
		return p1.isSelected();
	}
}
```

KZ.java:


```
package testen2;


public class KZ
{
	public Oberflaeche o;
	public KZ()
	{
		o = new Oberflaeche(this);
		zeigeFensterOberflaeche(true);
	}
	public static void main(String args[])
	{
		System.out.println("Starting App");
		KZ m = new KZ();
	}
	public void zeigeFensterOberflaeche(boolean p_b)
	{
		o.setVisible(p_b);
	}
}
```

Brett.java:

```
package testen2;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JToggleButton;

class Brett extends JPanel implements ActionListener
{
	private JToggleButton button[] = new JToggleButton[10];
	private JLabel auswahl;
	
	Oberflaeche ob;

	public Brett(Oberflaeche ob)
	{	
		this.ob = ob;
		
		auswahl = new JLabel("");
		auswahl.setText("Auswahl");
		add(auswahl);
	
		for( int i = 0; i < button.length; i++ )
		{
  			button[i] = new JToggleButton(""+(i+1));
			add(button[i]);
			button[i].addActionListener(this);
		}
	}
			
	public void actionPerformed(ActionEvent e)
	{
		wechselSpieler();
		System.out.println("action");
	}
	public void wechselSpieler()
	{
		ob.nextPlayer();
		
		if(ob.getModus() == false)	//Methode liefert true für P1 & false für Co
		{
			waehleButton();
		}
		else
		{}
	}
	public void waehleButton() //Hier wählt der Rechner ein noch nicht gedrückten Button
	{
		int i = (int)(Math.random()*10);
		if(button[i].isSelected() == false)
		{
			button[i].setSelected(true);
			wechselSpieler();
		}
		else
			waehleButton();
	}

	public JLabel getAuswahl() {
		return auswahl;
	}

	public void setAuswahl(JLabel auswahl) {
		this.auswahl = auswahl;
	}
}
```


----------



## Guest (4. Feb 2008)

Sry, hab mich wohl falsch ausgedrückt. 
Es ist geplant, dass es zwei Modi geben wird, also gegen Mensch / gegen Computer. Die Methode _getModus()_ soll mir sagen, für was ich mich bei den JRadioButtonMenuItems entschieden hab. Bei _wechselSpieler()_ wird durch die Abfrage des Modus entschieden, ob gegen n Mensch oder gegen Computer gespielt wird. Wenn Co dran ist wählt dieser ein Button, wenn P1 dran ist, dann klickt dieser selbst einen Button. Und dann wird wieder _wechselSpieler()_ aufgerufen und...
Das Label _auswahl_ war nur zum test da.


----------



## outbreaker (4. Feb 2008)

ok dann habe das wohl etwas falsch verstanden somit ist mein Beispiel nicht ganz das was du willst aber mit der 
	
	
	
	





```
public boolean getModus()
	{
		return p1.isSelected();
	}
```
 Methode wird dir ja zurück gegen was aufgewählt ist

oder verstehe ich das immer noch falsch?
Das war doch das was du erreichen wolltest.


----------



## blaues_etwas (4. Feb 2008)

Was ich erreichen will ist, dass wenn ich Co wähle, ich, dann der Comp. , dann ich, dann wieder der Comp. einen button wählt. Wenn P1(Player vs. Player) gewählt wurde, dann soll der Comp. nie einen buttpn wählen, sondern das erledigt der benutzer.

```
if(ob.getModus() == false)   //Methode liefert true für P1 & false für Co
      {
         if(spielerwechsel == true)
            waehleButton();
      }
```
Das wollt ich mit der Methode erreichen, aber getModus() liefert mir unabhängig von dem, was ich als JRadioButtonMenuItem ausgewählt hab, immer nur *einen* boolschen Wert.
Dein getModus() ist ja nur eine andere Schreibweise von meiner Variante.


----------



## outbreaker (4. Feb 2008)

blaues_etwas hat gesagt.:
			
		

> Was ich erreichen will ist, dass wenn ich Co wähle, ich, dann der Comp. , dann ich, dann wieder der Comp. einen button wählt. Wenn P1(Player vs. Player) gewählt wurde, dann soll der Comp. nie einen buttpn wählen, sondern das erledigt der benutzer.
> 
> ```
> if(ob.getModus() == false)   //Methode liefert true für P1 & false für Co
> ...



OK und wo ist das Problem ???:L 

getModus() gibt dir zurück ob du CO oder P1 aufgewählt hast

P1 zwei Spieler
CO Computer vs Spieler

Brett.java hab ich so geändert und schon kannst du alle Buttons bestimmen oder du, computer, du, computer, ...


```
package testen2;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JToggleButton;

class Brett extends JPanel implements ActionListener
{
	private JToggleButton button[] = new JToggleButton[10];
	private JLabel auswahl;
	
	Oberflaeche ob;

	public Brett(Oberflaeche ob)
	{	
		this.ob = ob;
		
		auswahl = new JLabel("");
		auswahl.setText("Auswahl");
		add(auswahl);
	
		for( int i = 0; i < button.length; i++ )
		{
  			button[i] = new JToggleButton(""+(i+1));
			add(button[i]);
			button[i].addActionListener(this);
		}
	}
			
	public void actionPerformed(ActionEvent e)
	{
		wechselSpieler();
	}
	public void wechselSpieler()
	{
		if(ob.getModus() == false)	//Methode liefert true für P1 & false für Co
		{
			waehleButton();
		}
		else
		{}
	}
	public void waehleButton() //Hier wählt der Rechner ein noch nicht gedrückten Button
	{
		int i = (int)(Math.random()*10);
		if(button[i].isSelected() == false)
		{
			button[i].setSelected(true);
		}
		else
			waehleButton();
	}

	public JLabel getAuswahl() {
		return auswahl;
	}

	public void setAuswahl(JLabel auswahl) {
		this.auswahl = auswahl;
	}
}
```

die Methode nextPlayer() kann wieder aus Oberflaeche raus

ist das eher das was du wolltest?


----------



## blaues_etwas (4. Feb 2008)

Ich bekomm diese Fehlermeldung in Oberflaeche:


> symbol  : constructor Brett ()
> location: class Brett
> brett = new Brett();



Desweiteren bin ich etwas verwirrt, wo jetzt bei dir der spielerwechsel statt findet !? Ich habe dafür ursprünglich _spielerwechsel_ verwendet.


----------



## outbreaker (4. Feb 2008)

verstehst du unter Spielerwechsel den Wechsel zwischen CO und P1 oder zwischen den P1 spielern?
letzteres fehlt in meinem Code!

Meine Oberflaeche.java:


```
package testen2;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JRadioButtonMenuItem;

public class Oberflaeche extends JFrame implements ActionListener
{
	private JMenuItem start = new JMenuItem("Start");
	private JRadioButtonMenuItem p1 = new JRadioButtonMenuItem ("P1");
	private JRadioButtonMenuItem co = new JRadioButtonMenuItem ("Co");
	private JMenuItem ende = new JMenuItem("Quit");
	
	private ButtonGroup bgGruppe;
	
	private KZ kz;
	private Brett brett;
	
	public Oberflaeche(){	 }
	
	public Oberflaeche(KZ y)
	{
		kz = y;
		
		brett = new Brett(this);
		brett.setVisible(false);
		
		//Menuleiste menubar
		JMenuBar menubar = new JMenuBar();
		menubar.add( erstelleMenu() );
		setJMenuBar(menubar);
		start.setEnabled(false);
		
		start.addActionListener(this);
		p1.addActionListener(this);
		co.	addActionListener(this);
		ende.addActionListener(this);	

		this.setSize(300,300);
		setLocationRelativeTo(null);
		setBackground(Color.gray);
	}
	private JMenu erstelleMenu()
	{
		JMenu g = new JMenu("Menu");
		bgGruppe = new ButtonGroup();	
      		g.add(start);
		bgGruppe.add(p1);
		bgGruppe.add(co);
		g.add(p1);
		g.add(co);
      		g.add(ende);
		return g;
	}
	public void actionPerformed(ActionEvent e)
	{
		String name = e.getActionCommand();
		if(name.equals("Start"))
		{
			getContentPane().add(brett);
			brett.setVisible(true);
			brett.getAuswahl().setText("P1: "+p1.isSelected()+" Co: "+co.isSelected());
		}
		if(name.equals("P1"))
		{
			start.setEnabled(true);
		}
		if(name.equals("Co"))
		{
			start.setEnabled(true);
		}
		if(name.equals("Quit"))
		{
			setVisible(false);
			dispose();
			System.exit(0);
		}
	}
	
	public boolean getModus()
	{
		return p1.isSelected();
	}
}
```


----------



## blaues_etwas (4. Feb 2008)

Ich hab das Spiel zuerst so programmiert, dass P1vP2 gegeneinander spielen. Nachdem das lief hab ich in das Programm P1vCo hineingeflickt. D.h. Ich hab eine klasse P2, die je nach Modus P2 oder Co annimmt. 
spielerwechsel = false; //P1 ist am drücker
spielerwechsel = true; //P2 ist dran. Oder der Computer wählt automatisch ..


----------



## outbreaker (4. Feb 2008)

Also fehlt dir die Variable _spielerwechsel _ in meinem Code

na die kannst du doch wieder einbauen in _wechselSpieler()_


```
package testen2;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JToggleButton;

class Brett extends JPanel implements ActionListener
{
	private JToggleButton button[] = new JToggleButton[10];
	private JLabel auswahl;
	private boolean spielerwechsel = false;
	
	Oberflaeche ob;

	public Brett(Oberflaeche ob)
	{	
		this.ob = ob;
		
		auswahl = new JLabel("");
		auswahl.setText("Auswahl");
		add(auswahl);
	
		for( int i = 0; i < button.length; i++ )
		{
  			button[i] = new JToggleButton(""+(i+1));
			add(button[i]);
			button[i].addActionListener(this);
		}
	}
			
	public void actionPerformed(ActionEvent e)
	{
		wechselSpieler();
	}
	public void wechselSpieler()
	{
		spielerwechsel = !spielerwechsel; // Spieler welchsel

		if(ob.getModus() == false)	//Methode liefert true für P1 & false für Co
		{
			waehleButton();
		}
		else
		{}
	}
	public void waehleButton() //Hier wählt der Rechner ein noch nicht gedrückten Button
	{
		int i = (int)(Math.random()*10);
		if(button[i].isSelected() == false)
		{
			button[i].setSelected(true);
		}
		else
			waehleButton();
	}

	public JLabel getAuswahl() {
		return auswahl;
	}

	public void setAuswahl(JLabel auswahl) {
		this.auswahl = auswahl;
	}
}
```
Somit wechselt jedesmal der Spieler nachdem ein Button gedrückt wurde bzw der Computer einen Button gewählt hat


----------



## blaues_etwas (4. Feb 2008)

Mal ne doofe Frage, aber läuft das bei dir?
Ich bekomm das nicht zum laufen, wegen der Fehlermeldung, die ich oben schon erwähnt hab.
Was ist eigentlich package testen2; ??


----------



## outbreaker (4. Feb 2008)

*package testen2;* das ist der Name von dem package in dem ich deine Datein drin habe
das ist bei dir anders würde ich sagen also nimme es mal raus


----------



## blaues_etwas (4. Feb 2008)

Jetzt läuft das Programm .. *glücklich bin*
Danke dir vielmals dass du mir geholfen hast und natürlich für deine "ausdauer" .. ^^
Der Grund meines Fehlers war, dass ich (aus versehen) zwei Oberflaechen-Objekte hatte und deshalb getModus() nicht korrekt arbeiten konnte ?


----------



## outbreaker (4. Feb 2008)

genau das war das Problem
Du hattest zwei verschiedene Oerflaechen-Instanzen


----------

