ich bin gerade dabei ein wenig Java zu lernen. Dabei bin ich auf folgendes Problem gestoßen:
Ich habe ein kleines Programm geschrieben, welches ein Fenster mit Buttons erstellt.
Wenn ich nun auf einen der Buttons klicke soll irgendetwas mit diesem Button gemacht werden z.B.
die Farbe ändern. Dieses funktioniert bei mir bisher aber nur wenn ich meinen ActionListener für die
Buttons als innere Klasse meiner Hauptklasse anlege. Sobald ich den ActionListener außerhalb meiner
Hauptklasse anlege kann ich an den Buttons keine Änderung mehr vornehmen da er keinen Bezug
mehr zu den Buttons hat. Wie kann ich dem ActionListener sagen wie er auf meine Buttons zugreifen kann?
Ok, hier also der Code zu meinem Problem:
Die Klasse myActionListener soll ausserhalb der Klasse MyTest liegen.
Wie kann ich dann noch auf die Buttons zugreifen?
Code:
import java.awt.*;
import java.awt.event.*;
public class MyTest extends Frame {
public static Button[][] myPlayground;
public static MyTest wnd;
MyTest(){
super("Viele Buttons");
int i;
int j;
int count = 0;
addWindowListener(new WindowClosingAdapter(true));
setLayout(new GridLayout(20,20));
myPlayground=new Button[20][20];
myActionListener Test=new myActionListener();
for (i=0;i<20;i++){
for (j=0;j<20;j++){
myPlayground[i][j]=new Button("0");
myPlayground[i][j].setActionCommand(""+count);
myPlayground[i][j].addActionListener(Test);
add(myPlayground[i][j]);
count++;
}
}
}
public static void main(String[] args) {
wnd=new MyTest();
wnd.setSize(400,400);
wnd.setVisible(true);
}
// Diese Klasse soll auserhalb der Klasse MyTest
// liegen genauso wie der WindowClosingAdapter
class myActionListener implements ActionListener{
public void actionPerformed(ActionEvent myAction){
int pos;
int i;
int j;
pos=Integer.valueOf(myAction.getActionCommand()).intValue();
i=pos/20;
j=pos%20;
System.out.print(" ");
System.out.print(i);
System.out.print(" ");
System.out.println(j);
myPlayground[i][j].setBackground(new Color(255,0,0));
}
}
}
class WindowClosingAdapter
extends WindowAdapter
{
private boolean exitSystem;
public WindowClosingAdapter(boolean exitSystem)
{
this.exitSystem = exitSystem;
}
public WindowClosingAdapter()
{
this(false);
}
public void windowClosing(WindowEvent event)
{
event.getWindow().setVisible(false);
event.getWindow().dispose();
if (exitSystem) {
System.exit(0);
}
}
}
du bekommst über den ActionEvent die Methode getSource(). Die liefert dir das Objekt zurück, dass den Event auslöste (sie liefert dir ein Objekt der Klasse Object zurück, also das typcasten nicht vergessen) --> damit hast du dann z.B. deinen Button....
zweite möglichkeit einen eigenen Actionlistener schreiben der als instanzvarable den Button hat, d.h. du übergibst den Button im Konstruktor des ActionListeners. Somit weiß dann auch der ActionListener den Button...