buttonarray[this] anstatt buttonarray[index] ?

user.src

Mitglied
Guten Morgen,

noch ein Problem, das mich gerade Beschaeftigt.
Nehmen wir wieder das Bsp. TicTacToe:

Ich habe ein Button, auf dem ich "x" bzw. "o" setzen moechte.
Mein ActionListener verfuegt dabei ueber folgende Zeilen Code:

Java:
if (clickedButton.equals(allebuttons[0])) {
Spielzug();
allebuttons[0].setText(symbol);

Diese Aktion muesste ich ja nun - je nachdem, wie viele Buttons mein Array hat - immer wieder
dem jeweiligen index des ButtonArrays zuweisen. Bei 9 Buttons also 9x diesen Codeblock.

Gibt es eine Moeglichkeit, dass ich den Block nur einmal schreibe und er sich immer auf eben genau
"this"-Index bezieht, auf den gerade der ActionListener zugreift?!

So koennte ich in der Theorie
Java:
allebuttons[this].setText(symbol);
auch gleich mit in die Methode implementieren und allgemein, kaeme es mir sauberer und uebersichtlicher vor.
Ist dieses Vorhaben irgendwie realisierbar?

Ich hoffe, man weiss, worauf ich hinaus moechte.
 
Bevor man sich mit GUI beschäftigt, sollte man Dinge wie Schleifen beherrschen. :bahnhof:
Wenn du ein Array siehst, solltest du automatisch an for-Schleifen denken.

Vergleichen tut man ein Event mit der Quelle normal auch mit dem Gleichheitsoperator
Code:
==
und nicht mit equals.

Den Sinn von this hast du aber scheinbar auch nicht verstanden ???:L

P.S. Methodennamen IMMER klein schreiben.
 
Zuletzt bearbeitet:
Auch wenn Rechtfertigung immer so ne Sache ist... ich schieß mal los:

1. Ich denke, dass Thema Schleifen und Ablaufsteuerung ist mir mittlerweile gelaeufig. Bei diesem Thema hier kam mir auch schon
der Gedanke einer for-each Schleife, allerdings sind diese noch eine kleine Baustelle auf meiner 2Do-Liste und ich wollte hier, im Einsteigerforum erst einmal in Erfahrung bringen, ob es nicht andere Wege gibt, die nach Rom fuehren

2. Das Thema Vergleich ist mir ebenfalls gelaeufig. Dieses Thema hier dient tatsaechlich auch viel mehr der Theorie, um dafuer
habe ich die Antwort eines User aus diesem Thread aufgegriffen, nur um meine Gedanken
an Hand eines Bsp. zu erlaeutern.

3. In diesem Zuge ist mir this auch bekannt. Nur sollte dieses "this" hier theoretisch veranschaulichen, worauf ich hinaus moechte.
Anstatt den Threadtitel mit WallofText zu fuellen, wollte ich es kurz halten. Deiner Antwort nach, hast du ja auch verstanden, worauf ich abziele.

Daher sei mir verziehen, dass der Methodenname groß beginnt. Wenn die Finger den Gedanken hinterherrrennen, weil man versucht, alle mgl. Inputs kompakt in nem Thread zu verfassen, dann kann es schon einmal passieren, dass man gewohnt groß am Satzanfang beginnt.

Yop 🙂
 
Moin,

3. In diesem Zuge ist mir this auch bekannt. Nur sollte dieses "this" hier theoretisch veranschaulichen, worauf ich hinaus moechte.
Anstatt den Threadtitel mit WallofText zu fuellen, wollte ich es kurz halten. Deiner Antwort nach, hast du ja auch verstanden, worauf ich abziele.
ich denke nicht, dass Du es wirklich verstanden hast ... zumal es hier in Diener Frage dann mehr verwirrt als Klarheit schaft!

"this" ist eine Selbstreferenz, also als Index völlig ungeeignet!
What is the meaning of "this" in Java? - Stack Overflow

Gruß
Klaus
 
Bin nicht ganz mitgekommen. Also nochmal langsam: Haben alle deine Buttons den selben ActionListener? Wenn ja, kansst du mit
Java:
JButton b = (JButton)e.getSource();

genau den Button herausfinden, der das Event ausgelöst hat. Ich nehme an das ist das was du mit "this" erreichen wolltest?
 
Zuletzt bearbeitet:
Mit this referenziere ich doch immer auf ein Objekt?!

Java:
		for (int i = 0; i < buttonmenge; i++) {
			JButton button = new JButton("-");
			button.addActionListener(this);
			buttons[i] = button;
			panel.add(button);
		}

In dem Bsp. referenziere ich ueber den ActionListener auf jeweils genau einen button meines Button-Arrays.
Daher nahm ich an, dass ich im ActionListener dann selbst, eine allgemeine Vorgehensweise fuer jeweils buttons festlegen kann,
ohne jeden Index selbst ansprechen zu muessen.

Was uebersehe ich bzw. wo ist mein Denkfehler?

EDIT:
genau den Button herausfinden, der das Event ausgelöst hat. Ich nehme an das ist das was du mit "this" erreichen wolltest?

Genau darauf wollte ich hinaus.
 
Zuletzt bearbeitet:
Dann wäre das doch eine mögliche Lösung für dich, oder nicht?

Mit "this" verweist du auf ein Objekt der aktuellen Klasse. In deinem Fall FensterKlasse (oder wie auch immer die Klasse heisst wo der ganze Code steht).
 
Naja, jein... ich merke gerade, dass ich wohl echt mehr Code haette mitliefern sollen. Im Nachhinein ist mir klar, dass man nur schwer Verstehen kann/konnte, auf was ich hinaus will.
Ich versuch das Ganze daher mal anhand hiervon zu veranschaulichen:

Allem voran gehend:

Java:
		for (int i = 0; i < buttonanzahl; i++) {
			JButton button = new JButton("-");
			button.addActionListener(this);
			allebuttons[i] = button;
			spielfeld.add(button);
		}

Gefolgt von:

Java:
	@Override
	public void actionPerformed(ActionEvent e) {
		JButton clickedButton = (JButton) e.getSource();
		
		if (clickedButton == allebuttons[0]) {
			spielzug();
			allebuttons[0].setText(symbol);
			allebuttons[0].removeActionListener(this);

		} else if (clickedButton == allebuttons[1]) {
			spielzug();
			allebuttons[1].setText(symbol);
			allebuttons[1].removeActionListener(this);
		} else if (clickedButton == allebuttons[2]) {
			spielzug();
			allebuttons[2].setText(symbol);
			allebuttons[2].removeActionListener(this);
		} else if (clickedButton == allebuttons[3]) {
			spielzug();
			allebuttons[3].setText(symbol);
			allebuttons[3].removeActionListener(this);
		} else if (clickedButton == allebuttons[4]) {
			spielzug();
			allebuttons[4].setText(symbol);
			allebuttons[4].removeActionListener(this);
		} // usw. usf.

Meine Frage bzw. auch mein Ziel:
Zum einem wuerde ich gerne setText(symbol) sowie removeActionListener() in spielzug() implementieren. Zum anderen wuerde ich gerne einfach nur eine einzige if/else Bedingung haben.

Naemlich:
Java:
if (clickedButton == allebuttons[i]) {
			spielzug();
			allebuttons[i].setText(symbol); // beide Methodenaufrufe bevorzugt ...
			allebuttons[i].removeActionListener(this); // ... schon ueber spielzug() aufrufen
		}

Dabei fehlt es mir gerade am Verstaendis bzw. an der Erkenntnis, ob das ueberhaupt Moeglich ist.
 
Java:
public void actionPerformed(ActionEvent e) {
  JButton clickedButton = (JButton) e.getSource();

  spielzug();
  clickedButton .setText(symbol);
  clickedButton .removeActionListener(this);
}
 
Zuletzt bearbeitet:
Ich stimmer geqoo zu. Darauf wollte ich hinaus. Es ist nicht nötig den auslösenden Button mit jedem Button in deinem Array zu vergleichen und dann über das Array diesem Button den Text zu ändern/ActionListener zu nehmen.

Du könntest in der spielzug() Methode einen JButton als Parameter mitgeben. So:
spielzug(clickedButton);
Dafür musst du natürlich den Methodenkopf entsprechend anpassen.
 
Oh man :facepalmatme:

Es leuchtet so ein, aber ich bin echt einfach noch nicht in der Lage, auch nur einen mm ueber den Tellerrand hinaus zu schauen. Verdammter Tunnelblick.
Ich hoffe, dass ist nur die Buerde eines Anfaengers und gibt sich mit der Zeit und laeuft bei mir nicht auf nen fatalen Brainbug hinaus ...

Merci!

Eine Frage bleibt dennoch.

Auf
Java:
clickedButton .setText(symbol);
clickedButton .removeActionListener(this);
kann ich ja von außen nicht zugreifen. Wie wuerde das aussehen, wenn ich das ueber spielzug() gleich mit uebergeben moechte?
 
Java:
public void spielzug(JButton button)
{
    //deine Methode halt
    button.setText(symbol);
    button.removeActionListener(this);

    //Rest deiner Methode
}

Dan so aufrufen im ActionListener: spielzug(clickedButton);
 

Neue Themen


Zurück
Oben