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.
 

MrClave

Bekanntes Mitglied
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:

user.src

Mitglied
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 :)
 

VfL_Freak

Top Contributor
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
 

X5-599

Top Contributor
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:

user.src

Mitglied
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:

X5-599

Top Contributor
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).
 

user.src

Mitglied
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.
 

geqoo

Bekanntes Mitglied
Java:
public void actionPerformed(ActionEvent e) {
  JButton clickedButton = (JButton) e.getSource();

  spielzug();
  clickedButton .setText(symbol);
  clickedButton .removeActionListener(this);
}
 
Zuletzt bearbeitet:

X5-599

Top Contributor
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.
 

user.src

Mitglied
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?
 

X5-599

Top Contributor
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);
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
R App soll selbstständig reagieren, anstatt via Models Java Basics - Anfänger-Themen 0
T jOptionPane zum schließen von Fenster, wie "Ja" und "Nein" anstatt Yes und No Java Basics - Anfänger-Themen 2
I Output BigDecimal anstatt double / Problem beim Rechnen Java Basics - Anfänger-Themen 16
I Format Problem mit Wert - bekomme 0,10 anstatt 10,00 Java Basics - Anfänger-Themen 6
P Hashmap anstatt LinkedList? Java Basics - Anfänger-Themen 6
T GUI anstatt Bild schwarzes Rechteck gespeichert Java Basics - Anfänger-Themen 0
M Anstatt 1 int Rückgabewert, mehrere Rückgaben mit Arraylist Java Basics - Anfänger-Themen 8
J Array anstatt Begriffe als Indizes Java Basics - Anfänger-Themen 14
I Erste Schritte while anstatt for, if und break Java Basics - Anfänger-Themen 10
K Was benutzen anstatt this? Java Basics - Anfänger-Themen 9
K Polymorphie Objektreferenz als Superklasse anstatt des Objekttypes Java Basics - Anfänger-Themen 12
B List list - anstatt ArrayList list = new ArrayList Java Basics - Anfänger-Themen 10
D JTextField anstatt Jbuttons Java Basics - Anfänger-Themen 9
A POI Einlesen Excel Workbook aus BLOB oder von URL anstatt aus Filesystem ? Java Basics - Anfänger-Themen 3
P (Arbeitstag-) Calendar - 9 anstatt 24 Stunden Java Basics - Anfänger-Themen 12
dl85hej Zeitsitschleife anstatt Timer Java Basics - Anfänger-Themen 5
B String.equals(Object) anstatt "=" Java Basics - Anfänger-Themen 3
Horst79 Temp Datei cachen anstatt physikalische Datei im root Verz? Java Basics - Anfänger-Themen 8
G start-oder paint-Methode anstatt Event-Handling-Methode? Java Basics - Anfänger-Themen 3
S StringBuffer anstatt += Java Basics - Anfänger-Themen 8
C Servlets: doPost() etc. anstatt service() Java Basics - Anfänger-Themen 4
C Anstatt Spalte, Zeile mit Comparator sortieren . Java Basics - Anfänger-Themen 5
D contains bei JTextArea anstatt bei JTextField Java Basics - Anfänger-Themen 8
H private anstatt public Java Basics - Anfänger-Themen 2
C Wie kann ich Grichische Buchstaben ausgeben anstatt latein? Java Basics - Anfänger-Themen 2
M Ausgabe in String anstatt auf Stream Java Basics - Anfänger-Themen 17

Ähnliche Java Themen

Neue Themen


Oben