Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
while (tmp <= ai - 1) {
new Thread(new Runnable() {
@Override
public void run() {
a[tmp].actionPerformed(ae);
}
}).start();
tmp++;
}
}
Innerhalb der run() Methode kann ich auf die Elemente des Arrays a leider nicht zugreifen. Deswegen die Frage, wie schaffe ich es auf diese Arrayelemente trotzdem zuzugreifen? - Ich habe es schon mit get/set Methoden versucht, funktioniert allerdings nicht.
a ist ein ActionListener Array. Anmerkung: Das ActionListener Array ist natürlich gefüllt und ai mit entsprechendem Wert gesetzt!
Java:
public class ... {
private int ai = 0, tmp = 0;
private ActionListener[] a = new ActionListener[10];
...
public void pae(ActionEvent e) {
while (tmp <= ai - 1) {
new Thread(new Runnable() {
@Override
public void run() {
a[tmp].actionPerformed(e);
}
}).start();
tmp++;
}
}
Schreib Dir eine eigene Klasse, die Runnable implementiert. Definiere hierfür einen Konstruktor, dem Du das Array übergeben kannst. Speichere es in einer privaten finalen Instanzvariablen. Dann kannst Du auch von der run-Methode aus zugreifen.
[EDIT]Evtl. auch einfach Thread extenden. Ist für diesen Fall vielleicht weniger Arbeit.[/EDIT]
Danke für die Antwort. Daran hatte ich natürlich auch schon gedacht. Aber gibt es auch eine Möglichkeit ohne eine extra Thread Klasse dafür zu definieren?
Danke für die Antwort. Daran hatte ich natürlich auch schon gedacht. Aber gibt es auch eine Möglichkeit ohne eine extra Thread Klasse dafür zu definieren?
Ja, indem Du das Array irgendwo global hälst, bspw. als static (final) Variable oder als (final) Instanzvariable einer emum. Aber bei global-Variablen bin ich immer sehr skeptisch und verwende sie praktisch nie außer für die Definition einfachster Konstanten.
Danke, ja die static Variante finde ich auch "hässlicher" aber momentan interessanter, weil ich keine Ahnung habe wie ich das anstellen soll.
Java:
static int ai = 0;
static int tmp = 0;
static ActionListener[] a = new ActionListener[1000];
So habe ich es nämlich momentan, aber bekomme im Thread immer noch die Rückmeldung, dass Array enthält keine ActionListener Objekte (NullPointerException).
Man kann aus so einer anonymen inneren Klasse auf den Array zugreifen. Wenn du meinst, das es nicht geht, poste ein KSKB, wo es nicht geht. ActionListener in einem Array zu speichern und actionPerformed auf verschiedenen Threads auszuführen klingt aber SO sehr nach Bogus, dass du lieber erwähnen solltest, was du eigentlich vorhast...
static ActionListener[] a = new ActionListener[1000];
Damit hast Du auch nur das Array vorbereitet, bis zu 1000 ActionListener aufzunehmen. Reingetan hast Du aber noch nichts. Irgenwo musst Du die ActionListener-Instanzen herbekommen und zuweisen in etwa so:
Java:
a[0] = ...
oder mit ner Schleife
[EDIT]Das mit dem Präfix Klassenname vergesse ich immer. TryToHelp hätte den Dank verdient, weil er erster war. Aber leider nicht angemeldet :autsch:, also kriegt Marco ihn [/EDIT]
@nillehammer: Das Array ist, wie oben erwähnt, bereits mit ActionListener gefüllt worden. Dafür ist eine andere Methode zuständig die problemlos läuft.
static int ai = 0;
static int tmp = 0;
static ActionListener[] a = new ActionListener[1000];
...
public void run() {
EventDispatcherImpl.a[EventDispatcherImpl.tmp].actionPerformed(ae);
}
Danke TryToHelp aber ist stehe glaube ich gerade mächtig auf der Leitung. ???:L
Ausgabe:
null
Exception in thread "Thread-1" Exception in thread "Thread-0" java.lang.NullPointerException
null
Jungs/Mädels ich habe es jetzt doch mit einer extra Klasse für Thread und per Konstruktor realisiert. Ist schöner, hätte trotzdem gewusst warum es anderst nicht funktioniert.
Okay, ich melde mich nochmal! Vergesst alles vorherige.. Es ist richtig aus annonymen Klassen ist Zugriff möglich. Ich hatte zwei ActionListener Objekte angelegt. Die Variable tmp wurde bei jedem Schleifendurchlauf um eins erhöht. Zum Zeitpunkt als die Methode run() ausgeführt werden soll, war die Variable tmp aber bereits bei 2 (zur Erinnerung, Array hatte nur zwei ActionListener Objekte: Index 0&1).
Mit sleep konnte ich nun erreichen, dass gewartet wird bis der Thread auch wirklich gestartet wird und dann wird erst hochgezählt.
Warum, wird die Inkrementierung ausgeführt, bevor der Thread gestartet ist?? - Wie löst man das Problem OHNE sleep?
Java:
public void processActionEvent(final ActionEvent ae) throws InterruptedException {
while (tmp <= ai - 1) {
new Thread(new Runnable() {
@Override
public void run() {
a[tmp].actionPerformed(ae);
}
}).start();
Thread.sleep(10); // :-(
tmp++;
}
}
while (tmp <= ai - 1) {
final int index = tmp; //--------------- Speichern
new Thread(new Runnable() {
@Override
public void run() {
a[index].actionPerformed(ae); // --------- Verwenden
}
}).start();
tmp++;
Aber nochmal: Das sieht vom Ansatz her schon nach gröbstem Unfug aus. ActionPerformed darf nicht einfach so von jedem beliebigen Thread ausgeführt werden, und selbst wenn es das dürfte, wäre das Konstrukt Murksig! :autsch:
Das hatte ich bereits. - Die Lösung ist nur doof.^^
Aber nochmal: Das sieht vom Ansatz her schon nach gröbstem Unfug aus. ActionPerformed darf nicht einfach so von jedem beliebigen Thread ausgeführt werden, und selbst wenn es das dürfte, wäre das Konstrukt Murksig!
Die Aufgabenstellung die ich bekommen habe, ist, dass die actionPerformed Methode jedes ActionListener Objekt, welches sich im ActionListener Array befindet, von einem eigenen Thread ausgeführt wird.