ActionListener zu Buttons dynamisch zuordnen

Status
Nicht offen für weitere Antworten.

thoti

Mitglied
Hallo,
erstmal nette Grüße an alle, als Neuling im Forum :bae:.

Ich habe ein Problem beim Zuordnen von ActionListenern zu Buttons.

Die Buttons habe ich als Array definiert und will jedem nun in der for-Schleife jeweils eine eigene Methode zuordnen die sich im Objekt AktionsListener befinden. Dabei haben die Methoden den Namen actionX(), wobei X für die Nummer des Buttons geht. Ich habe es jetzt schon ewig versucht hin zu bekommen und habe dazu unter anderem schon probiert es nach diesem Thread zu lösen: http://www.java-forum.org/de/viewtopic.php?p=240462. Hieraus habe ich den Code der zwischen "new ActionListener()" steht abgeleitet.

Mittlerweile bin ich jetzt so weit dass ich das i nicht erst in den Klammern von for erzeuge, sondern schon vorher. Das hat ein Problem gelöst das mir Eclipse zeigte, dass ich keine Variablen einer äußeren Methode von einer inneren aus aufrufen darf, außer sie ist als final deklariert.
Ich müsste jetzt im Moment nur noch dieses m irgendwie so umwandeln dass es als Pfad zu der Methode akzeptiert wird. Oder wäre eine andere Lösung sinnvoller?


Viele Grüße,
Thomas

Fensta.java
Code:
private int i;
private Button bu[] = new Button[19];
private AktionsListener al = new AktionsListener(this);

public Fensta() {
	for (i = 0; i <= 18; i++) {
		bu[i] = new Button();
		bu[i].addActionListener(new ActionListener(){
			
			Method[] methods = al.getClass().getMethods();
				
			public void actionPerformed(ActionEvent e){
			String m= al+"."+methods[i].getName();
			//Hier sollte m als Aufruf der zugehörigen Methode hin (Bsp.: bu[0] ruft action0 in AktionsListener auf).
			}
		});
	}
}
AktionsListener.java
Code:
private Fensta f;

public AktionsListener(Fensta f) {
	this.f=f;
}
	
//Aktionen
public void action0(ActionEvent e) {
}
public void action1(ActionEvent e) {
}
public void action2(ActionEvent e) {
}
public void action3(ActionEvent e) {
}
public void action4(ActionEvent e) {
}
public void action5(ActionEvent e) {
}
.
.
.
usw.
 

Wildcard

Top Contributor
Das ist mal null OOP.
Beschreib mal den größeren Kontext, dann findet sich sicherleich eine 'vernünftige' Lösung.
 

thoti

Mitglied
Ich habe jetzt selbst eine Lösung gefunden. Mit Hilfe von http://www.tutego.com/javabuch/javainsel6/javainsel_21_004.htm#mj778a8ad041909bdf98b0c2ec9653ce70.

Meine Lösungsansatz war leicht falsch. So sieht meine for-Schleife jetzt aus und erfüllt den gewünschten Zweck, dass jeder Button eine eigene Methode zugewiesen bekommt die bei einer "action" ausgeführt wird (fällt mir erst jetzt ein die Formulierung, hätte euch glaub von Anfang an am meisten geholfen, sorry).
Code:
for (i = 0; i <= 18; i++) {
	bu[i] = new Button();
	
	bu[i].addActionListener(new ActionListener(){
		Method met = al.getClass().getMethod("action"+i, ActionEvent.class);
		public void actionPerformed(ActionEvent e){
			try {
				met.invoke(al, e);
			} 
			catch (IllegalArgumentException e1) {}
			catch (IllegalAccessException e1) {}
			catch (InvocationTargetException e1) {}
		}
	});

}
Die Exception-Blöcke habe ich frei gelassen, da bei einem Button den man nur drücken - oder nicht drücken - kann nicht wirklich was schief laufen könnte.

Mfg,
Thomas
 

Wildcard

Top Contributor
In fast allen Fällen ist diese Vorgehensweise absoluter Unsinn.
Ich biete dir nochmal an das du beschreibst was du haben möchtest und dann kann man über eine sinnvolle Lösung nachdenken.
 

thoti

Mitglied
Also ich versuch grad für mich zum Üben einfach mal einen einfachen Taschenrechner zu programmieren. Bin jetzt in der 11 Klasse und lerne dort mein erstes Jahr Java.
Ich weis nicht in welchem Hinblick du es als absoluten Unsinn bezeichnest, die Buttons als array zu definieren (sagt der Lehrer würden wir später eh immer so machen...), allgemein oder irgendwie anders. Dies ist meine Lösung aus meinem bisherigen Wissen und dem wo ich mit Suchen und Interpretieren zusammen bekommen habe :###.

In der Schule haben wir es bisher immer so gemacht dass wir ein Hauptprogramm mit der main-Methode erstellt haben. Bei mir ist das mittlerweile einfach Haupt.java. Dann ein neues Objekt in dem wir das Fenster erstellen liesen, bei mir Fensta.java und jeweils ein Objekt für den ActionListener (AktionsListener.java) und ein WindowListener (FensterListener.java).
Klassenintern hat uns der Lehrer bestimmen lassen wie wir lieber Fenster programmieren wollen, mit JFrame oder java.awt.Frame. Wir haben uns für Frame entschieden.

So wie ich den ActionListener in meiner Lösung hinzufüge, habe ich jetzt aus AktionsListener.java das "implements ActionListener" entfernt und habe nur noch die Methoden drin die bei einer Aktion ausgeführt werden.


Das ist so meine Vorgeschichte zu Java.
Ich freue mich über Kritik, wenn sie konstruktiv ist und setzte auch gerne neues um.
 

Wildcard

Top Contributor
Mir geht es nicht um das Array, sondern um die von dir verwendete Reflection.
Reflection ist ein sehr mächtiges das für sehr wenige Spezialfälle reserviert ist.
Damit irgendwelche actionPerformed Methoden aufzurufen ist nicht nur totaller Overkill, sondern auch noch höchst unflexible und hässlich.
Um dir zu sagen wie man es besser machen könnte müsste man wissen was die Buttons tun.
Auch wäre der Code einiger dieser actionX Methoden hilfreich.
 
R

Roar

Gast
Wildcard hat gesagt.:
Damit irgendwelche actionPerformed Methoden aufzurufen ist nicht nur totaller Overkill, sondern auch noch höchst unflexible und hässlich.

och, zusammen mit Annotations kann man sich da ganz coole sachen bauen :)
 

Wildcard

Top Contributor
Roar hat gesagt.:
och, zusammen mit Annotations kann man sich da ganz coole sachen bauen :)
Du ungergräbst meine Autoritäää :bae:
Aber im ernst, ein via Reflection verknüpftes Tastenfeld(?) eines Taschenrechners kann nicht der Weisheit letzter Schluß sein :wink:
 

thoti

Mitglied
Ursprünglich wollte ich das ganze durch ein einfaches al.action/*irgendwie Variable i hier hin*/ lösen das ich zwischen die geschweiften Klammern von "new ActionListener()" klemme. Nur hab ich die Variable da nicht Variabel hin bekommen.

Was die Buttons machen steht eigentlich alles in der for-Schleife. bu[0] bis bu[9] sind die Buttons mit den Zahlen. Ich adde alle Buttons später nur noch auf die Oberfläche und benenne vorher noch die Buttons mit den Rechenoperatoren.

Code:
public void action0(ActionEvent e) {
	if (Integer.parseInt(Fensta.disp.getText())==0);
	else Fensta.disp.setText(Fensta.disp.getText()+0);
}
public void action1(ActionEvent e) {
	Fensta.disp.setText(Fensta.disp.getText()+1);
}
public void action2(ActionEvent e) {
	Fensta.disp.setText(Fensta.disp.getText()+2);
}

"disp" ist in Fensta die statische Variable für ein Label. Hier soll eigentlich nur beim Drücken eines Zahlenbuttons die Zahl auch angezeigt werden. Der Teil ist aber noch nicht ganz ausgereift, da ich noch mit dem Label etwas Kämpfe das seine Größe nicht automatisch anpasst wenn es aus einer anderen Methode als der in der ich es geaddet habe geändert wird. Für die nicht Zahlen Buttons habe ich deswegen noch keine auszuführenden Befehle eingetragen

P.S. Roar's Beitrag hab ich "überlesen", aber werde mir später anschauen was er meint :wink:
 

Wildcard

Top Contributor
Ich schreib dir mal Pseudocode hin:
Code:
für alle Buttons{
buttons[i].setActionCommand(String.valueOf(i));
buttons[i].addActionListener(someActionListener);
//                                                       ^das ist immer der gleiche
}

someActionListener:

actionPerformed(ActionEvent e)
{
    Fensta.disp.setText(Fensta.disp.getText()+e.getActionCommand()); 
}

und schon fertig :wink:
 

thoti

Mitglied
Danke!!!
Coole Lösung funktioniert und vor allem viel kürzer und übersichtlicher, muss ich halt noch ausbauen dass es sich wirklich so verhält wie das bei einem normalen Rechner aussieht.

ABER :idea:: setActionCommand lass ich weg "By default this action command is set to match the label of the button." Heißt so viel wie i ist eh schon das action command :bae: .

Nochmal danke, weiter so :D.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Mehrere Buttons mit einem ActionListener abdecken Java Basics - Anfänger-Themen 24
R Problem mit ActionListener für Buttons Java Basics - Anfänger-Themen 5
D Erste Schritte Buttons mit actionlistener Problem Java Basics - Anfänger-Themen 3
S Erste Schritte ActionListener auf Buttons einrichten Java Basics - Anfänger-Themen 3
manunana89 2 ActionListener auf 2 Buttons??? Java Basics - Anfänger-Themen 6
G Grafische Oberfläche mit Buttons und Actionlistener? Java Basics - Anfänger-Themen 27
I Actionlistener für Buttons Java Basics - Anfänger-Themen 2
N ActionListener versch. Buttons zuweisen => versch. Method Java Basics - Anfänger-Themen 13
X ActionListener bei Buttons Java Basics - Anfänger-Themen 3
E ActionListener Java Basics - Anfänger-Themen 4
U Eigenschaft eines JTextfiels per ActionListener ändern... Java Basics - Anfänger-Themen 2
U HILFE! - per ActionListener Felder enablen....... Java Basics - Anfänger-Themen 5
C JButton reagiert nicht auf actionListener Java Basics - Anfänger-Themen 15
H Eine Methode über Actionlistener beenden Java Basics - Anfänger-Themen 8
J Array Actionlistener Java Basics - Anfänger-Themen 9
J ActionListener von JCheckBox im Knoten von JTree funktioniert nicht Java Basics - Anfänger-Themen 2
P Erste Schritte ActionListener Java Basics - Anfänger-Themen 2
F Problem mit KeyListener in kombination mit dem ActionListener Java Basics - Anfänger-Themen 4
F Habe ein problem mit dem ActionListener Java Basics - Anfänger-Themen 3
J Erste Schritte Actionlistener für tbar/ JButton Java Basics - Anfänger-Themen 15
krgewb ActionListener Java Basics - Anfänger-Themen 1
L Zugriff auf Attribute eins Objekts über ActionListener Java Basics - Anfänger-Themen 4
T Konsolenscanner startet nicht durch Aufruf von Actionlistener Java Basics - Anfänger-Themen 4
F ActionListener mit Files etc Java Basics - Anfänger-Themen 12
N Probleme mit dem ActionListener Java Basics - Anfänger-Themen 4
CptK Auf ActionListener von anderer Klass aus zugreifen Java Basics - Anfänger-Themen 5
U ActionListener mit JMenuItems verknüpfen Java Basics - Anfänger-Themen 1
S in ActionListener auf Eingabe aus anderem Frame warten Java Basics - Anfänger-Themen 2
L Problem bei Java-ActionListener Java Basics - Anfänger-Themen 4
J Anfänger: ActionListener und ProcessBuilder machen Probleme Java Basics - Anfänger-Themen 6
D Einen Wert unter einen ActionListener weitergeben Java Basics - Anfänger-Themen 1
T Übernahme einer Variablen im ActionListener/ActionEvent Java Basics - Anfänger-Themen 2
JavaNewbie2.0 ActionListener Java Basics - Anfänger-Themen 11
Voreck Actionlistener problem Java Basics - Anfänger-Themen 1
G Im ActionListener eine "äußere" Variable verändern Java Basics - Anfänger-Themen 13
T Fehler beim ActionListener Java Basics - Anfänger-Themen 2
M public static int in ActionListener Java Basics - Anfänger-Themen 6
S actionlistener timer Java Basics - Anfänger-Themen 9
J Interface ActionListener in eigener Klasse Java Basics - Anfänger-Themen 27
P aus ActionListener auf HauptFrame zugreifen Java Basics - Anfänger-Themen 4
A Klassen Bool Actionlistener Java Basics - Anfänger-Themen 2
K Methoden ActionListener wird übersprungen Java Basics - Anfänger-Themen 3
S actionlistener Java Basics - Anfänger-Themen 29
S ActionListener und Statische Variablen Java Basics - Anfänger-Themen 4
J ActionListener Java Basics - Anfänger-Themen 5
A ActionListener Java Basics - Anfänger-Themen 9
Z ActionListener wird nicht erkannt? Java Basics - Anfänger-Themen 5
T ActionListener Source vergleichen Java Basics - Anfänger-Themen 8
T Frage zum ActionListener Java Basics - Anfänger-Themen 5
R ActionListener mit for Schleife füllen. Java Basics - Anfänger-Themen 4
K Button's mit versch. Aufgaben/ActionListener Java Basics - Anfänger-Themen 12
S KeyListener/ActionListener/paint()/repaint() Java Basics - Anfänger-Themen 3
I ActionListener reagiert nicht Java Basics - Anfänger-Themen 6
N Probleme mit ActionListener und Logischer Abfrage Java Basics - Anfänger-Themen 4
S JButton mit ActionListener Java Basics - Anfänger-Themen 5
S ActionListener, Methoden und Variablen Java Basics - Anfänger-Themen 4
X Variablen Actionlistener | Variablen-namen Java Basics - Anfänger-Themen 5
G ActionListener implementieren Java Basics - Anfänger-Themen 12
T Erste Schritte Berechnete Variable im ActionListener zurückführen Java Basics - Anfänger-Themen 6
D Panel sichtbar/unsichtbar machen im ActionListener Java Basics - Anfänger-Themen 3
U JFrame durch ActionListener erweitern Java Basics - Anfänger-Themen 4
M Button , actionlistener Java Basics - Anfänger-Themen 11
P Erste Schritte JTable mit Daten aus Acces DB füllen und Actionlistener einsetzen Java Basics - Anfänger-Themen 29
M Actionlistener Java Basics - Anfänger-Themen 9
D Problem mit ausgelagertem Actionlistener Java Basics - Anfänger-Themen 4
D KeyListener und ActionListener Problem Java Basics - Anfänger-Themen 6
M Klassen Durch den ActionListener das GUI einer anderen Klasse verändern Java Basics - Anfänger-Themen 8
T NullPointerException im ActionListener Java Basics - Anfänger-Themen 3
C Erste Schritte GUI - ActionListener - Exception Nullpointer Java Basics - Anfänger-Themen 5
Kenan89 ActionListener in eigene Klasse Java Basics - Anfänger-Themen 8
E JMenu ActionListener reagiert nicht? Java Basics - Anfänger-Themen 6
V ActionListener in einer for-Schleife Java Basics - Anfänger-Themen 2
M Variablen Variable lässt sich durch ActionListener nicht ändern Java Basics - Anfänger-Themen 5
P ActionListener Action Event Java Basics - Anfänger-Themen 5
L ActionListener zerschießt AnchorLayout Java Basics - Anfänger-Themen 8
D ActionListener braucht zwei Klicks auf Button??? Java Basics - Anfänger-Themen 2
M Methoden Timer in ActionListener aufrufen Java Basics - Anfänger-Themen 2
Y Actionlistener passt nicht zu Dataset Java Basics - Anfänger-Themen 6
W Problem mit FileWriter / ActionListener Java Basics - Anfänger-Themen 6
F actionListener Java Basics - Anfänger-Themen 3
T ActionListener auslagern Java Basics - Anfänger-Themen 14
S Actionlistener funktionieren nicht in der .jar Java Basics - Anfänger-Themen 9
E ActionListener abwarten lassen? Java Basics - Anfänger-Themen 11
E ActionListener in anderer Klasse erkennen Java Basics - Anfänger-Themen 13
H ActionListener Verbesserung möglich? (This) Java Basics - Anfänger-Themen 3
E ActionListener erkennt instanz nicht Java Basics - Anfänger-Themen 9
V ActionListener bei vielen Modulen Java Basics - Anfänger-Themen 3
J ActionListener Java Basics - Anfänger-Themen 2
T JLabel durch ActionListener ändern Java Basics - Anfänger-Themen 4
S ActionListener Java Basics - Anfänger-Themen 4
U actionListener - eine Kleine Frage Java Basics - Anfänger-Themen 7
K Actionlistener Java Basics - Anfänger-Themen 7
M ActionListener außerhalb des EDT ausführen Java Basics - Anfänger-Themen 2
A ActionListener im JMenu - Problem Java Basics - Anfänger-Themen 2
M ActionListener reagiert nicht Java Basics - Anfänger-Themen 4
N ActionListener + GUI Java Basics - Anfänger-Themen 8
H Bewegtes Bild im ActionListener [Problem] Java Basics - Anfänger-Themen 12
D Liste+ActionListener Java Basics - Anfänger-Themen 6
L wie Jframe an ActionListener übergeben Java Basics - Anfänger-Themen 4
U ActionListener und KeyListener - KeyListener funktioniert nicht Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben