JRadioButtonMenuItem

Status
Nicht offen für weitere Antworten.
B

blaues_etwas

Gast
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:
Code:
[..]
public boolean getGewaehlt()
	{
		boolean gewaehlt = true;
		if(miP1.isSelected() == true)
			gewaehlt = true;
		if(miP2.isSelected() == true)
			gewaehlt = false;
		return gewaehlt;
	}
[..]

Teil aus dem JPanel:

Code:
[..]
if(ob.getGewaehlt() == false)
		{
			aktion();
		}
[..]
 
B

Beni

Gast
Bist du sicher, dass du nicht zwei verschiedene Objekte befragst?
Kannst ja mal in "getGewaehlt()" folgendes ausgeben:
Code:
System.out.println( miP1.isSelected() + " " + miP2.isSelected())
Wenn die angezeigten Werte im Menü nicht zu diesen Ausgaben passen, dann hast du verschiedene Objekte.
 
B

blaues_etwas

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

blaues_etwas

Gast
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.
 
B

blaues_etwas

Gast
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

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

blaues_etwas

Gast
@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..

Code:
//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;
	}
}

Code:
//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

Bekanntes Mitglied
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
 
B

blaues_etwas

Gast
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

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

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

Oberflaeche.java:

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

Code:
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:
Code:
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;
	}
}
 
G

Guest

Gast
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

Bekanntes Mitglied
ok dann habe das wohl etwas falsch verstanden somit ist mein Beispiel nicht ganz das was du willst aber mit der
Code:
	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.
 
B

blaues_etwas

Gast
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.
Code:
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

Bekanntes Mitglied
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.
Code:
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.

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, ...

Code:
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?
 
B

blaues_etwas

Gast
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

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

Meine Oberflaeche.java:

Code:
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();
	}
}
 
B

blaues_etwas

Gast
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

Bekanntes Mitglied
Also fehlt dir die Variable spielerwechsel in meinem Code

na die kannst du doch wieder einbauen in wechselSpieler()

Code:
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
 
B

blaues_etwas

Gast
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

Bekanntes Mitglied
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
 
B

blaues_etwas

Gast
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 ?
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen

Ähnliche Java Themen


Oben