MouseClickEvents auf mehrere Labels anwenden

reike667

Grünschnabel
Hallo,

ich habe ein Problem mit Java Swing.

Erstmal: Während eines Uni-Projekts kam es relativ kurzfristig dazu, dass wir ohne Erfahrungen in der Gui-Programmierung eine Gui programmieren mussten. Insofern habe ich wirklich wenig bis keine Ahnung davon, wir haben die GUI einfach in Netbeans zusammen geklickt, weil wir keine Zeit mehr hatten, uns in das Thema einzuarbeiten.

In dem Projekt geht es darum, einen Rubik's Cube von einem Lego-Mindstorms-Roboter lösen zu lassen.

Ein Teil der Gui ist ein Fenster, in dem der Würfel, der gelöst werden soll, eingegeben wird. Wir haben insgesamt 60 Labels, 6 um die Farben auszuwählen, und 54 die die einzelnen Felder des Würfels darstellen. Man wählt also erst die Farbe aus, die man verwenden will, und dann die einzelnen Felder, die so eingefärbt werden sollen.

Die Labels inkl. MouseCklickEvent werden so erzeugt:

Code:
B1.setBackground(new java.awt.Color(0, 0, 0));
        B1.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));
        B1.setName("B1"); 
        
        B1.addMouseListener(new java.awt.event.MouseAdapter() 
        {
            public void mouseClicked(java.awt.event.MouseEvent evt) 
            {
                B1MouseClicked(evt);
            }
        });

Das für jedes einzelne Label.
Ich glaube, das kann ich auch nicht vereinfachen oder? Also eine allgemeine Methode schreiben, die dann nur für jedes einzelne Label aufgerufen wird?

Mein Hauptproblem liegt eher da, wo den Events dann die Funktionen zugewiesen werden:

Code:
private void B1MouseClicked(java.awt.event.MouseEvent evt) 
{
	B1.setBackground(color);
	Blue1=farbwert();
}

Das Ganze habe ich dann 54 Mal, nur dass sich die beiden Variablen B1 und Blue1 natürlich unterscheiden. Mal kurz zur Erklärung: die Methode farbwert() wandelt die gerade aktive Farbe in ein einzelnes char um, welches dann in einer char-Variable (in diesem Fall Blue1) umwandelt.

Das Ganze muss sich doch irgendwie vereinfachen lassen oder? Nur irgendwie finde ich dazu nichts, geb wohl bei google immer die falschen Begriffe ein :-(

LG Mareike
 
Zum 1. würde ich an deiner Stelle eine neue Klasse erstellen, diese vom MouseListener erben lassen, dann alle Labels in eine ArrayList oder HashSet oder was auch immer du bevorzugst setzen (Array ginge auch, wäre ATM aber wohl wieder sehr viel umbauarbeit), dann intialisierst du die Klasse und gehst eine Schleife durch:
z.B.

Java:
java.util.ArrayList<javax.swing.JLabel> labelList =
	new ....();
labelList.add(Blue0);
labelList.add(Blue1);
labelList.add(Blue2);

ML mouseListener = new ML(labelList);
for(int i = 0; i < labelList.size(); i++)
	labelList.get(i).addMouseListener(mouseListener);
In der mouseListener-Klasse speicherst du dann die Liste oder was auch immer du im Endeffekt benutzt hast als Klassenvar. ab, und schaust dann bei ner Mausaktion um welches es sich handelt. Die Liste würde ich in einer 3. Klasse über eine statische Methode setzen lassen.

Ich garantiere nicht für dem Source, habe im gerade in dieser Textarea geschrieben, zudem bin ich gerade erst aufgestanden.

Ach ja, und warum importierst du nicht? Hatte ich auch mal eine Zeit lang, dachte nämlich das es bei größeren Projekten dann erst zig Millionen zeilen importe gibt bevor man beim eigendlichen Source ist. Ist aber eigendlich Blödsinn, macht nur unnötig Arbeit.
 
Ähm, ich versteh nur die Hälfte ;-)

Erstmal hab ich mir gerade gedacht, ich schreibs einfach mal in eine neue Klasse und guck was passiert bzw. wo eclipse meckert. ;-)

Ersten Fehler habe ich schon bei
Java:
public class ML extends MouseListener{

Ich habe unter anderem java.awt.MouseListener importiert, bekomme aber als Fehler angezeigt: "The type MouseListener cannot be the superclass of ML, a superclass must be a class. "

Edit: Ok, den Fehler habsch schon mal gefunden, man solle vll auch implements statt extends nehmen....

Dann habe ich in diese Klasse geschrieben:
Java:
Eingabe_Würfel eingabe=new Eingabe_Würfel();
	java.util.ArrayList<javax.swing.JLabel> labelList =
	    new ArrayList();
	labelList.add(B1);
	labelList.add(B2);
	labelList.add(B3);

Da meckert er dann bei den labelList.add(..) folgendes:
Multiple markers at this line
- Syntax error on token(s), misplaced construct(s)
- Syntax error on token "B1", VariableDeclaratorId expected after
this token

Ach ja, und warum importierst du nicht? Hatte ich auch mal eine Zeit lang, dachte nämlich das es bei größeren Projekten dann erst zig Millionen zeilen importe gibt bevor man beim eigendlichen Source ist. Ist aber eigendlich Blödsinn, macht nur unnötig Arbeit.

Wie meinst Du das?
 
Verweißen die Variablen schon auf einem Wert?
Letzterer Fehler tritt bei mir nur auf wenn ich einen Klassennamen ohne Variablenname schreiben.

Ich meinte, dass du einfach das Package und den Folder wo die Klasse drinnenliegt weglassen könntest. Mit Controll + 1 kann Eclipse dann selbstständig den Import schreiben, spaart einen Haufen Arbeit.

Ach ja, Variablennamen schreibt man i. d. R. klein.
 
Ach so, Du meinst z.B. das oder: "private void B1MouseClicked(java.awt.event.MouseEvent evt)" ?

Das ist von Netbeans automatisch erzeugter Code.... Ansonsten mach ich das schon mit imports.

Und mit den Variablennamen weiß ich im Prinzip auch, ich vergess es nur immer mal wieder :-(

Ich erzeug die Labels ja in der anderen Klasse, das soll auch so bleiben oder?

Wo ich jetzt extends in implements geändert habe, hat sich übrigens auch die Fehlermeldung bei labelList.add(B1); usw. geändert:

Multiple markers at this line
- Syntax error on token "B1", VariableDeclaratorId expected after
this token
- Syntax error on token(s), misplaced construct(s)

Auf welchen Wert soll das denn verweisen? Ich hatte es so verstanden:
Die Labels werden in Eingabe_Wuerfel erzeugt. Dann mache ich in ML eine arrayList, in der die ganzen Labels gespeichert werden, bzw wahrscheinlich besser in eine weitere Klasse. Durch erzeugen des Objekts eingabe müsste diese Klasse dann doch eigentlich B1 usw kennen oder nicht?
 
Um es mal kurz und knapp zu erklären, ich meinte es in etwa so:

Java:
package core;

import java.util.ArrayList;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class Mainsource extends Object
{
	public void someMethod(JFrame jframe)
	{
		//.....
		ArrayList<JLabel> labelList = CreateLabels.run(jframe);
		this.addMouseListener(labelList);		
		//.....
	}
	private void addMouseListener(ArrayList<JLabel> labelList)
	{
		ML mouseListenerClass = new ML(labelList);
		
		for(int i = 0; i < labelList.size(); i++)
			labelList.get(i).addMouseListener(mouseListenerClass);
	}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
package core;

import java.util.ArrayList;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class CreateLabels extends Object
{
	public CreateLabels()
	{
		super();
	}
	public static ArrayList<JLabel> run(JFrame aJFrame)
	{
		aJFrame.setLayout(null);
		
		ArrayList<JLabel> labelList = new ArrayList<JLabel>();
		
		JLabel b0 = new JLabel();
		b0.setLocation(3, 23);
		b0.setSize(50, 10);
		labelList.add(b0);
		
		JLabel b1 = new JLabel();
		b1.setLocation(100, 100);
		b1.setSize(20, 50);
		labelList.add(b1);

		return(labelList);		
	}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
package core;

import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;

import javax.swing.JLabel;

public class ML extends Object implements MouseListener
{
	private ArrayList<JLabel> labelList;

	public ML(ArrayList<JLabel> labelList)
	{
		super();
		
		this.labelList = labelList;
	}
	public void mouseClicked(MouseEvent e)
	{
		JLabel clickedLabel = this.selectedClickedJLabel(this.labelList, e);
		//Was auch immer jetzt passieren soll.
	}
	public void mouseEntered(MouseEvent arg0){}
	public void mouseExited(MouseEvent arg0){}
	public void mousePressed(MouseEvent arg0){}
	public void mouseReleased(MouseEvent arg0){}

	private JLabel selectedClickedJLabel(ArrayList<JLabel> labelList, MouseEvent e)
	{
		JLabel returnLabel = null;
		for(int i = 0; i < labelList.size(); i++)
			if(e.getSource().equals(labelList.get(i)))
				returnLabel = labelList.get(i);
		return(returnLabel);
	}
}

Fang in Mainsource.someMethod() zum lesen an, dort sollte es losgehen.
 
Zurück