Eigene JComponent mit MouseListener versehen

Status
Nicht offen für weitere Antworten.

1337iceskater

Aktives Mitglied
Hallo Leute,

ich habe mal wieder ein Problem, diesmal in Swing, und habe noch keine Lösung im Forum gefunden.
Wäre Klasse, wenn ihr mir wieder so schnell helfen könntet.

Also hier das Problem:

Ich versuche selbstgestaltete Felder zu programmieren, die z.B. beim Anklicken ihre Farbe wechseln können. Da ich davon mehrere habe, dachte ich, dass ich die Kontrolle per MouseListener nicht in der Mutter-Komponente (also in dem JPanel wo alle drin sind) mache, sondern jedem Feld seinen eigenen MouseListener geben könnte.
Im MouseListener wird auch ne Testausgabe gemacht, die kommt aber leider nicht zum Vorschein.

Hier jetzt erstmal der Code:

Java:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JComponent;

public class Field extends JComponent implements MouseListener{

	private static final long serialVersionUID = 1L;
	private int x;
	private int y;
	private int lang;
	private Color color = Color.BLUE;
	
	public Field(int x, int y, int lang){
		this.setX(x);
		this.setY(y);
		this.setLang(lang);
		this.addMouseListener(this);
		this.setSize(lang, lang);
	}
	
	public int min(int i, int j){
		if(i < j){
			return i;
		}
		else{
			return j;
		}
	}
	
	public void setColor(Color col){
		this.color = col;
	}
	
	public void draw(Graphics g){
		g.setColor(color);
		g.fillRoundRect(x, y, lang, lang, lang/2, lang/2);
	}

	@Override
	public void mouseClicked(MouseEvent e){
		Point p = e.getPoint();
		System.out.println("rofl");
		if(p.getX()<this.x+this.lang&&p.getX()>this.x&&p.getY()<this.y+this.lang&&p.getY()>this.y){
			this.setColor(Color.BLACK);
		}
		repaint();
	}

	@Override
	public void mouseEntered(MouseEvent e){
		System.out.println("X");
	}

	@Override
	public void mouseExited(MouseEvent e){
		
	}

	@Override
	public void mousePressed(MouseEvent e){
		
	}

	@Override
	public void mouseReleased(MouseEvent e){
		
	}
}

Ich hoffe ihr könnt mir weiterhelfen.

Danke schonmal.

LG von mir^^
 

Michael...

Top Contributor
Kann keinen Fehler finden. Bist Du Dir sicher, dass Du die Komponente mit der Maus erwischt bzw. dass die Komponente die Größe und Lage hat die Du vermutest?
 

1337iceskater

Aktives Mitglied
das ist schon der ganze code der Klasse, diese Elemente werden dann mit der folgenden Funktion in ein JPanel hinzugefügt. Dieses JPanel liegt dann in dem JFrame was als Hauptfenster dient. Ich poste am Ende mal alle Klassen, die ich zur Zeit verwende.

Funktion zum Hinzufügen:

Java:
private static Vector<Field> fields = new Vector<Field>();

public void initFields(){
	for(int i = 0; i < fieldRow; i ++){
		for(int j = 0; j < fieldCol; j++){
			fields.add(new Field(j*lang, i*lang, lang));
		}
	}
}

So, und hier dann die kompletten Klassen:

Field-Klasse:
Java:
package risiko;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JComponent;

public class Field extends JComponent implements MouseListener{

	private static final long serialVersionUID = 1L;
	private int x;
	private int y;
	private int lang;
	private Color color = Color.BLUE;
	
	public Field(int x, int y, int lang){
		this.setX(x);
		this.setY(y);
		this.setLang(lang);
		this.addMouseListener(this);
		this.setSize(lang, lang);
	}
	
	public int min(int i, int j){
		if(i < j){
			return i;
		}
		else{
			return j;
		}
	}
	
	public void setColor(Color col){
		this.color = col;
	}
	
	public void draw(Graphics g){
		g.setColor(color);
		g.fillRoundRect(x, y, lang, lang, lang/2, lang/2);
	}

	@Override
	public void mouseClicked(MouseEvent e){
		Point p = e.getPoint();
		System.out.println("rofl");
		if(p.getX()<this.x+this.lang&&p.getX()>this.x&&p.getY()<this.y+this.lang&&p.getY()>this.y){
			this.setColor(Color.BLACK);
		}
		repaint();
	}

	@Override
	public void mouseEntered(MouseEvent e){
		System.out.println("X");
	}

	@Override
	public void mouseExited(MouseEvent e){
		
	}

	@Override
	public void mousePressed(MouseEvent e){
		
	}

	@Override
	public void mouseReleased(MouseEvent e){
		
	}
	
	public boolean isIn(Point p){
		if(p.getX()<this.x+lang&&p.getX()>this.x){
			if(p.getY()<this.y+lang&&p.getY()>this.y){
				return true;
			}
		}
		return false;
	}

	public void setX(int x) {
		this.x = x;
	}

	public int getX() {
		return x;
	}

	public void setY(int y) {
		this.y = y;
	}

	public int getY() {
		return y;
	}

	public void setLang(int lang) {
		this.lang = lang;
	}

	public int getLang() {
		return lang;
	}
}

GameField-Klasse:

Java:
package risiko;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Vector;

import javax.swing.JPanel;

public class GameField extends JPanel implements MouseListener{

	
	private int lang;
	private int fieldCol = 10;
	private int fieldRow = 2;
	private static final long serialVersionUID = 1L;
	private static Vector<Field> fields = new Vector<Field>();

	public void initFields(){
		for(int i = 0; i < fieldRow; i ++){
			for(int j = 0; j < fieldCol; j++){
				fields.add(new Field(j*lang, i*lang, lang));
			}
		}
	}	
	
	public GameField(Dimension d){
		super();
		this.lang = (int)(d.getHeight()/7);
		this.setBackground(Color.WHITE);
//		this.addMouseListener(this);
		initFields();
	}
	
	@Override
	public void paintComponent(Graphics g){
		super.paintComponent(g);
		for(int i = 0; i < fields.size(); i++){
			fields.get(i).draw(g);
		}
	}
	
	@Override
	public void mouseClicked(MouseEvent e){
		System.out.println("rofl");
		for(int i = 0; i < fields.size(); i++){
			if(fields.get(i).isIn(e.getPoint())){
				fields.get(i).setColor(Color.BLACK);
			}
			else{
				fields.get(i).setColor(Color.BLUE);
			}
		}
		repaint();
	}

	@Override
	public void mouseEntered(MouseEvent e){
		
	}

	@Override
	public void mouseExited(MouseEvent e){
		
	}

	@Override
	public void mousePressed(MouseEvent e){
		
	}

	@Override
	public void mouseReleased(MouseEvent e){
		
	}
}

Risiko-Klasse:

Java:
package risiko;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

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

public class Risiko extends JFrame{

	public static Dimension screen;
	private static GameField gf;
	private static final long serialVersionUID = 1L;
	
	public Risiko(){
		super("Risiko");
		screen = Toolkit.getDefaultToolkit().getScreenSize();
		this.setSize(screen);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setLayout(new BorderLayout());
		
		this.addKeyListener(new KeyListener(){
			@Override
			public void keyPressed(KeyEvent e) {
				if(e.getKeyCode()==KeyEvent.VK_ESCAPE){
					System.exit(0);
				}
			}
			@Override
			public void keyReleased(KeyEvent e) {
				
			}
			@Override
			public void keyTyped(KeyEvent e){
				
			}			
		});
		
		gf = new GameField(screen);
		
		JMenuBar mb = new JMenuBar();
		JMenu file = new JMenu("Datei");
		JMenuItem neu = new JMenuItem("Neues Spiel");
		
		JMenuItem ext = new JMenuItem("Beenden");
		
		file.add(neu);
		file.add(ext);
		mb.add(file);
		
		this.add(mb, BorderLayout.NORTH);
		this.add(gf, BorderLayout.CENTER);
		
		this.setVisible(true);
	}
	
	public static void main(String[] args){
		new Risiko();
	}
}

so, das ist jetzt erstmal ziemlich viel ;-)
hoffe das hilft weiter.
Danke
 

KrokoDiehl

Top Contributor
So wie ich das sehe, fügst du deine Fields nirgends dem Panel hinzu, also in [c]initFields()[/c] ist kein [c]this.add( field );[/c]
Ich nehme an, dass daher keine MouseEvents ankommen.
 

Java@home

Aktives Mitglied
wo ist den der MouseListener(was machen die in all den anderen Klassen) in der Klasse Risiko?
Du willst doch, dass beim klicken auf die Componenten was passiert, oder?
 
Zuletzt bearbeitet:

1337iceskater

Aktives Mitglied
Danke für den Hinweis, das hab ich wirklich nicht bedacht.

Leider hat das auch nichts an der Nichtfunktionalität geändert. Die initFields sieht jetzt so aus.

Java:
public void initFields(){
	for(int i = 0; i < fieldRow; i ++){
		for(int j = 0; j < fieldCol; j++){
			Field f = new Field(j*lang, i*lang, lang);
			fields.add(f);
			this.add(f);
		}
	}
}

Ich beginne langsam an mir zu zweifeln...
 

Java@home

Aktives Mitglied
Schaue dir das mal bitte etwas genauer an!
Java:
public GameField(Dimension d){
        super();
        this.lang = (int)(d.getHeight()/7);
        this.setBackground(Color.WHITE);
//      this.addMouseListener(this);
        initFields();
    }
 

1337iceskater

Aktives Mitglied
Ich weiß, dass ich da den MouseListener nicht hinzufüge. Das liegt daran, dass das meine erste Variante ist. Da wollte ich alle Fields durchgehen, da die in dem Vector gespeichert sind, und wenn das Field dann den Punkt beinhaltet wird dort etwas mit dem Field gemacht. Das ist aber sehr unperformant.

Der MouseListener um den es geht befindet sich in der Klasse Field:

Java:
public Field(int x, int y, int lang){
	this.setX(x);
	this.setY(y);
	this.setLang(lang);
	this.addMouseListener(this);
	this.setBounds(0, 0, lang, lang);
}

Hier dann noch die Methoden des MouseListeners:

Java:
@Override
public void mouseClicked(MouseEvent e){
	Point p = e.getPoint();
	System.out.println("rofl");
	if(p.getX()<this.x+this.lang&&p.getX()>this.x&&p.getY()<this.y+this.lang&&p.getY()>this.y){
		this.setColor(Color.BLACK);
	}
	repaint();
}
@Override
public void mouseEntered(MouseEvent e){
	System.out.println("X");
}
@Override
public void mouseExited(MouseEvent e){
	
}
@Override
public void mousePressed(MouseEvent e){
	
}
@Override
public void mouseReleased(MouseEvent e){
	
}
 

1337iceskater

Aktives Mitglied
Oh ich glaube ich hab den Fehler^^

ich hab meinem JPanel noch kein Null-Layout gegeben. Dadurch waren die Components jeweils nicht sichtbar gewesen.

Danke trotzdem für eure Hilfe =)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Eigene JComponent in GridLayout AWT, Swing, JavaFX & SWT 9
A Swing Eigene JComponent Scrollable AWT, Swing, JavaFX & SWT 6
S Eigene JComponent Image zeichnen AWT, Swing, JavaFX & SWT 3
P Swing Eigene Komponente Entwickeln - erben von JComponent oder JPanel? AWT, Swing, JavaFX & SWT 5
T Eigene JComponent AWT, Swing, JavaFX & SWT 4
M eigene GUI Bibliothek erstellen. AWT, Swing, JavaFX & SWT 10
M Eigene Java Klasse für allgemeine Grafikelemente AWT, Swing, JavaFX & SWT 8
H MouseAdapter Klasse nutzen wenn eigene Klasse bereits von anderer erbt AWT, Swing, JavaFX & SWT 13
Jose05 JavaFX: eigene FXML-Datei für einen Button AWT, Swing, JavaFX & SWT 3
V Swing für jedes Kästchen eine eigene Farbe AWT, Swing, JavaFX & SWT 2
L JavaFX Eigene Font benutzen AWT, Swing, JavaFX & SWT 6
B Notepad++ in die eigene GUI einbinden AWT, Swing, JavaFX & SWT 7
B JavaFX Bild um die eigene Achse drehen lassen AWT, Swing, JavaFX & SWT 0
M Eigene Klasse mit Grafikobjekten schreiben AWT, Swing, JavaFX & SWT 4
S JavaFX Drehen um eigene Achse AWT, Swing, JavaFX & SWT 2
P X extends TreeView - eigene Methoden AWT, Swing, JavaFX & SWT 5
Java_RY AWT Frame in eine eigene klasse auslagern und aufrufen AWT, Swing, JavaFX & SWT 6
L Eigene Component anordnen AWT, Swing, JavaFX & SWT 7
L JavaFX Eigene JavaFX Controls anlegen AWT, Swing, JavaFX & SWT 1
L Swing Teile eines JPanel in eigene Klasse auslagern AWT, Swing, JavaFX & SWT 3
J Eigene Klasse auf Basis Textfield in SceneBuilder anzeigen AWT, Swing, JavaFX & SWT 4
stylegangsta Eigene Klasse für JButton aus dem JFrame abrufen AWT, Swing, JavaFX & SWT 29
L Eigene Component Layout AWT, Swing, JavaFX & SWT 4
S Swing Eigene JComboBox Problem! AWT, Swing, JavaFX & SWT 1
O JTabeddpane aber jedes JPanel als eigene Klasse anlegen AWT, Swing, JavaFX & SWT 7
G Event Handling Event Handling in eigene Klasse AWT, Swing, JavaFX & SWT 4
A JavaFX Scene Builder eigene Klasse hinzufügen AWT, Swing, JavaFX & SWT 2
L Swing Wie programmiere ich eine eigene GUI? AWT, Swing, JavaFX & SWT 12
T Swing Eigene Konsole AWT, Swing, JavaFX & SWT 5
D Swing Eigene Tabelle AWT, Swing, JavaFX & SWT 18
M eigene horizontale Scrollbar AWT, Swing, JavaFX & SWT 1
M JavaFX Scenebuilder eigene Komponenten AWT, Swing, JavaFX & SWT 8
A JavaFX Eigene Komponenten im Scene Builder AWT, Swing, JavaFX & SWT 0
J JavaFX Eigene ListCell Problem(Objekte werden doppelt angezeigt) AWT, Swing, JavaFX & SWT 1
C Swing MenuBar als eigene Klasse AWT, Swing, JavaFX & SWT 4
Kenan89 3D Models aus anderen Spielen in eigene einfügen AWT, Swing, JavaFX & SWT 3
R SWT Eigene Events erstellen und werfen AWT, Swing, JavaFX & SWT 59
P Eigene CMD GUI zum Starten von JAR AWT, Swing, JavaFX & SWT 10
M Swing eigene Dialoge, aber wie genau? AWT, Swing, JavaFX & SWT 5
P Swing Alle Zeilen einer Spalte (jTable) zusammen zählen und in eine eigene Zeile das Ergebnis schreiben. AWT, Swing, JavaFX & SWT 7
K 3D-Grafik Eigene "Kamera" AWT, Swing, JavaFX & SWT 2
T eigene Klasse für Panel AWT, Swing, JavaFX & SWT 9
S Swing Eigene Komponente (JPanel) soll ChangeEvents verteilen AWT, Swing, JavaFX & SWT 12
E LookAndFeel Eigene Komponenten mit Synth L&F stylen AWT, Swing, JavaFX & SWT 2
alderwaran Swing XML editor plugin für eigene anwendung AWT, Swing, JavaFX & SWT 2
B Eigene Methoden in TABs einfügen AWT, Swing, JavaFX & SWT 8
R eigene Methoden für Buttons? AWT, Swing, JavaFX & SWT 11
H Swing Eigene Komponente wird nur halb oder komisch angezeigt AWT, Swing, JavaFX & SWT 3
H Swing Eigene Komponente reagiert falsch auf mouseClicked() AWT, Swing, JavaFX & SWT 5
L Eigene Design Oberfläche erstellen AWT, Swing, JavaFX & SWT 3
1 Eigene Component in JScrollBar + fixe Linien??? AWT, Swing, JavaFX & SWT 2
T SWT eigene Komponenten AWT, Swing, JavaFX & SWT 2
Kr0e Allgemeine Frage zu Java2D (Eigene Impl.) AWT, Swing, JavaFX & SWT 18
A Eigene StatusBar AWT, Swing, JavaFX & SWT 2
S Eigene GUI Elemente erstellen AWT, Swing, JavaFX & SWT 6
D Eigene Methode soll Gerade zeichnen AWT, Swing, JavaFX & SWT 5
D Swing Eigene Komponente mit JSpinner AWT, Swing, JavaFX & SWT 4
MrMilti eigene Klasse in JTable ablegen AWT, Swing, JavaFX & SWT 12
R Swing JTable: Eigene Zeichnung im Header AWT, Swing, JavaFX & SWT 11
A Eigene Border für Buttons AWT, Swing, JavaFX & SWT 19
A Eigene Buttons AWT, Swing, JavaFX & SWT 20
C JTextPane HTML und eigene Tags AWT, Swing, JavaFX & SWT 10
S Eigene GUI (evt. Toolkit) AWT, Swing, JavaFX & SWT 10
M SWT: eigene Events AWT, Swing, JavaFX & SWT 9
& eigene Schriftart in JEditorpane AWT, Swing, JavaFX & SWT 2
T Eigene Fenster kreieren?zb. wie bei Winamp? AWT, Swing, JavaFX & SWT 9
D Eigene Component erstellen? AWT, Swing, JavaFX & SWT 4
F eigene Swing-Komponente. Drehregler AWT, Swing, JavaFX & SWT 4
M Eigene Klasse für mehrer JSplitPanes AWT, Swing, JavaFX & SWT 3
M Eigene Komponenten basteln AWT, Swing, JavaFX & SWT 25
O Eigene GUI Objekte entwerfen? AWT, Swing, JavaFX & SWT 3
A Eigene, sich selbst zeichnende Component AWT, Swing, JavaFX & SWT 5
S Eigene Komponenten AWT, Swing, JavaFX & SWT 2
T Eigene erweiterte MouseEvents nutzen AWT, Swing, JavaFX & SWT 2
M In eigene JPanel Klasse zeichnen AWT, Swing, JavaFX & SWT 4
M CellEditor und CellRenderer für eigene Klasse AWT, Swing, JavaFX & SWT 4
M eigene ComponentUI und Serializable AWT, Swing, JavaFX & SWT 3
E Eigene Steuerelemente bauen AWT, Swing, JavaFX & SWT 3
H eigene paintComponent(Graphics) kommt mit rezise nicht klar AWT, Swing, JavaFX & SWT 6
G fullscreen GUI - eigene components? AWT, Swing, JavaFX & SWT 2
T 4 db tabellen in einem karteireiter eigene klasse für die me AWT, Swing, JavaFX & SWT 7
S SWT Für jede gui komponente eigene methode AWT, Swing, JavaFX & SWT 2
J Eigene Fehlermeldung in AWT erzeugen AWT, Swing, JavaFX & SWT 2
D eigene SwingKonsole. AWT, Swing, JavaFX & SWT 5
I Eigene JComboBox AWT, Swing, JavaFX & SWT 10
C UIDefaults für eigene Klasse anpassen AWT, Swing, JavaFX & SWT 3
C ISelectionProvider und eigene Selections AWT, Swing, JavaFX & SWT 2
M kann man auch eigene look and feels machen? AWT, Swing, JavaFX & SWT 2
L eigene Komponente, ActionEvent senden? AWT, Swing, JavaFX & SWT 3
E Beim Schließen des Fensters eigene Funktion aufrufen AWT, Swing, JavaFX & SWT 8
M JTable mit JCombobox eigene Auswahl pro Zeile ? AWT, Swing, JavaFX & SWT 3
T JFrame - eigene Titelleiste AWT, Swing, JavaFX & SWT 8
Y Eigene Komponente einfügen AWT, Swing, JavaFX & SWT 6
G Eigene Koponente erstellen AWT, Swing, JavaFX & SWT 3
G Eigene Componente in jScrollView einbetten AWT, Swing, JavaFX & SWT 6
T Eigene grafische Oberfläche AWT, Swing, JavaFX & SWT 7
B Batik: Inhalt JComponent to SVG? AWT, Swing, JavaFX & SWT 6
Hatsi09 JComponent anklicken und "entklicken" AWT, Swing, JavaFX & SWT 7
L JComponent aus JPanel anhand Mausposition ermitteln AWT, Swing, JavaFX & SWT 10
S Swing Schwierigkeiten mit JComponent AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben