MouseListener für Schleifen-Objekte

Jf.or

Mitglied
Hi,

ich bin ziemlich neu in der Programmierung, und habe auch gleich ein Problem, das ich nicht lösen kann, die googlesuche erwies sich als schwierig.
Es geht um Objekte, die mit einer verschachtelten for Schleife auf einem panel erstellt worden sind und jetzt einzeln mit einem Mouse Listener angesprochen werden sollen, um Beispielsweise die Farbe zu ändern, etwa im Stil von memory.
Ich habe kein Ahnung wie/wo ich den Listener adden soll. Wer kann mir helfen?
Was würdet ihr anders machen?

Die Main:
Java:
import java.awt.Graphics;
import java.awt.Image;

import javax.swing.ImageIcon;
import javax.swing.JFrame;

public class Main {
	public static void main(String[] args) {
		JFrame f=new JFrame("Fenster");
		ActionListener al=new ActionListener();
		RechteckPanel rp=new RechteckPanel();
		rp.addMouseListener(al);						//???
		f.setDefaultCloseOperation(f.EXIT_ON_CLOSE);
		f.setSize(800,600);
		f.add(rp);
		f.setVisible(true);
	}
}
Die paint-Klasse:
Java:
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;

public class RechteckPanel extends JPanel{
	@Override
protected void paintComponent(Graphics g) {
	super.paintComponent(g);
	int reihen=8;
	int spalten=8;
	int d=60;
	int abstandh=d+0;
	int abstandv=d+0;
	int rand=1;
	for (int i=0; i<spalten;i++){
		for (int j=0;j<reihen;j++){
			g.setColor(new Color(0,0,0));				//RechteckRahmen schwarz
			g.drawRect(i*abstandh, j*abstandv, d, d);
			g.setColor(new Color(125,125,125));			//Rechteckfüllung grau
			g.fillRect(i*abstandh+rand, j*abstandv+rand, d-rand, d-rand);
			}
		}
	}
}
 
Zuletzt bearbeitet:

Flown

Administrator
Mitarbeiter
Du fügst das dem RechteckPanel hinzu und musst dann mit den Koordinaten der Maus dein Feld rausrechnen.
 

Jf.or

Mitglied
Danke für die schnelle Antwort.

Daran habe ich auch schon gedacht , es wär mir aber lieber, wenn ich in die for/for Schleife gleich einen Listener an die entstehenden Objekte anheften könnte. Wie könnte ich das machen?
 

Gucky

Top Contributor
Also willst du zu einem fillRect einen Listener hinzufügen? Das ist unmöglich, so wie du es willst. Zumal du dann eine untragbare Anzahl von Listenern bräuchtest. Flowns Antwort war schon richtig. Dafür gibt es aber Algorithmen, die das richtige Feld bestimmen können. Einer ist der hier, wobei ein MouseListener schon implementiert wurde, der ein MouseEvent e erwartet:

Java:
int x=e.getX();
int y=e.getY();
x = (x - UNBENUTZTEPIXELVONLINKS) / BREITERECHTECKE;
y = (y - UNBENUTZTEPIXELVONOBEN) / HÖHERECHTECKE;

Ist ungetestet, funktionierte aber schon einmal so ähnlich in einem anderen Programm. :)

Damit bekommst du das richtige Feld heraus. Wenn du die Felder noch als Array verwaltest, ist es kein Problem mehr an das Richtige heranzukommen.
 

Jf.or

Mitglied
Blieb also nichts übrig als die Koordinaten abzufragen, also steht es so in der Listener Klasse:
Java:
public void mousePressed(MouseEvent e) {
		for(int i=0;i<8;i++){
			for(int j=0;j<8;j++){
				if (e.getX()>i*60&&e.getY()>j*60&&e.getX()<i*60+60&&e.getY()<j*60+60)
				System.out.print(i*60+" "+ j*60+" "+(i*60+60)+" "+(j*60+60));
			}
				System.out.println();
		}
	}

so und schon steh ich wieder auf dem Schlauch:

1. wie komme ich an die paintComponent Methode aus der paint-Klasse ran? Oder anders gefragt, wie ändere ich die Farbe eines Rechtecks aus dem Listener heraus.

2. für die Schleifenbedingung im Listener würde ich gern einen getter aus der paint-Klasse benutzen, in der Art:
Java:
 int d=60;
public int getD(){
		return d;
	}
Ich bekomme aber Fehlermeldungen:

Multiple markers at this line
- Syntax error, insert "enum Identifier" to complete
EnumHeaderName
- Syntax error, insert "EnumBody" to complete BlockStatement
- Syntax error on token "int", @ expected

Warum???

3. @Gucky
Wie ich hier ein Array sinnvoll einsetzen kann, ist mir auch nicht klar.
Besteht denn die Möglichkeit, die in der for/for Schleife der paint-Klasse entstandenen Rechtecke in ein Array zu geben ?
 
Zuletzt bearbeitet:

Gucky

Top Contributor
Nicht unbedingt die Rechtecke aber eine Entsprechung der Rechtecke. Du hast auf der einen Seite das Raster und auf der anderen Seite hast du das Array, in das du die Bilder lädst, die du anzeigen willst. Oder besser: In dem Referenzen auf Bilder im Speicher stehen. Sonst hättest du jedes Bild doppelt im Speicher.

Was soll eigentlich diese verschachtelte for-Schleife im MouseListener?
 

Jf.or

Mitglied
Mit der verschachtelten Schleife wird die Position des Mauszeigers abgefragt und kann, wenn ich wüßte wie, dem Anfangspunkt der Rechtecke zugeordnet werden, da ich ursprünglich mal vorhatte, das entsprechende Rechteck direkt anzusprechen und farblich zu verändern.
Die Sysos waren nur zum Testen: wenn ich auf ein Rechteck klicke wird mir der Anfangs- (links, oben) und Endpunkt (rechts, unten) ausgegeben.

edit zu post #5
2. kann man getrost überlesen, ich hatte den getter in die paint-Methode geschrieben...na ja, war schon spät :)

zu dem Array, da hänge ich immer noch
Hast du das so gemeint?
Java:
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;

public class RechteckPanel extends JPanel{
	
	static private int reihen=8;
	static private int spalten=8;
	static private int d=60;
	static private int abstandh=d+0;
	static private int abstandv=d+0;
	static private int rand=1;

	static public int getReihen(){	return reihen;	}
	static public int getSpalten(){	return spalten;	}
	static public int getD(){	    return d;	}
	
	RechteckPanel[] rechtecke=new RechteckPanel[reihen*spalten]; //???????????
	
	@Override
public void paint(Graphics g) {
	for (int i=0; i<spalten;i++){
		for (int j=0;j<reihen;j++){
			g.setColor(new Color(0,0,0));						//Rahmen schwarz
			rechtecke[i*j]=g.drawRect(i*abstandh, j*abstandv, d, d); //??????????????
			g.setColor(new Color(125,125,125));					//Füllung grau
			g.fillRect(i*abstandh+rand, j*abstandv+rand, d-rand, d-rand);
			}
		}
	}
}
Da kommt als Fehlermeldung:
Type mismatch: cannot convert from void to RechteckPanel
 
Zuletzt bearbeitet:

hauptDev

Bekanntes Mitglied
Du weißt was die Fehlermeldung bedeutet, also übersetzt?
Dann schau mal wo du versuchst etwas in ein RechteckPanel zu stecken:

Java:
rechtecke[i*j]=g.drawRect(i*abstandh, j*abstandv, d, d);

und dann schau mal, was drawRect(...) zurückgibt:

Graphics (Java Platform SE 7 )
 

Gucky

Top Contributor
Ein Memoryfeld ist zweidimensional. Deshalb brauchst du auch ein zweidimensionales Array.
Die verschachtelten for-Schleifen gehören da nicht hin. Nimm einfach meinen Code von oben und es müsste laufen.
 

Jf.or

Mitglied
@hauptDev

Ja eben, so wie ich das verstehe wird eben nur ein Rechteck (als Objekt) erzeugt, das nach dessen Erzeugung dem Array an der bestimmten Stelle übergeben wird.

Das bedeutet diese Zeile für mich, und wenn ich wüsste, wo der Fehler liegt, würde ich nicht fragen.
Also tut mir leid, mit deinem kryptischen Hinweis konnte ich leider nichts anfangen, dennoch bin ich mir sicher, das du mir bei dem Problem helfen kannst. Wie kann ich es lösen?

@Gucky

das mit dem zweidimensionalem Array ist mir auch schon auf gefallen und hatte ich entsprechend korrigiert.
Zu den For Schleifen: die Zeichnen mir das Memoryfeld (das funktioniert ja soweit),
auch kann ich die Position der Rechtecke durch anklicken bestimmen.

Wie ich jetzt aber z.B. die Eigenschaft Farbe für ein einzelnes Rechteck neu setzen kann, ist mir weiterhin schleierhaft.
 
Zuletzt bearbeitet:

Gucky

Top Contributor
Du schreibst eine Klasse MemoryKarte, dass eine Karte verwaltet. Der übergibst du eine Koordinate, die beschreibt, wo die Karte gezeichnet werden soll und eine Instanz von Graphics.

Die Objekte dieser Klasse tust du in das Array. Mit meinem Code oben findest du die richtige Karte heraus. Diese manipulierst du dann.
 

Harry Kane

Top Contributor
@hauptDev
Ja eben, so wie ich das verstehe wird eben nur ein Rechteck (als Objekt) erzeugt, das nach dessen Erzeugung dem Array an der bestimmten Stelle übergeben wird.

Das bedeutet diese Zeile für mich, und wenn ich wüsste, wo der Fehler liegt, würde ich nicht fragen.
Also tut mir leid, mit deinem kryptischen Hinweis konnte ich leider nichts anfangen, dennoch bin ich mir sicher, das du mir bei dem Problem helfen kannst. Wie kann ich es lösen?
Du möchtest den Rückgabewert von g.drawRect(...) in dein Array von RechteckPanel stecken. Was hauptDev dir sagen wollte: g.drawRect(...) hat keinen Rückgabewert, wie aus der API Dokumentation ganz klar hervorgeht. Wenn dir diese Problematik nicht bereits beim coden klar ist, wenn du auch die Fehlermeldung des Compilers nicht verstehst, und wenn du schließlich einen diesbezüglichen Hinweis eines users für "krytisch" hältst, fehlen offenbar ein paar sehr grundlegende Kenntnisse.
Wie du das Problem lösen kannst? Gar nicht. Nur mit einem komplett neuen Ansatz.
Was ich versuchen würde:
  • Schreibe dir eine Klasse "MemoryCard", die sich von JComponent ableitet.
  • Diese Klasse hat ein boolesches Attribut "open", das anzeigt, ob das Bild zu sehen ist, oder nur die einheitlich gefärbte Rückseite der Karte.
  • Ausserdem hat diese Klasse noch eine Image- oder Icon-Attribut, in dem das Bild der Karte hinterlegt ist.
  • In der paintComponent() Methode von MemoryCard zeichnest du je nach dem Status der "open" Variable nur ein graues Rechtecke (open = false), oder das Bild (open=true)
  • Dann erzeugst du dir die gewünschte Anzahl an MemoryCards (wobei du dafür sorgen mußt, daß sie auch tatsächlich paarweise erzeugt werden, und daß du zusammengehörende Cards an einem gemeinsamen Index o.ä. erkennst).
  • Die erzeugten MemoryCards packst du auf ein JPanel (nennen wir es mal "cardPanel"). Als Layout des cardPanel würde sich ein GridLayout anbieten.
  • Schließlich registrierst du auf dem cardPanel einen MouseListener. In dessen mouseClicked(MouseEvent me) Methode besorgst du dir mit me.getPoint() die Koordinaten des Mausklicks, und holst dir dann über cardPanel.getComponentAt(Point p) die JComponent, die unter der Maus liegt. Wenn es sich dabei um eine Instanz von MemoryCard handelt, wird dessen "open" Attribut invertiert und dann das cardPanel neu gezeichnet.
edit: Also so ähnlich wie der Ansatz von Gucky. :).
 

hauptDev

Bekanntes Mitglied
@Jf.or
Ja, es tut mir leid, wenn ich mich manchmal etwas kurz halte. Ich will aber, dass die Leute vielleicht auch ein
bisschen darüber nachdenken, was sie tun und mit meinen Hinweisen eine eigene Lösung erarbeiten, dann bleibt
die Lösung (oder zumindest das Vorgehen) besser im Kopf.
 

dcc

Aktives Mitglied
Du kannst in der for Schleife die Buttons erzeugen. Mit button.setActionCommand("EinString") kannst ihnen einen Bezeichner verpassen. Im ActionListener kannst dann mit button.getActionCommand() prüfen welcher button gedrückt wurde.

Könnte auch mit ButtonGroup gehen, das weiß dann welcher Button aktiviert wurde. Bin mir nur nicht sicher ob es auch mit JButtons geht, mit RadioButton 100%.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
H MouseListener für ein eingefügtes Bild in einem JFrame Java Basics - Anfänger-Themen 7
G MouseListener für mehrere Buttons Java Basics - Anfänger-Themen 11
P JFrame, Linien zeichnen, MouseListener Java Basics - Anfänger-Themen 2
H MouseListener klicks begrenzen Java Basics - Anfänger-Themen 4
H MouseListener begrenzen und Speichern Java Basics - Anfänger-Themen 1
V Problem - MouseListener/2DGraphics Java Basics - Anfänger-Themen 2
R Variablen MouseListener funktioniert auf anderen Pcs nur bedingt Java Basics - Anfänger-Themen 6
G MouseListener funktioniert nicht wie geplant Java Basics - Anfänger-Themen 4
GRAZZ0R MouseListener - Rechteck Bewegen Java Basics - Anfänger-Themen 1
R Variable Klassenübegreifend MouseListener Java Basics - Anfänger-Themen 0
D MouseListener funktioniert nach Timerstart nicht mehr Java Basics - Anfänger-Themen 9
S vom JPanel aus durch Mouselistener Internet aufrufen Java Basics - Anfänger-Themen 6
S GUI ImageIcon Mouselistener Link Java Basics - Anfänger-Themen 0
P MouseListener funktioniert nicht Java Basics - Anfänger-Themen 6
J KeyListener,MouseListener,MouseMotionListener und static Java Basics - Anfänger-Themen 7
P Problem mit MouseListener Java Basics - Anfänger-Themen 4
T MouseListener, recht Taste Java Basics - Anfänger-Themen 2
M MouseListener funktioniert nicht Java Basics - Anfänger-Themen 9
E Mouselistener auf jTable Java Basics - Anfänger-Themen 18
B Variablen an MouseListener übergeben Java Basics - Anfänger-Themen 5
H Mouselistener bei JTable Java Basics - Anfänger-Themen 4
J MouseListener fuer gezeichnete Polyline Java Basics - Anfänger-Themen 3
L Label + MouseListener Java Basics - Anfänger-Themen 12
M MouseListener funkioniert auf JPanel nicht Java Basics - Anfänger-Themen 8
P Jtree MouseListener und NoCollapse Java Basics - Anfänger-Themen 2
M Schiebepuzzle: MouseListener und Graphics? Java Basics - Anfänger-Themen 6
M MouseListener Java Basics - Anfänger-Themen 2
kitz MouseListener Java Basics - Anfänger-Themen 8
B MouseListener & Graphics Java Basics - Anfänger-Themen 10
D Problem mit Mouselistener und jtable Java Basics - Anfänger-Themen 7
C fragen zu MouseListener Java Basics - Anfänger-Themen 3
M MouseListener funktioniert in jar-file nicht mehr Java Basics - Anfänger-Themen 13
F Logikproblem: Auf Mouselistener warten Java Basics - Anfänger-Themen 6
E Auf Mouselistener warten?! Java Basics - Anfänger-Themen 20
S Probleme mit 2 mouselistener Java Basics - Anfänger-Themen 6
A Frage zu MouseListener Java Basics - Anfänger-Themen 2
D Mouselistener Java Basics - Anfänger-Themen 2
A jPanel an MouseListener übergeben? Java Basics - Anfänger-Themen 2
S Swing JEditoPane MouseListener Java Basics - Anfänger-Themen 5
M Mouselistener Java Basics - Anfänger-Themen 4
S MouseListener funzt net. Java Basics - Anfänger-Themen 5
G MouseListener double click? Java Basics - Anfänger-Themen 1
V MouseListener Java Basics - Anfänger-Themen 5
M MouseListener Java Basics - Anfänger-Themen 3
N Mouselistener? Java Basics - Anfänger-Themen 5
T ein MouseListener pro Objekt sinnvoll? Java Basics - Anfänger-Themen 4
F MouseListener - Unhandled IOException Java Basics - Anfänger-Themen 2
U MouseListener Java Basics - Anfänger-Themen 2
L Array von Buttons, jeder soll MouseListener haben Java Basics - Anfänger-Themen 5
S MouseListener - Events auf Mouseklick Java Basics - Anfänger-Themen 14
L MouseListener Problem. Java Basics - Anfänger-Themen 2
S mouselistener Java Basics - Anfänger-Themen 3
N MouseListener Java Basics - Anfänger-Themen 2
J MouseListener implementieren Java Basics - Anfänger-Themen 12
P MouseListener wird anscheinend nicht benutzt Java Basics - Anfänger-Themen 12
N MouseListener - reagiert zu spät Java Basics - Anfänger-Themen 3
D JList - Textzeilen MouseListener zuweisen Java Basics - Anfänger-Themen 4
M prüfen ob mouselistener gesetzt ist. Java Basics - Anfänger-Themen 10
O image und mouseListener Java Basics - Anfänger-Themen 15
W MouseListener Probleme beim Abfangen Java Basics - Anfänger-Themen 8
P Kann keinen MouseListener hinzufügen Java Basics - Anfänger-Themen 3
G MouseListener einbauen - wie? Java Basics - Anfänger-Themen 4
M Code aus IntelliJ in "Textform" für Word-Paper? Java Basics - Anfänger-Themen 10
G Icon für App Java Basics - Anfänger-Themen 1
Kerstininer Vererbung Hilfe beim lernen von Objektorientierung für eine Klausur Java Basics - Anfänger-Themen 10
Sniper1000 Java 391 für Windows Java Basics - Anfänger-Themen 37
P Wieso kann ich als Index für einen Array einen Char angeben? Java Basics - Anfänger-Themen 3
benny1993 Java Programm erstellen für ein Fußball-Turnier Java Basics - Anfänger-Themen 3
V Durchschnittliche Volatility in Prozent für 4 Stunden berechnen Java Basics - Anfänger-Themen 14
P Welches SDK für das erstellen einer ausführbaren Datei? Java Basics - Anfänger-Themen 4
C negamax-Algorithmus für Tic-Tac-Toe spielt manchmal falsch Java Basics - Anfänger-Themen 10
D Apache HTTPClient für alle Fälle Java Basics - Anfänger-Themen 41
J Layout Manager, welcher ist der Richtige für mein Program? Java Basics - Anfänger-Themen 1
J Fehlermeldung unverständlich für Jakarta Java Basics - Anfänger-Themen 17
M Minimax-Algorithmus für Vier gewinnt Java Basics - Anfänger-Themen 11
M GUI für Vier-Gewinnt. Java Basics - Anfänger-Themen 4
I JPA Query für mehrere Klassen Java Basics - Anfänger-Themen 3
D Quellcode für cmd funktioniert nicht Java Basics - Anfänger-Themen 9
R Operatoren Rechenoperation in Java verwenden für Calculator Java Basics - Anfänger-Themen 2
R Operatoren Rechenoperation verwenden für Taschenrechner. Java Basics - Anfänger-Themen 32
Ostkreuz Counter für Booleanwerte Java Basics - Anfänger-Themen 8
B Regex Ausdrücke für Monate Java Basics - Anfänger-Themen 7
I BlueJ Queue Frage für Klausur Java Basics - Anfänger-Themen 2
K loop pausieren für eine bestimmte Anzahl? Java Basics - Anfänger-Themen 1
Jxhnny.lpz Randomisier für Buttons Java Basics - Anfänger-Themen 13
W Intuitive interface für Komponenten Java Basics - Anfänger-Themen 4
M "Class<T> clazz" im Constructor - auch für int möglich? Java Basics - Anfänger-Themen 7
B Schrankensystem mit Farberkennung für Flashgame funktioniert nicht wie geplant Java Basics - Anfänger-Themen 4
I Code für Bezahlsystem (auch bei Offline Aktivität) Java Basics - Anfänger-Themen 7
U jUnit 5 Test für eine addMethode Java Basics - Anfänger-Themen 18
M monte carlo Algorithmus für 4 gewinnt Java Basics - Anfänger-Themen 12
frager2345 Java Singleton Muster -> Methode für Konstruktor mit Parametern Java Basics - Anfänger-Themen 3
izoards Sortier Algorithmus für Bounding Box Elememte Links nach Rechts und von Oben nach Unten Java Basics - Anfänger-Themen 33
M generate Methode für Streams Java Basics - Anfänger-Themen 6
I Datenmodell für "Tags" Java Basics - Anfänger-Themen 6
Lion.King for-Kontrollstruktur für Pyramide Java Basics - Anfänger-Themen 8
B Mit Countdown Midnestdauer für Teilaufgabenerledigung erzwingen Java Basics - Anfänger-Themen 8
J File length als Prüfwert für Download Java Basics - Anfänger-Themen 5
K Spieleidee gesucht für Informatikprojekt - JAVA (BlueJ)? Java Basics - Anfänger-Themen 15
P Zähler Variable für mehrere Objekte Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben