MouseListener macht was er will

danx066

Mitglied
Hallo,
ich bin swing-Anfänger und verzweifele an diesem MouseListener. Jedesmal wenn ich das Programm starte, macht der was anderes.
Ich hab ein GridLayout mit nem Panel drin, das 89 Labels mit Bildern enthält,´.
Was ich erreichen will, ist, dass man auf ein Bild klickt, es dann durch ein anderes ausgetauscht wird.
Das funktioniert prinzipiell, in meinem Fall aber immer nur bei ca. der Hälfte der Bilder. Die anderen verändern sich nicht und es sind auch jedesmal andere, bei denen es funktioniert.
Was mache ich falsch?
Java:
package GoGame;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.List;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.ImageObserver;
import java.util.ArrayList;

import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.SwingConstants;

public class Gui {
private String text;//Aus dem Konstrukter raus, damit von überall drauf zugreifbar.
private JTextField text1;
private JFrame frame;
private JPanel Gesamt;
private JPanel panel;
private ArrayList<JLabel> Rasterfelder;
private JLabel tmpLabel;
private ImageIcon icon1;


Gui(){	
		frame = new JFrame( "Go" );
		frame.setDefaultCloseOperation( JFrame.DISPOSE_ON_CLOSE );
		frame.setVisible( true );
		frame.setSize( 800, 400 );
		
		Gesamt=new JPanel();
		Gesamt.setLayout(new BorderLayout());
		text1=new JTextField();
		text="abc"; 
		text1.setText(text);
		Gesamt.add(BorderLayout.NORTH, new JLabel("<---Oben--\n--------------"));
		Gesamt.add(BorderLayout.SOUTH, new JLabel("<---Unten--\n--------------"));
		Gesamt.add(BorderLayout.CENTER, text1);
		Gesamt.add(BorderLayout.EAST, new JLabel("<---Rechts--\n--------------"));
		
		
		panel = new JPanel();
		//panel.setPreferredSize(new Dimension(360,360));
		
		
		Gesamt.add(BorderLayout.WEST, panel);
		
		//frame.getContentPane().add( panel );
		frame.getContentPane().add( Gesamt );
		
		panel.setLayout( new GridLayout( 9, 9));
		
		icon1=new ImageIcon("D:/Temp/gridiconsm.jpg");
		Rasterfelder=new ArrayList<JLabel>();
		for(int i=0;i<=89;i++){
			
			//tmpLabel=new JLabel(new ImageIcon("D:/Temp/gridiconsm.jpg"));
			icon1.setDescription("clear");
			tmpLabel=new JLabel(icon1);
			
			tmpLabel.setName(String.valueOf(i));
			tmpLabel.addMouseListener(new MouseListener()
						{
							@Override
							public void mouseClicked(MouseEvent arg0) {
								
								//<--Es soll vom im Label enthaltenen MausListener der Name
								//des enthaltenden Labels ausgegeben werden.	(MausListener.super wäre EventListener->geht nicht)
								//Deshalb wird die Liste aller Labels durchsucht und geprüft, ob
								//der MausListener eines Labels Diesem Objekt entspricht.
								//Ist dies der Fall kennt man das zugehörige Label (for-Index).
								for(int i=0;i<Rasterfelder.size();i++)
								{	if(Rasterfelder.get(i).getMouseListeners()[0]==this) //[0], da es offenbar nicht DEN MausListener gibt, sondern mehrere
									{	text="Feld: "+Rasterfelder.get(i).getName()+" mouseClicked";
								
										if( ((ImageIcon)Rasterfelder.get(i).getIcon()).getDescription()=="clear") 
										{	((ImageIcon)Rasterfelder.get(i).getIcon()).setDescription("black");
											Rasterfelder.get(i).setIcon(new ImageIcon("D:/Temp/gridiconsmblack.jpg"));
										}
										if( ((ImageIcon)Rasterfelder.get(i).getIcon()).getDescription()=="black") 
										{	((ImageIcon)Rasterfelder.get(i).getIcon()).setDescription("clear");
											Rasterfelder.get(i).setIcon(new ImageIcon("D:/Temp/gridiconsm.jpg"));
										}
									}
								}
								
								//------------------------------------->
								text1.setText(text);	//JTextfield bekommt String
								
							}
	
							@Override
							public void mouseEntered(MouseEvent arg0) {
								for(int i=0;i<Rasterfelder.size();i++)	//
									if(Rasterfelder.get(i).getMouseListeners()[0]==this)
									{	text="Feld: "+Rasterfelder.get(i).getName()+" mouseEntered";
										/*if( ((ImageIcon)Rasterfelder.get(i).getIcon()).getDescription()=="clear") 
										{	((ImageIcon)Rasterfelder.get(i).getIcon()).setDescription("rotate");
											Rasterfelder.get(i).setIcon(new ImageIcon("D:/Temp/gridiconsmblack.jpg"));
											//((ImageIcon)Rasterfelder.get(i).getIcon()).setImage("D:/Temp/gridiconsmrot.gif");
											//((ImageIcon)Rasterfelder.get(i).getIcon()).setDescription("rotate");
										}*/
										
									}
								text1.setText(text);
							}
	
							@Override
							public void mouseExited(MouseEvent arg0) {
								for(int i=0;i<Rasterfelder.size();i++)
								{	if(Rasterfelder.get(i).getMouseListeners()[0]==this)
									{	text=((ImageIcon)Rasterfelder.get(i).getIcon()).getDescription();
									//text="Feld: "+Rasterfelder.get(i).getName()+" mouseExited";
										/*if( ((ImageIcon)Rasterfelder.get(i).getIcon()).getDescription()=="rotate") 
										{	((ImageIcon)Rasterfelder.get(i).getIcon()).setDescription("clear");
										Rasterfelder.get(i).setIcon(new ImageIcon("D:/Temp/gridiconsm.jpg"));}*/
									}
								}
								text1.setText(text);
							}
	
							@Override
							public void mousePressed(MouseEvent arg0) {
								for(int i=0;i<Rasterfelder.size();i++)
									if(Rasterfelder.get(i).getMouseListeners()[0]==this)
										text="Feld: "+Rasterfelder.get(i).getName()+" mousePressed";
								text1.setText(text);
							}
	
							@Override
							public void mouseReleased(MouseEvent arg0) {
								// TODO Auto-generated method stub
								
							}
					});
			
			
			
			Rasterfelder.add(tmpLabel);	//gerade erstelltes Label (Ref.Var) in Liste
			panel.add(tmpLabel);		//das SELBE auch ins Panel
		}
		
		
		frame.setVisible( true );
		
		
		}


public static void main(String[] args) { Gui g=new Gui();}
}


//quelle [url=http://www.java2s.com/Code/Java/Swing-JFC/AddJListtoScrollpane.htm]Add JList to Scroll pane : ListSwing JFCJava[/url]
 
Zuletzt bearbeitet von einem Moderator:

danx066

Mitglied
Meinst du einen MouseListener für das ganze Panel und dass man dann überprüft in welches Feld des GridLayouts geklickt wurde? Wie soll man das denn rausfinden? Ich war schon froh, dass der Vergleich von allen vorhandenen mit this im MouseListener funktioniert hat^^
Oder hat ein GridLayout spezielle Funktionen für genau diese Überprüfung? Ich hab jedenfalls bisher nichts passendes entdeckt.
 

danx066

Mitglied
Danke erstmal für die Antwort.
Ich versuche die Idee mal nachzuvollziehen:
MeinPanelMitGridLayout.getBounds -> gibt ein Rectangle zurück.
Rectangle.contains(x,y) -> ist true, wenn das Rectangle etwas an dieser Position enthält?
MouseEvent.getX() /.getY() -> geben die Pixelposition des letzten Mausevents zurück.
Aber was macht man mit dem Ganzen zusammen jetzt?

Was ich gerne hätte ist ja das ImageIcon-Object auf das geklickt wurde,
oder der Index des GridLayout-Feldes auf das geklickt wurde (x,y),
damit ich dann das enthaltene Bild austauschen kann.

Wenn ich einen MouseListener zum GridLayout-Panel hinzufüge, brauche ich bei einem Click also die momentane Curserposition (oder geht das auch besser, da man in diesem Fall ja an eine bestimmte Fenstergröße gebunden ist. Wenn ich es größer ziehe hab ich nämlich immer größer werdende Abstände zwischen den Bildern; also ist die Größe jedes GridLayout Feldes leider nicht fest).
Und anhand der CurserPosition kann ich dann ausrechnen, über welchem Feld ich mich gerade befinde (da jedes Bild 40px hoch/breit ist).
Ist das so ungefähr die Idee hinter deinem Vorschlag gewesen?
 

Simon_Flagg

Bekanntes Mitglied
component war in meinen fall eines der label, auf dem sich einer der imageicons befindet....
mit der zeile, die ich gepostet habe, solltest du überprüfen können, ob es dieses Label ist, auf das du geklickt hast.... (geh einfach alle objekte in deiner arraylist durch...)

lg
 

danx066

Mitglied
Ok, also ich behalte jetzt die MouseListener in jedem JLabel und füge statt meiner diese Abfrage ein, um zu überprüfen, in welchem Label man sich befindet
Java:
if(Rasterfelder.get(i).getBounds().contains(arg0.getX(),arg0.getY()))
Wenn ich das so schreib, ist es jedoch immer wahr, da soweit ich das verstanden hab, nur geguckt wird, ob das Label in dem man geklickt hat, so groß ist, dass sich dort ein Punkt MouseEvent.getX() MouseEvent.getY() befindet. Das ist jedoch immer der Fall, da alle gleich groß sind, also ist die Abfrage schon beim allerersten Label wahr oder nicht? Wenn das so wäre, müsste sie ja bei jedem wahr sein.
Doch wenn ich da bei mouseClicked das oben eintrage:
Java:
for(int i=0;i<Rasterfelder.size();i++){
if(Rasterfelder.get(i).getBounds().contains(arg0.getX(),arg0.getY()))
System.out.println("\n"+i+"label getX("+arg0.getX()+") getY("+arg0.getY()+")");
krieg ich nur eine Zeile ausgegeben. Nämlich immer 0label getX(18) getY(18), wobei die Zahlen die CurserPosition in dem Label sind, in das ich geklickt hab.
Ich versteh gar nicht, wieso das .contains jetzt immer nur beim 0-ten Label true ist?
Aber wieso produziert meine Lösung überhaupt solche Fehler...
 
S

SlaterB

Gast
getX()/getY() des Mouse-Events bezieht sich auf die Komponente, in der geklickt wurde,
also immer nur 0-20 Pixel innerhalb eines der beliebigen Labels

getSource() mit dem Raster-Labeln auf == zu vergleichen ist die bessere Variante,
was ist denn aktuell die Frage, oder sind noch alle bisherigen Postings + Code aktuell?
 

André Uhres

Top Contributor
Wie ich das sehe, genügt ein simpler getSource() Aufruf:
Java:
public void mouseClicked(MouseEvent arg0) {
    JLabel source = (JLabel) arg0.getSource();
    text = "Feld: " + source.getName() + " mouseClicked";

Gruß,
André
 

danx066

Mitglied
Das ist ja gar nicht mal so unkompliziert...
Mir ist noch nicht ganz klar, was das für Vorteile mit sich bringt allen Labels den Selben MouseListener zuzuweisen; ich frage mich noch warum es logisch überhaupt funktionieren kann, das sich der selbe um verschiedene Objekte kümmert.

Ich habe jetzt zuerst die Zeile
Java:
if(Rasterfelder.get(i).getMouseListeners()[0]==this)
gegen
Java:
if(Rasterfelder.get(i)==arg0.getSource())
getauscht, was aber ganz genauso funktioniert, es ändert nichts.

Dann hab ich wie hier http://www.java-forum.org/bilder-gui-damit-zusammenhaengt/49255-componenten-listener.html im zweiten Textfenster beschrieben, in der erstellenden for-Schleife eine final-Variable mit dem jeweiligen for-index erstellt, die der MouseListener direkt benutzen kann.
Damit entfällt das Durchsuchen und Vergleichen der Arraylist nach dem angeklickten Label, da es dem MouseListener also bekannt ist.
Eigentlich eine nette Idee, da wäre ich selber nicht drauf gekommen.

Das Problem ist nur, auch das ändert leider gar nichts.
Mein Programm funktioniert noch genauso wie am Anfang.

Das heißt ich starte es, klicke auf ein paar Felder und in manchen ändert sich das Bild, in manchen nicht. Und die, die sich ändern sind bei jedem Programmstart andere.

Hier nochmal der ganze Text:
Java:
package GoGame;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.List;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.ImageObserver;
import java.util.ArrayList;

import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.SwingConstants;

public class Gui {
private String text;//Aus dem Konstrukter raus, damit von überall drauf zugreifbar.
private JTextField text1;
private JFrame frame;
private JPanel Gesamt;
private JPanel panel;
private ArrayList<JLabel> Rasterfelder;
private JLabel tmpLabel;
private ImageIcon icon1;


int gridArray[][]=new int[9][9];	//Enthält später 1, wo Stein gesetzt ist.
int [][] getgridArray(){System.out.println("\n\n\n\n\n\n\n\n\n\n\n\n\n");
	//Ausgabe zum Testen
	for(int i=0;i<9;i++){
		for(int j=0;j<9;j++)
			System.out.print(gridArray[i][j]+"   ");System.out.println("");
	}
	
	return this.gridArray;}


Gui(){	frame = new JFrame( "Go" );
		frame.setDefaultCloseOperation( JFrame.DISPOSE_ON_CLOSE );
		frame.setVisible( true );
		frame.setSize( 800, 400 );
		
		Gesamt=new JPanel();
		Gesamt.setLayout(new BorderLayout());
		text1=new JTextField();
		text="abc"; 
		text1.setText(text);
		Gesamt.add(BorderLayout.NORTH, new JLabel("<---Oben--\n--------------"));
		Gesamt.add(BorderLayout.SOUTH, new JLabel("<---Unten--\n--------------"));
		Gesamt.add(BorderLayout.CENTER, text1);
		Gesamt.add(BorderLayout.EAST, new JLabel("<---Rechts--\n--------------"));
		
	
		
		panel = new JPanel();
		
		
		
		Gesamt.add(BorderLayout.WEST, panel);
		
		
		frame.getContentPane().add( Gesamt );
		
		panel.setLayout( new GridLayout( 9, 8));
		
		icon1=new ImageIcon("D:/Temp/gridiconsm.jpg");
		Rasterfelder=new ArrayList<JLabel>();
		for(int i=0;i<=89;i++){
			
			
			icon1.setDescription("clear");
			tmpLabel=new JLabel(icon1); 
			final int nr=i;	//for-Index für den MouseListener
			
			tmpLabel.setName(String.valueOf(i));
			tmpLabel.addMouseListener(new MouseListener()
						{
							@Override
							public void mouseClicked(MouseEvent arg0) {
								
								
									text="Feld: "+Rasterfelder.get(nr).getName()+" mouseClicked";
							
									if( ((ImageIcon)Rasterfelder.get(nr).getIcon()).getDescription()=="clear") //Wenn Feld leer->
									{	((ImageIcon)Rasterfelder.get(nr).getIcon()).setDescription("black");		//dann Stein setzen
										Rasterfelder.get(nr).setIcon(new ImageIcon("D:/Temp/gridiconsmblack.jpg"));
										
										gridArray[(nr/10)][(nr%10)]=1;//Angenommen i==42, dann will man den zweiten Stein in der
										//vierten Reihe im Array auf 1 setzen. Der erste Index wird für die Reihe genommen
										//also 42/10 ist ganzzahlig 4. Der zweite Index ist die Spalte, also 42mod10 ist 2
												//Die 1 wird also in Feld [4][2] geschrieben. Da das Array jew. bei 0 anfängt werden beide -1//DOCH NICHT
										getgridArray();
									}
									if( ((ImageIcon)Rasterfelder.get(nr).getIcon()).getDescription()=="black") //Wenn Feld gesetzt->
									{	((ImageIcon)Rasterfelder.get(nr).getIcon()).setDescription("clear");		//dann Feld leeren
										Rasterfelder.get(nr).setIcon(new ImageIcon("D:/Temp/gridiconsm.jpg"));
									}
								
								
								
								
								/*//<--Es soll vom im Label enthaltenen MausListener der Name
								//des enthaltenden Labels ausgegeben werden.	(MausListener.super wäre EventListener->geht nicht)
								//Deshalb wird die Liste aller Labels durchsucht und geprüft, ob
								//der MausListener eines Labels Diesem Objekt entspricht.
								//Ist dies der Fall kennt man das zugehörige Label (for-Index).
								for(int i=0;i<Rasterfelder.size();i++)
								{	if(Rasterfelder.get(i)==arg0.getSource())//if(Rasterfelder.get(i).getMouseListeners()[0]==this) //[0], da es offenbar nicht DEN MausListener gibt, sondern mehrere
									{	text="Feld: "+Rasterfelder.get(i).getName()+" mouseClicked";
								
										if( ((ImageIcon)Rasterfelder.get(i).getIcon()).getDescription()=="clear") //Wenn Feld leer->
										{	((ImageIcon)Rasterfelder.get(i).getIcon()).setDescription("black");		//dann Stein setzen
											Rasterfelder.get(i).setIcon(new ImageIcon("D:/Temp/gridiconsmblack.jpg"));
											
											gridArray[(i/10)][(i%10)]=1;//Angenommen i==42, dann will man den zweiten Stein in der
											//vierten Reihe im Array auf 1 setzen. Der erste Index wird für die Reihe genommen
											//also 42/10 ist ganzzahlig 4. Der zweite Index ist die Spalte, also 42mod10 ist 2
													//Die 1 wird also in Feld [4][2] geschrieben. Da das Array jew. bei 0 anfängt werden beide -1//DOCH NICHT
											getgridArray();
										}
										if( ((ImageIcon)Rasterfelder.get(i).getIcon()).getDescription()=="black") //Wenn Feld gesetzt->
										{	((ImageIcon)Rasterfelder.get(i).getIcon()).setDescription("clear");		//dann Feld leeren
											Rasterfelder.get(i).setIcon(new ImageIcon("D:/Temp/gridiconsm.jpg"));
										}
									}
								}*/
								
								//------------------------------------->
								text1.setText(text);	//JTextfield bekommt String
								
							}
	
							@Override
							public void mouseEntered(MouseEvent arg0) {
								for(int i=0;i<Rasterfelder.size();i++)	//
									if(Rasterfelder.get(i).getMouseListeners()[0]==this)
									{	text="Feld: "+Rasterfelder.get(i).getName()+" mouseEntered";
										/*if( ((ImageIcon)Rasterfelder.get(i).getIcon()).getDescription()=="clear") 
										{	((ImageIcon)Rasterfelder.get(i).getIcon()).setDescription("rotate");
											Rasterfelder.get(i).setIcon(new ImageIcon("D:/Temp/gridiconsmblack.jpg"));
											//((ImageIcon)Rasterfelder.get(i).getIcon()).setImage("D:/Temp/gridiconsmrot.gif");
											//((ImageIcon)Rasterfelder.get(i).getIcon()).setDescription("rotate");
										}*/
										
									}
								text1.setText(text);
							}
	
							@Override
							public void mouseExited(MouseEvent arg0) {
								for(int i=0;i<Rasterfelder.size();i++)
								{	if(Rasterfelder.get(i).getMouseListeners()[0]==this)
									{	text=((ImageIcon)Rasterfelder.get(i).getIcon()).getDescription();
									//text="Feld: "+Rasterfelder.get(i).getName()+" mouseExited";
										/*if( ((ImageIcon)Rasterfelder.get(i).getIcon()).getDescription()=="rotate") 
										{	((ImageIcon)Rasterfelder.get(i).getIcon()).setDescription("clear");
										Rasterfelder.get(i).setIcon(new ImageIcon("D:/Temp/gridiconsm.jpg"));}*/
									}
								}
								text1.setText(text);
							}
	
							@Override
							public void mousePressed(MouseEvent arg0) {
								for(int i=0;i<Rasterfelder.size();i++)
									if(Rasterfelder.get(i).getMouseListeners()[0]==this)
										text="Feld: "+Rasterfelder.get(i).getName()+" mousePressed";
								text1.setText(text);
							}
	
							@Override
							public void mouseReleased(MouseEvent arg0) {
								// TODO Auto-generated method stub
								
							}
					});
			
			
			
			Rasterfelder.add(tmpLabel);	//gerade erstelltes Label (Ref.Var) in Liste
			panel.add(tmpLabel);		//das SELBE auch ins Panel
			
		}
		
		
		frame.setVisible( true );
		
		
		}





public static void main(String[] args) { Gui g=new Gui();}
}


//quelle [url=http://www.java2s.com/Code/Java/Swing-JFC/AddJListtoScrollpane.htm]Add JList to Scroll pane : ListSwing JFCJava[/url]
 

danx066

Mitglied
Problem gelöst.
Vielen Dank an jeden der sich die Zeit genommen hat hier über mein Problem nachzudenken;)

Der Fehler hatte gar nicht so direkt was mit dem Listener zu tun, sondern mit den Objekten.
In der Schleife, in der die 89 Labels erstellt, mit ImageIcon bepackt und in Arrayliste sowie ins GridLayout geadded werden, habe ich versehentlich anders als geplant nicht 89 neue Labels erstellt und 89 neue ImageIcons hineingetan, sondern 89 neue Labels erstellt und immer DAS SELBE ImageIcon hieingetan.
Wenn ich dann auf eins geklickt hab, wird zuerst dessen Description geändert (Fehler, denn das scheint teilweise zu den anderen durchgeschlagen zu sein) und dann wird es durch ein new ImageIcon.. ersetzt.
(Mal abgesehen davon, dass die Discription danach weg sein müsste)

Also hab ich jetzt ich das icon=new ImageIcon, das vor der 89er-for-Schleife stand einfach reingepackt und es läuft.
Alle drei Lösungswege laufen jetzt.
Nochmal alles:
Java:
package GoGame;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.List;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.ImageObserver;
import java.util.ArrayList;

import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.SwingConstants;

public class Gui {
private String text;//Aus dem Konstrukter raus, damit von überall drauf zugreifbar.
private JTextField text1;
private JFrame frame;
private JPanel Gesamt;
private JPanel panel;
private ArrayList<JLabel> Rasterfelder;
private JLabel tmpLabel;
private ImageIcon icon1;


int gridArray[][]=new int[9][9];	//Enthält später 1, wo Stein gesetzt ist.
int [][] getgridArray(){System.out.println("\n\n\n\n\n\n\n\n\n\n\n\n\n");
	//Ausgabe zum Testen
	for(int i=0;i<9;i++){
		for(int j=0;j<9;j++)
			System.out.print(gridArray[i][j]+"   ");System.out.println("");
	}
	
	return this.gridArray;}


Gui(){	frame = new JFrame( "Go" );
		frame.setDefaultCloseOperation( JFrame.DISPOSE_ON_CLOSE );
		frame.setVisible( true );
		frame.setSize( 800, 400 );
		
		Gesamt=new JPanel();
		Gesamt.setLayout(new BorderLayout());
		text1=new JTextField();
		text="abc"; 
		text1.setText(text);
		Gesamt.add(BorderLayout.NORTH, new JLabel("<---Oben--\n--------------"));
		Gesamt.add(BorderLayout.SOUTH, new JLabel("<---Unten--\n--------------"));
		Gesamt.add(BorderLayout.CENTER, text1);
		Gesamt.add(BorderLayout.EAST, new JLabel("<---Rechts--\n--------------"));
		
	
		
		panel = new JPanel();
		//panel.setPreferredSize(new Dimension(360,360));
		
		
		Gesamt.add(BorderLayout.WEST, panel);
		
		//frame.getContentPane().add( panel );
		frame.getContentPane().add( Gesamt );
		
		panel.setLayout( new GridLayout( 9, 8));
		
		//icon1=new ImageIcon("D:/Temp/gridiconsm.jpg"); //DAS HIER
		Rasterfelder=new ArrayList<JLabel>();
		for(int i=0;i<=89;i++){
			
			
			icon1=new ImageIcon("D:/Temp/gridiconsm.jpg"); //IST JETZT HIER
			icon1.setDescription("clear");
			tmpLabel=new JLabel(icon1); 
			final int nr=i;	//for-Index für den MouseListener
			
			tmpLabel.setName(String.valueOf(i));
			tmpLabel.addMouseListener(new MouseListener()
						{
							@Override
							public void mouseClicked(MouseEvent arg0) {
								
								JLabel source = (JLabel) arg0.getSource();//Mit 'einfachem' Sourceaufruf
							    text = "Feld: " + source.getName() + " mouseClicked";
							    if( ((ImageIcon)source.getIcon()).getDescription()=="clear")
							    {	source.setIcon(new ImageIcon("D:/Temp/gridiconsmblack.jpg"));
							    	((ImageIcon)source.getIcon()).setDescription("black");
							    	gridArray[(Integer.parseInt(source.getName())/10)][(Integer.parseInt(source.getName())%10)]=1;
							    	getgridArray();
							    }
							    
							    
							//	/*if(Rasterfelder.get(nr)==arg0.getSource())//if(Rasterfelder.get(i).getMouseListeners()[0]==this) //[0], da es offenbar nicht DEN MausListener gibt, sondern mehrere
							//	{*/	text="Feld: "+Rasterfelder.get(nr).getName()+" mouseClicked";
							//
							//		if( ((ImageIcon)Rasterfelder.get(nr).getIcon()).getDescription()=="clear") //Wenn Feld leer->
							//		{	((ImageIcon)Rasterfelder.get(nr).getIcon()).setDescription("black");		//dann Stein setzen
							//			Rasterfelder.get(nr).setIcon(new ImageIcon("D:/Temp/gridiconsmblack.jpg"));
							//			
							//			gridArray[(nr/10)][(nr%10)]=1;//Angenommen i==42, dann will man den zweiten Stein in der
							//			//vierten Reihe im Array auf 1 setzen. Der erste Index wird für die Reihe genommen
							//			//also 42/10 ist ganzzahlig 4. Der zweite Index ist die Spalte, also 42mod10 ist 2
							//					//Die 1 wird also in Feld [4][2] geschrieben. Da das Array jew. bei 0 anfängt werden beide -1//DOCH NICHT
							//		getgridArray();
							//		}
							//		if( ((ImageIcon)Rasterfelder.get(nr).getIcon()).getDescription()=="black") //Wenn Feld gesetzt->
							//		{	((ImageIcon)Rasterfelder.get(nr).getIcon()).setDescription("clear");		//dann Feld leeren
							//			Rasterfelder.get(nr).setIcon(new ImageIcon("D:/Temp/gridiconsm.jpg"));
							//		}
									/*}*/
								
								
							/*	
								//<--Es soll vom im Label enthaltenen MausListener der Name
								//des enthaltenden Labels ausgegeben werden.	(MausListener.super wäre EventListener->geht nicht)
								//Deshalb wird die Liste aller Labels durchsucht und geprüft, ob
								//der MausListener eines Labels Diesem Objekt entspricht.
								//Ist dies der Fall kennt man das zugehörige Label (for-Index).
								for(int i=0;i<Rasterfelder.size();i++)
								{	if(Rasterfelder.get(i)==arg0.getSource())//if(Rasterfelder.get(i).getMouseListeners()[0]==this) //[0], da es offenbar nicht DEN MausListener gibt, sondern mehrere
									{	text="Feld: "+Rasterfelder.get(i).getName()+" mouseClicked";
								
										if( ((ImageIcon)Rasterfelder.get(i).getIcon()).getDescription()=="clear") //Wenn Feld leer->
										{	((ImageIcon)Rasterfelder.get(i).getIcon()).setDescription("black");		//dann Stein setzen
											Rasterfelder.get(i).setIcon(new ImageIcon("D:/Temp/gridiconsmblack.jpg"));
											
											gridArray[(i/10)][(i%10)]=1;//Angenommen i==42, dann will man den zweiten Stein in der
											//vierten Reihe im Array auf 1 setzen. Der erste Index wird für die Reihe genommen
											//also 42/10 ist ganzzahlig 4. Der zweite Index ist die Spalte, also 42mod10 ist 2
													//Die 1 wird also in Feld [4][2] geschrieben. Da das Array jew. bei 0 anfängt werden beide -1//DOCH NICHT
											getgridArray();
										}
										if( ((ImageIcon)Rasterfelder.get(i).getIcon()).getDescription()=="black") //Wenn Feld gesetzt->
										{	((ImageIcon)Rasterfelder.get(i).getIcon()).setDescription("clear");		//dann Feld leeren
											Rasterfelder.get(i).setIcon(new ImageIcon("D:/Temp/gridiconsm.jpg"));
										}
									}
								}*/
								
								//------------------------------------->
								text1.setText(text);	//JTextfield bekommt String
								
							}
	
							@Override
							public void mouseEntered(MouseEvent arg0) {
								for(int i=0;i<Rasterfelder.size();i++)	//
									if(Rasterfelder.get(i).getMouseListeners()[0]==this)
									{	text="Feld: "+Rasterfelder.get(i).getName()+" mouseEntered";
										/*if( ((ImageIcon)Rasterfelder.get(i).getIcon()).getDescription()=="clear") 
										{	((ImageIcon)Rasterfelder.get(i).getIcon()).setDescription("rotate");
											Rasterfelder.get(i).setIcon(new ImageIcon("D:/Temp/gridiconsmblack.jpg"));
											//((ImageIcon)Rasterfelder.get(i).getIcon()).setImage("D:/Temp/gridiconsmrot.gif");
											//((ImageIcon)Rasterfelder.get(i).getIcon()).setDescription("rotate");
										}*/
										
									}
								text1.setText(text);
							}
	
							@Override
							public void mouseExited(MouseEvent arg0) {
								for(int i=0;i<Rasterfelder.size();i++)
								{	if(Rasterfelder.get(i).getMouseListeners()[0]==this)
									{	text=((ImageIcon)Rasterfelder.get(i).getIcon()).getDescription();
									//text="Feld: "+Rasterfelder.get(i).getName()+" mouseExited";
										/*if( ((ImageIcon)Rasterfelder.get(i).getIcon()).getDescription()=="rotate") 
										{	((ImageIcon)Rasterfelder.get(i).getIcon()).setDescription("clear");
										Rasterfelder.get(i).setIcon(new ImageIcon("D:/Temp/gridiconsm.jpg"));}*/
									}
								}
								text1.setText(text);
							}
	
							@Override
							public void mousePressed(MouseEvent arg0) {
								for(int i=0;i<Rasterfelder.size();i++)
									if(Rasterfelder.get(i).getMouseListeners()[0]==this)
										text="Feld: "+Rasterfelder.get(i).getName()+" mousePressed";
								text1.setText(text);
							}
	
							@Override
							public void mouseReleased(MouseEvent arg0) {
								// TODO Auto-generated method stub
								
							}
					});
			
			
			
			Rasterfelder.add(tmpLabel);	//gerade erstelltes Label (Ref.Var) in Liste
			panel.add(tmpLabel);		//das SELBE auch ins Panel
			
		}
		
		
		frame.setVisible( true );
		
		
		}





public static void main(String[] args) { Gui g=new Gui();}
}


//quelle [url=http://www.java2s.com/Code/Java/Swing-JFC/AddJListtoScrollpane.htm]Add JList to Scroll pane : ListSwing JFCJava[/url]
 
S

SlaterB

Gast
es gibt allgemein das Problem, das mouseClicked() empfindlich ist, wenn du die Maus nur minimal bewegst,
dann kommt gar kein mouseClicked()-Event, teste das Ausgabe, versuche es öfters auf dem gleichen Feld,
halte die Maus gedrückt, bewege die Maus, lasse sie los, und dann eben immer schneller/ kürzer,

mouseReleased() mag besser sein, musst nur noch testen, ob es da nicht Probleme mit Feld-Wechsel gibt (pressed auf anderen Feld als released)

dann fällt mir noch auf dass du zu viele Felder hast, verwende in der Schleife <81 statt <= 89 bei einem 9x9-Array,
[c]gridArray[(nr/10)][(nr%10)]=1;[/c]ist auch übel

mit Konstanten statt überall als Grenzen 8, 9 oder 10 wären solche Fehler weniger möglich,
anbei ein Testprogramm mit Text statt Bildern, mouse-Click wechselt von "A34" auf "B34" usw.

Java:
public class Test
{
    public static void main(String[] args)
    {
        Gui g = new Gui();

    }
}


class Gui
{
    private String text;// Aus dem Konstrukter raus, damit von überall drauf zugreifbar.
    private JTextField text1;
    private JFrame frame;
    private JPanel Gesamt;
    private JPanel panel;
    private ArrayList<JLabel> Rasterfelder;
    private JLabel tmpLabel;


    int gridArray[][] = new int[9][9]; // Enthält später 1, wo Stein gesetzt ist.

    int[][] getgridArray()
    {
        System.out.println("\n\n\n\n\n\n\n\n\n\n\n\n\n");
        // Ausgabe zum Testen
        for (int i = 0; i < 9; i++)
        {
            for (int j = 0; j < 9; j++)
                System.out.print(gridArray[i][j] + "   ");
            System.out.println("");
        }

        return this.gridArray;
    }


    Gui()
    {
        frame = new JFrame("Go");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setVisible(true);
        frame.setSize(800, 400);

        Gesamt = new JPanel();
        Gesamt.setLayout(new BorderLayout());
        text1 = new JTextField();
        text = "abc";
        text1.setText(text);
        Gesamt.add(BorderLayout.NORTH, new JLabel("<---Oben--\n--------------"));
        Gesamt.add(BorderLayout.SOUTH, new JLabel("<---Unten--\n--------------"));
        Gesamt.add(BorderLayout.CENTER, text1);
        Gesamt.add(BorderLayout.EAST, new JLabel("<---Rechts--\n--------------"));


        panel = new JPanel();


        Gesamt.add(BorderLayout.WEST, panel);


        frame.getContentPane().add(Gesamt);

        panel.setLayout(new GridLayout(9, 8));

        Rasterfelder = new ArrayList<JLabel>();
        for (int i = 0; i < 81; i++)
        {
            tmpLabel = new JLabel("A" + i);
            final int nr = i; // for-Index für den MouseListener

            tmpLabel.setName(String.valueOf(i));
            tmpLabel.addMouseListener(new MouseListener()
                {
                    public void mouseClicked(MouseEvent arg0)
                    {
                        System.out.println("clicked");

                        text = "Feld: " + Rasterfelder.get(nr).getName() + " mouseClicked";
                        JLabel l = Rasterfelder.get(nr);
                        if (l.getText().equals("A" + nr))
                        {
                            l.setText("B" + nr);
                            System.out.println("nr: " + nr + ", " + (nr / 9) + ", " + (nr % 9));
                            gridArray[(nr / 9)][(nr % 9)] = 1;
                            getgridArray();
                        }
                        else
                        {
                            l.setText("A" + nr);
                        }


                        // ------------------------------------->
                        text1.setText(text); // JTextfield bekommt String

                    }

                    public void mouseEntered(MouseEvent arg0)
                    {
                        for (int i = 0; i < Rasterfelder.size(); i++)
                            //
                            if (Rasterfelder.get(i).getMouseListeners()[0] == this)
                            {
                                text = "Feld: " + Rasterfelder.get(i).getName() + " mouseEntered";


                            }
                        text1.setText(text);
                    }

                    public void mouseExited(MouseEvent arg0)
                    {
                        for (int i = 0; i < Rasterfelder.size(); i++)
                        {
                            if (Rasterfelder.get(i).getMouseListeners()[0] == this)
                            {
                                text = Rasterfelder.get(i).getName();

                            }
                        }
                        text1.setText(text);
                    }

                    public void mousePressed(MouseEvent arg0)
                    {
                        for (int i = 0; i < Rasterfelder.size(); i++)
                            if (Rasterfelder.get(i).getMouseListeners()[0] == this)
                                text = "Feld: " + Rasterfelder.get(i).getName() + " mousePressed";
                        text1.setText(text);
                    }

                    public void mouseReleased(MouseEvent arg0)
                    {
                        System.out.println("r");
                        // TODO Auto-generated method stub

                    }
                });


            Rasterfelder.add(tmpLabel); // gerade erstelltes Label (Ref.Var) in Liste
            panel.add(tmpLabel); // das SELBE auch ins Panel

        }
        frame.setVisible(true);
    }

    public static void main(String[] args)
    {
        Gui g = new Gui();
    }
}
 

danx066

Mitglied
Ja das mit den Buchstaben funktioniert auch. Und wenn ichs gleich so gemacht hätte, wäre ich gar nicht in die Falle mit der Umbenennung geraten.
So sieht das übrigens bei mir aus (mit Bildern):

dan066.da.funpic.de/java/Gui.java
dan066.da.funpic.de/java/gridiconsm.jpg
dan066.da.funpic.de/java/gridiconsmblack.jpg
dan066.da.funpic.de/java/gridiconsmwhite.jpg
dan066.da.funpic.de/java/gridiconsmrot.gif

Die Sache mit der Feldzahl war mich auch schon aufgefallen. Sollten ja von anfang an 9x9 sein. Irgentwie hatte ich die ganze Zeit im Kopf dass 9*9==89 ist... naja nicht ganz.
Und dann hatte ich mich gewundert, dass ich da zehn in jeder Reihe hatte, obwohl beim GridLayout ja
9,9 angegeben waren. Aber mit <81 statt <=89 klappts;)
 
Zuletzt bearbeitet:

André Uhres

Top Contributor
Hallo danx066,

hier noch einige zusätzliche Tipps:

  • Die "Java Coding Conventions" bitte beachten (z.B. Variablennamen mit kleinem Anfangsbuchstaben), und die "Initial Capacity" bei einer List möglichst explizit initialisieren: [c]rasterfelder = new ArrayList<JLabel>(81);[/c]. Englische Feldnamen würden auch besser zum Code passen.

  • Die "Strings" bitte immer mit "equals" anstatt mit "==" vergleichen: [c]if (((ImageIcon) source.getIcon()).getDescription().equals("clear")) {[/c]

  • Was das Auffinden der Komponente betrifft, die ein Event auslöste, ist die simple "getSource" Variante wohl die Bessere.

Gruß,
André
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Viele ActionListener (MouseListener) - Performance AWT, Swing, JavaFX & SWT 24
ExceptionOfExpectation MouseListener-Objekte zu den Graphics-Objekten einfügen AWT, Swing, JavaFX & SWT 3
R Punkt von MouseListener hat falsche Koordinate AWT, Swing, JavaFX & SWT 2
J MouseListener wird nicht ausgeführt. AWT, Swing, JavaFX & SWT 4
S Swing Rechteck über JTable zeichnen (per MouseListener) AWT, Swing, JavaFX & SWT 1
G vorgefertigte Buttons oder neue Komponente mit MouseListener? AWT, Swing, JavaFX & SWT 0
F ListCellRenderer mit JLabel und MouseListener AWT, Swing, JavaFX & SWT 4
D Event Handling MouseListener funktioniert seit Java 8 nicht mehr AWT, Swing, JavaFX & SWT 13
M MouseListener auf table oder scrollPane AWT, Swing, JavaFX & SWT 11
B Event Handling MouseListener Behält seine Variablen, auch wenn ich ein neus Objekt erstelle AWT, Swing, JavaFX & SWT 2
D Swing &MouseListener in einem JFrame, sinnig? AWT, Swing, JavaFX & SWT 11
U MouselIstener zu JFrame AWT, Swing, JavaFX & SWT 6
F Swing MouseListener im JPanel AWT, Swing, JavaFX & SWT 3
J Swing Button mit JTable und MouseListener AWT, Swing, JavaFX & SWT 8
F JPanel + MouseListener AWT, Swing, JavaFX & SWT 5
JavaInBrain Swing Rückgabe aus MouseListener-Klasse AWT, Swing, JavaFX & SWT 3
A SWT SWT Scale und MouseListener AWT, Swing, JavaFX & SWT 7
J MouseListener und rechte Maustaste AWT, Swing, JavaFX & SWT 3
R MouseListener auf JPanel AWT, Swing, JavaFX & SWT 3
Q Swing MouseListener auf JTable geht nicht AWT, Swing, JavaFX & SWT 2
J Swing Einbau MouseListener in JPanel AWT, Swing, JavaFX & SWT 3
N Mit MouseListener X-Y Angaben vom Bild erfahren AWT, Swing, JavaFX & SWT 3
T MouseListener an Ecken von Polygonen hinzufügen AWT, Swing, JavaFX & SWT 5
H Swing JPanel in JTable mit MouseListener AWT, Swing, JavaFX & SWT 3
A Individueller MouseListener ? AWT, Swing, JavaFX & SWT 7
B MouseListener im Renderer einer JComboBox AWT, Swing, JavaFX & SWT 3
P AWT MouseListener unklare abhandlung von Events AWT, Swing, JavaFX & SWT 3
M MouseListener/MouseMotionListener AWT, Swing, JavaFX & SWT 2
njans SWT MouseListener exited AWT, Swing, JavaFX & SWT 4
K MouseListener für Objekte auf einem Frame AWT, Swing, JavaFX & SWT 4
P JLabel Farbe/Bild ändern aus MouseListener heraus AWT, Swing, JavaFX & SWT 3
U Swing Generierung mehrerer Kreise per MouseListener AWT, Swing, JavaFX & SWT 16
Semox Swing JApplet: Problem MouseListener Anmeldung AWT, Swing, JavaFX & SWT 3
C JTappedPane Mouselistener auf Überschrift Registerkarte AWT, Swing, JavaFX & SWT 2
M MouseListener AWT, Swing, JavaFX & SWT 3
K AWT MouseListener linke und rechte Maustaste AWT, Swing, JavaFX & SWT 5
C Swing MouseListener Doppelklick-Geschwindigkeit AWT, Swing, JavaFX & SWT 4
N Swing MouseListener in JTable AWT, Swing, JavaFX & SWT 4
1 Eigene JComponent mit MouseListener versehen AWT, Swing, JavaFX & SWT 10
Developer_X AWT Component added keinen MouseListener AWT, Swing, JavaFX & SWT 7
R MouseListener wird nicht aufgerufen AWT, Swing, JavaFX & SWT 3
P JComboBox und MouseListener AWT, Swing, JavaFX & SWT 2
W MouseListener im editable ComboBox AWT, Swing, JavaFX & SWT 14
raptorrs Swing MouseListener reagiert nicht auf Instanz einer JTable AWT, Swing, JavaFX & SWT 6
multiholle Swing Mouselistener auf Parentpanel immer aktiv AWT, Swing, JavaFX & SWT 7
C MouseListener und ActionListener kombinieren AWT, Swing, JavaFX & SWT 17
M Komponenten einer unbestimmten Anzahl und MouseListener AWT, Swing, JavaFX & SWT 4
A MouseListener funktionert nie AWT, Swing, JavaFX & SWT 12
C Probleme mit Größe und mit MouseListener AWT, Swing, JavaFX & SWT 2
W MouseListener für jede Zelle einer JTable AWT, Swing, JavaFX & SWT 4
E MouseListener Problem AWT, Swing, JavaFX & SWT 4
D jButton mit ImageIcon & MouseListener AWT, Swing, JavaFX & SWT 5
S MouseListener zurückverfolgung auf element. AWT, Swing, JavaFX & SWT 7
B MouseListener / doppelklick geht net AWT, Swing, JavaFX & SWT 16
M JCheckBox Standard MouseListener entfernen AWT, Swing, JavaFX & SWT 13
hdi Wie mach ich diesen MouseListener AWT, Swing, JavaFX & SWT 4
G MouseListener & KeyListener AWT, Swing, JavaFX & SWT 4
H JComboBox reagiert nicht auf MouseListener AWT, Swing, JavaFX & SWT 5
2 Mouselistener AWT, Swing, JavaFX & SWT 2
W MouseListener, getClickCount und Doppelklick AWT, Swing, JavaFX & SWT 6
S swing komponenten mit mouselistener rotieren AWT, Swing, JavaFX & SWT 15
G JFrame,JLabel,MouseListener AWT, Swing, JavaFX & SWT 6
F Wie MouseListener bei TableModel anmelden? AWT, Swing, JavaFX & SWT 3
V Frage zu MouseListener --> mousePressed() AWT, Swing, JavaFX & SWT 5
C MouseListener für Spalte eines JTables AWT, Swing, JavaFX & SWT 4
K Problem mit 2 MouseListener. AWT, Swing, JavaFX & SWT 3
M MouseMotionListener oder mouseListener AWT, Swing, JavaFX & SWT 6
T JComboBox und MouseListener AWT, Swing, JavaFX & SWT 11
F MouseListener - Unhandled IOException AWT, Swing, JavaFX & SWT 5
padde479 Statusleiste mit MouseListener aktualisieren AWT, Swing, JavaFX & SWT 3
L Problem mit MouseListener, AdjustmentListener AWT, Swing, JavaFX & SWT 6
T MouseListener Problem AWT, Swing, JavaFX & SWT 3
F Mouselistener wird wiederholt aufgerufen AWT, Swing, JavaFX & SWT 3
G Frage zu MouseListener und speichern des Wertes (reflektion? AWT, Swing, JavaFX & SWT 6
B frage zu MouseListener AWT, Swing, JavaFX & SWT 5
O MouseListener - Wert-Übergabe AWT, Swing, JavaFX & SWT 3
W JPanel, JLabel und MouseListener -> auf clicks reagieren AWT, Swing, JavaFX & SWT 5
S MouseListener auf einem einzelnen Tab setzen AWT, Swing, JavaFX & SWT 3
B MouseListener & Fenster schliessen AWT, Swing, JavaFX & SWT 3
G MouseListener AWT, Swing, JavaFX & SWT 4
G Tooltip sperrt MouseListener? AWT, Swing, JavaFX & SWT 6
S JComboBox und MouseListener AWT, Swing, JavaFX & SWT 5
D Koordinaten der Bildschirmposition auslesen (MouseListener?) AWT, Swing, JavaFX & SWT 7
A Klassenübergreifend MouseListener verwenden AWT, Swing, JavaFX & SWT 14
N "globaler" MouseListener (+MouseMotionListener) AWT, Swing, JavaFX & SWT 4
M ToolTipText für JTable mit MouseListener ohne anklicken? AWT, Swing, JavaFX & SWT 7
A MouseListener auf Bild legen ? AWT, Swing, JavaFX & SWT 16
S Mouselistener erzeugt kein Event in einem Menuitem AWT, Swing, JavaFX & SWT 2
J MouseListener AWT, Swing, JavaFX & SWT 3
A JPanels in JPanel und MouseListener AWT, Swing, JavaFX & SWT 3
C Mehrere MouseListener? AWT, Swing, JavaFX & SWT 7
U Keylistener und Mouselistener AWT, Swing, JavaFX & SWT 2
L Event-handling, MouseListener AWT, Swing, JavaFX & SWT 5
T Problem mit MouseListener bei JButton AWT, Swing, JavaFX & SWT 5
K mein keyListener scheint Konflict haben mit mouseListener AWT, Swing, JavaFX & SWT 6
G Problem mit MouseListener AWT, Swing, JavaFX & SWT 9
H GridBagLayout macht mich wahnsinnig :-( AWT, Swing, JavaFX & SWT 5
melaniemueller Was macht e.getSource() ? AWT, Swing, JavaFX & SWT 2
N Java Mouse Listiner macht alles zusammen AWT, Swing, JavaFX & SWT 4
J JavaFX Löschen im Tabelview macht Problem AWT, Swing, JavaFX & SWT 15

Ähnliche Java Themen

Neue Themen


Oben