Schiffeversenken

Status
Nicht offen für weitere Antworten.
L

lemalsaint

Gast
Hallo alle, zum wiederholent Male habe ich eine Frage zu meiner Unisemesterarbeit "Schiffeversenken"
habe zwischenzeitlich ein geeignetes Spielfeld(2dimensionales JButton(extendet)Array), Schiffe und eine Startklasse geschrieben. Jetzt habe ich eigene Klasse für einen MouseListener, die bei rechtsklick horizontale und bei linksklick vertikale schiffe setzt. Eclipse erkennt keine Fehler,aber der Mouselistener tut nix.
Ich poste mal die GUIKlasse, die Klasse für die Schiffe und die MouseListener Klasse.
Ich könnte mir vorstellen dass ich das Fenster bzw. die dazugehörigen Panels irgendwo falsch instanziert habe, aber ich probier seit tagen und es ändert sich nix...
wäre super wenn jemand den Fehler findet...
Danke sehr für Bemühungen
Grüße
Olli

Hier mal die Fenster:
Code:
import javax.swing.*; 
import java.awt.*;
import java.awt.event.*;

//mediatracker

public class Fenster implements ActionListener{

	
	
	private Feld spielfeld[][];
	private Feld spielfeldPC[][];
	int eingabezeile;
	
	public Fenster()
	{
		JFrame spielfeld = spielfeld();
		JPanel grundPanel = grundPanel();
		JPanel spielerPanel= spielfeldPanel();
		JPanel pcPanel = spielfeldPanel();
		grundPanel.add(spielerPanel);
		grundPanel.add(pcPanel);
		spielfeld.add(grundPanel);
		spielfeld.setVisible(true);
	}
	
	//Methode zum erzeugen des Fensters,auf dem das Spielfeld angezeigt wird
	//plus Dialog,der die gewünschte Spielfeldgröße abfragt
	private JFrame spielfeld(){
		JFrame frame = new JFrame("Schiffeversenken");
		JFrame.setDefaultLookAndFeelDecorated(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        Dialog dialog = new Dialog(frame);
        eingabezeile = dialog.gibGroesse();
        frame.setSize((eingabezeile*60),eingabezeile*30);
        return frame;
		
	}
	
	//Methode zum erzeugen des Grundpanels
	private JPanel grundPanel()
	{
		JPanel grundPanel = new JPanel();
		grundPanel.setSize(eingabezeile*60, eingabezeile*30);
		grundPanel.setLayout(new GridLayout(1,2));
		 
		

		return grundPanel;
	}
		
	
		
	
	//methode zum erzeugen der Spielfeldpanels
	
	private  JPanel  spielfeldPanel() {
                
        JPanel Panel = new JPanel();
        GridLayout gridbag = new GridLayout(eingabezeile,eingabezeile);
        Panel.setSize(eingabezeile*30,eingabezeile*30);
        Panel.setLayout(gridbag);
        Panel.setBackground(Color.RED);
        spielfeld= new Feld[eingabezeile][eingabezeile];
        for( int a=0;a<(eingabezeile);a++)
        {
        	for (int b=0;b<eingabezeile;b++)
        	{	
        		spielfeld[a][b] = new Feld(a,b);
        		Panel.add(spielfeld[a][b]);
        	}} 
       
        
       
        Panel.setVisible(true);
        return Panel;
    }
	
	
	public void actionPerformed(ActionEvent event) 
	  {
	for( int a=0; a<eingabezeile; a++ )
    {
      for( int b=0; b<eingabezeile; b++ )
      {
        // Ausloeser des Events ermitteln und mit den Buttons vergleichen  
        if( event.getSource().equals( spielfeld[a][b] ) )
        {
          spielfeld[a][b].setBackground(Color.BLUE);
          Icon bild = new ImageIcon("7.jpg");
          spielfeld[a][b].setIcon(bild);
          
        }
      }
    }
}
	public Feld[][] gibSpielfeld(Fenster f)
	{
		return this.spielfeld;
	}
	
	
	
	
	
	
}
hier dann die Schiffe
Code:
import java.awt.Color;



public class Schiffe  {
	
	private Feld spielfeld[][];
	public int posX;
	public int posY;
	public int laenge;
	public String klasse;
	private Fenster frame;
	//private boolean[][] istGetroffen;
	private boolean horizontal;
	
	
	public Schiffe(int posX,int posY,String name, int laenge,boolean horizontal)
	{	
		 posX=this.posX;
		 posY=this.posY;
		 klasse=name;
		 laenge=this.laenge;
		 //istGetroffen[posX][posY]=false;
		 horizontal= this.horizontal;
		 
	}

	public int gibtPosX(Schiffe schiff)
	{
		int x= schiff.posX;
		return x;
	}
	public int gibtPosY(Schiffe schiff)
	{
		int y= schiff.posY;
		return y;
	}
	
	public int gibLaenge(Schiffe schiff)
	{
		int z = schiff.laenge;
		return z;
	}
	public String gibKlasse(Schiffe schiff){
		String Name = schiff.klasse;
		return Name;
	}
	
	
	public void spielfeld()
	{	
	
		spielfeld = frame.gibSpielfeld(frame);
	}
	
	
	public void setzeSchiff(Schiffe schiff)
	{int a = schiff.gibtPosX(schiff);
	int b = schiff.gibtPosY(schiff);
	 if (schiff.horizontal=false)
		for(int z=schiff.gibtPosX(schiff);z<(a+schiff.gibLaenge(schiff));z++)
		{ 
	
		
			spielfeld[z][posY].setBackground(Color.RED);
			spielfeld[z][posY].istBesetzt = true;
		}
	 
	if (schiff.horizontal = true)
		
		for(int y=schiff.gibtPosY(schiff);y<(b+schiff.gibLaenge(schiff));y++){ 
		
		spielfeld[posX][y].setBackground(Color.RED);
		spielfeld[posX][y].istBesetzt = true;
			
			
		}
	}
	 }
und dann noch der MouseListener
Code:
import java.awt.event.*;

public class SchiffeSetzen  implements MouseListener {
	

	
	private int laenge =5;
	private boolean horizontal;
	
	
	public SchiffeSetzen()
	{
		
	}
	public void mouseClicked(MouseEvent e) 
	{
		
		Feld feld = (Feld)e.getSource();
		int a = feld.gibSpalte(feld);
		int b = feld.gibZeile(feld);
		horizontal =true;
		if ((e.getModifiers() & InputEvent.BUTTON3_MASK)== InputEvent.BUTTON3_MASK)
		{horizontal =true;}
		
			
		if ((e.getModifiers() & InputEvent.BUTTON1_MASK)== InputEvent.BUTTON1_MASK)
		{	horizontal =false;}
		Schiffe schiff =	new Schiffe(a,b,"",laenge,this.horizontal);
		schiff.setzeSchiff(schiff);
		laenge =laenge--;			
			
	}
	public void mousePressed(MouseEvent e) 
	{
		
	}
	public void mouseEntered(MouseEvent e) 
	{
		
	}
	public void mouseExited(MouseEvent e) 
	{
		
	}
	public void mouseReleased(MouseEvent e) 
	{
		
	}
}

ergänzend mal noch mein extendeter JButton:
Code:
import javax.swing.*;

/**
 * 
 * @Olli
 *Die Klasse Feld erzeugt JButtons mit erweiterten Eigenschaften
 *Die Buttons vom Typ Feld halten Informationen wo der Button liegt(XundY Position),
 *ob das Feld(=Button) mit einem Schiff besetzt ist und ob bereits auf dieses Feld geschossen wurde
 *
 */
public class Feld extends JButton {
	
	int zeile;
	int spalte;
	boolean istBesetzt;
	boolean beschossen;
	
	public Feld(int i , int j)
	{
		zeile = i;
		spalte=j;
		istBesetzt=false;
		beschossen=false;
	}

	/**
	 * Methode liefert den Y-Wert der Buttonposition
	 * @return
	 */
	public int gibZeile(Feld feld)
 	{
	 return feld.zeile;
 	}
	/**
	 * Methode liefert den X-Wert der Buttonposition
	 * @return
	 */
 	public int gibSpalte(Feld feld)
 	{
	 return feld.spalte;
 	}
 	/**
 	 * methode sagt,ob das Feld ein Schiff beherbergt
 	 * @return
 	 */
 	public boolean gibStatus(Feld feld)
 	{
 	 		return feld.istBesetzt;
 	}
 	public boolean gibSchuss(Feld feld)
 	{
 		return feld.beschossen;
 	}

}
 

LoN_Nemesis

Bekanntes Mitglied
Also das geht so nicht wie du das machen möchtest. Zunächst mal musst du festlegen, welches Fenster dein Mouselistener überwachen soll. Ich nehme an deine Hauptklasse ist irgendwie ein JPanel, JFrame, Applet oder sowas. Diesem musst du einen MouseListener hinzufügen, üblicherweise mit

Code:
addMouseListener(this);

in der Init Methode falls du sowas hast. Diese Klasse muss dann auch den MouseListener implementieren. Dann kannst du dort beispielsweise deine SchiffeSetzen Klasse aufrufen um die gewünschten Aktionen durchzuführen.
 
L

lemalsaint

Gast
Also meinst du dass ich keinen MouseListener instantieren kann?
Mein Prof meinte neulich dass das geht. Das Programm läuft als Application. das tut aber nix zur sache.
vor allem sagt eclipse mir schon dass es ok is wie ich den MouseListener instantiere
Code:
MouseListener m = new Schiffesetzen();
ich glaube das Problem liegt eher bei dem Konstruktor der Klasse Schiff bzw deren Methode SchiffeSetzen()
...
Gruß
 

LoN_Nemesis

Bekanntes Mitglied
Nein ich habe nicht gesagt dass es nicht geht, sondern dass es so wie du es machst nicht geht. Du hast zwar eine Klasse die den Mouselistener implementiert, aber du fügst nirgendwo einen hinzu.

Du musst irgendwo die Methode addMouseListener() aufrufen, sonst wird das nicht funktionieren.
 
L

lemalsaint

Gast
ups, ich hatte vergessen die spielklasse zu posten in der ich den mouseListener instantiiere und adde:
Code:
import java.awt.event.*;
public class Spiel {
	
	private Fenster frame;
	Fenster f ;
	private Feld spielfeld[][];
	MouseListener m;
	
	public Spiel()
	{
		m = new SchiffeSetzen();
		this.frame= new Fenster();
		spielfeld = f.gibSpielfeld(f);
		MouseListenerSetzen(spielfeld,15,15);
	}
	
	
	
	public void MouseListenerSetzen(Feld[][] s,int a,int b)
	{
		 for( int z=0;z<a;z++)
	        {
	        	for (int x=0;x<b;x++)
	        	{	
	        		 
	        		spielfeld[z][x].addMouseListener(m);
	        		
	        	}} 
	}
	
	
	
	public Fenster gibFrame()
	{
		return this.frame;
	}
	public static void main(String[] args) {
        
        
		new Spiel();
}
	
}

da stimmt dann doch hoffentlich alles, deshalb denke ich auch dass es an einer der methoden "schiffesetzte" oder dem konstruktor von schiffe liegt...
grüße
 

Zunera

Aktives Mitglied
Hallo,

beim Überfliegen deines Codes hab ich nirgends erkennen können, wo du das Spielfeld initialisiert, dessen Felder du dann mit deinem MouseListener versehen willst.

Code:
...
spielfeld = f.gibSpielfeld(f);
MouseListenerSetzen(spielfeld,15,15);
...

An dieser Stelle ist "f" noch nicht initialisiert oder habe ich was übersehen?? Es gibt nur ein

this.frame= new Fenster();

Eigentlich sollte das auch Eclipse ankreiden - wenn auch nur als Warnung.

Also wenn ich nix übersehen habe, dann ist weder "f" initialisiert, dementsprechend kann auch kein Spielfeld zurückgegeben werden und auch kein MouseListener gesetzt werden. Falls ich jetzt was übersehen habe liegts wohl an der Uhrzeit, ansonsten hoffe ich, dir damit weiterzuhelfen...
 
L

Lemalsaint

Gast
Du hast vollkommen recht, hab das uach geändert,aber leider macht er trotzdem nix anderes....
das strange, eigentlich sollten die Methoden funktionstüchtig sein.
ich verzweifle,vor allem da ich schon seit einer Woche daran hänge
danke auf jeden für deine Hilfe
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen

Ähnliche Java Themen


Oben