Allg. Frage zum ev. dispatch thread, wie korrekt auf reaktion der Listener warten?

Status
Nicht offen für weitere Antworten.

0x7F800000

Top Contributor
Schönen guten Tag allerseits.Ich hab hier schon wieder ein paar relativ billige Fragen.

1. Frage:
Ich habe mich nie so genau damit beschäftigt, aber irgendwie dachte ich immer, dass bei Swing alle gefeuerten events auf den event dispatch thread kommen. Zumindest hat sich für mich das hier:
Die Reihenfolge, in der die Listener abgearbeitet werden, ist im Prinzip undefiniert. Zwar reiht sie Sun in ihrer Implementierung in eine Liste ein, sodass es dadurch eine Reihenfolge gibt, doch sollte es keine Beachtung dieses Implementierungsdetails geben.
(aus Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 16.5 Es tut sich was – Ereignisse beim AWT ) genau so angehört, dass alle gefeuerten Events einfach in einer langen Liste landen, und alle nacheinander abgearbeitet werden.
Dies ist anscheinend doch nicht der Fall, hab mir hier diesen code aus javax.swing.AbstractButton angeschaut:
[highlight=Java]
protected void fireActionPerformed(ActionEvent event) {
// Guaranteed to return a non-null array
Object[] listeners = listenerList.getListenerList();
ActionEvent e = null;
// Process the listeners last to first, notifying
// those that are interested in this event
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners==ActionListener.class) {
// Lazily create the event:
if (e == null) {
String actionCommand = event.getActionCommand();
if(actionCommand == null) {
actionCommand = getActionCommand();
}
e = new ActionEvent(AbstractButton.this,
ActionEvent.ACTION_PERFORMED,
actionCommand,
event.getWhen(),
event.getModifiers());
}
((ActionListener)listeners[i+1]).actionPerformed(e);
}
}
}
[/highlight]
Da werden anscheinend einfach alle(???:L) Listener durchlaufen, und bei den wird direkt actionPerformed() aufgerufen. Das ist so üblich und gut so, es gibt keinen Grund hier irgendwelche Konstrukte mit invokeLater() in irgendwelche queues zu schieben, richtig? Okay, gut, umso besser.

2. Frage: (eher nur aus Neugier) Versteht einer was diese Rückwärtssaltos in 2er schritten sollen? War eine foreach-schleife (oder halt eine normale schleife die von 0 bis "n" läuft...) zu langeweilig oder wie? ???:L

3. Frage:
Angenommen ich habe mir ein spezielles JComponent geschrieben, das eine private variable enthält, die bei jeder Größenänderung neuberechnet werden muss. Ich habe versucht, es einfach dadurch zu lösen, dass ich an dieses JComponent einen ComponentListener anhänge und auf Größenänderungen höre.
Kleines (wenn ihr wollt sogar kompilierbares^^) Beispiel:
[highlight=Java]
import javax.swing.*;
import java.awt.event.*;

public class ResizeReaction {

private static class A extends JComponent implements ComponentListener{

private int value;

public A(){
value=0;
addComponentListener(this);
}

private void updateValue(){
value=this.getWidth()*this.getHeight();
}

public int getValue(){
return value;
}

@Override public void componentHidden(ComponentEvent arg0) {}
@Override public void componentMoved(ComponentEvent arg0) {}
@Override public void componentShown(ComponentEvent arg0) {}

@Override
public void componentResized(ComponentEvent arg0) {
updateValue();
}
}

public static void main(String..._){
JFrame f=new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(100,100);
f.setLayout(null);

A a=new A();
f.getContentPane().add(a);
a.setSize(1,1); //<--- das schafft der awt thread meistens, value wird auf 1 gesetzt
f.setVisible(true);

a.setSize(1,2); //<--- das schafft der awt thread nicht so schnell, value wird erst später 2
//wie warte ich hier korrekt auf die ausfuehrung von componentResized()?

/* einfach brutal eine sekunde warten geht natürlich, ist aber hässlich
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
*/
System.out.println(a.getValue());//hier würde ich gerne 2 rauskriegen, irgendwie...
}
}
[/highlight]
Könntet ihr mir bitte mal einen Tipp geben, wie ich auf die neuberechnung des "value" korrekt warte? Komme irgendwie nicht drauf... :autsch:

Vielen Dank im Voraus.
 

hdi

Top Contributor
Also diese Schleife find ich auch merkwürdig. Was soll das?

Wenn listeners ein ActionListener ist, dann wird listeners[i+1] zu einem
ActionListener gecasted - ohne catch!

Also wenn das vorige Element ein ActionListener ist, wird das nächste zu einem
gemacht. Das würde zumindest die Vorgehensweise mit i -= 2 erklären, aber
was soll das fürn Sinn machen?
 

max40

Bekanntes Mitglied
Zu Frage 2: Ich würde sagen das ist LIFO (Last In First Out) und wäre dann so richtig!
In listeners steht kein Actionlistener drin sonder ActionListener.class und in listeners[i+1] steht erst der Listener

Zu Frage 3: kann man in einem Thread darauf warten das ein anderer fertig ist? Jedenfalls glaube ich nicht das man heraus bekommt ob der AWT-Thread fertig ist!
Wenn es die Programmsteuerung passt, würde ich mit
EventQueue.invokeLater(new Runnable(){
@Override
public void run() {
System.out.println(a.getValue());//hier würde ich gerne 2 rauskriegen, irgendwie...

}
});

machen!
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Zu 1: Die Reihenfolge ist in dem Sinne unpezifiziert, dass die Events bei einem AbstractButton zwar einfach nacheinander an alle Listener weitergereicht werden, aber bei Größenänderungen nicht (siehe Component#notifyNewBounds(boolean resized, boolean moved) ). Das hat vielleicht grob mit der Unterscheidung zu tun, die in den Dokus teilweise angedeutet ist:
ComponentEvent: A low-level event which indicates that....
Component events are provided for notification purposes ONLY; The AWT will automatically handle component moves and resizes internally...

Es gibt einige Events, die Swing/AWT intern brauchen, um zu funktionieren (Component/ContainerEvent, HierarchyEvent, PaintEvent...), und andere, die Intern keine Rolle spielen: Ob ein Button einen ActionEvent wirft oder nicht hat für AWT keine Bedeutung (wohl aber, dass er einen ComponentEvent wirft, wenn er vergrößert wird).


Zu 2: Das fand ich auch immer seltsam: In der EventListenerList wird ein Array gespeichert, der für jeden hinzugefügten Listener ein "Tupel" speichert: Seine Klasse, und den Listener selbst. Und (wie im geposteten Codestück sichtbar) wird einfach durch die Liste gegangen, und wenn "die richtige" Klasse gefunden wird, wird das darauffolgende Element in "die richtige" Klasse gecastet und der Event gefeuert. Das bezieht sich aber nur auf Swing. (Obwohl es bei AWT mit dem ... AWTEventMuticaster oder wie der hieß...) ähnliche Mechanismen gab. Erklären kann man dieses Konstrukt vielleicht durch die Frage nach den Alternativen: Was sollte man machen? Viele Listen, für jeden Listener-Typ eine? Wie stellt man da Threadsicherheit her? Bei jedem Add/Remove eine Neue Liste erstellen? Hm. Einige Gründe sind auch in der Doku zur EventListenerList genannt...


Zu 3: Abgesehen davon, dass alles, was in der main steht, in einem SwingUtilities.invokeLater stehen sollte, ist DAS auch die Möglichkeit, dort immer den richtigen Wert zu erhalten: Die Abfrage in ein SwingUtilities.invokeLater zu packen. Für "bessere" Alternativen (falls es sie gibt) müßte man das konkrete Ziel vielleicht genauer kennen...
 

0x7F800000

Top Contributor
Zu Frage 2: Ich würde sagen das ist LIFO (Last In First Out) und wäre dann so richtig!
In listeners steht kein Actionlistener drin sonder ActionListener.class und in listeners[i+1] steht erst der Listener

Besten Dank! Es kommt mir nach wie vor gruselig vor, aber jetzt verstehe ich wenigstens den Sinn, thx.

Zu Frage 3: kann man in einem Thread darauf warten das ein anderer fertig ist? Jedenfalls glaube ich nicht das man heraus bekommt ob der AWT-Thread fertig ist!
Der wird doch nie fertig...
Der Tipp mit invokeAndWait ist sehr hilfreich. :toll:
Zu 1: Die Reihenfolge ist in dem Sinne unpezifiziert, dass die Events bei einem AbstractButton zwar einfach nacheinander an alle Listener weitergereicht werden, aber bei Größenänderungen nicht (siehe Component#notifyNewBounds(boolean resized, boolean moved) ). Das hat vielleicht grob mit der Unterscheidung zu tun, die in den Dokus teilweise angedeutet ist:
ComponentEvent: A low-level event which indicates that....
Component events are provided for notification purposes ONLY; The AWT will automatically handle component moves and resizes internally...

Es gibt einige Events, die Swing/AWT intern brauchen, um zu funktionieren (Component/ContainerEvent, HierarchyEvent, PaintEvent...), und andere, die Intern keine Rolle spielen: Ob ein Button einen ActionEvent wirft oder nicht hat für AWT keine Bedeutung (wohl aber, dass er einen ComponentEvent wirft, wenn er vergrößert wird).
Okay. Der dispatch thread ist also eher für die lowleveligen events und für das, was man selbst mit invokeHowever() da reinpackt, die Semantischen Events werden dagegen direkt an die passenden Listener weitergereicht.
Zu 2: Das fand ich auch immer seltsam: In der EventListenerList wird ein Array gespeichert, der für jeden hinzugefügten Listener ein "Tupel" speichert: Seine Klasse, und den Listener selbst. Und (wie im geposteten Codestück sichtbar) wird einfach durch die Liste gegangen, und wenn "die richtige" Klasse gefunden wird, wird das darauffolgende Element in "die richtige" Klasse gecastet und der Event gefeuert. Das bezieht sich aber nur auf Swing. (Obwohl es bei AWT mit dem ... AWTEventMuticaster oder wie der hieß...) ähnliche Mechanismen gab. Erklären kann man dieses Konstrukt vielleicht durch die Frage nach den Alternativen: Was sollte man machen? Viele Listen, für jeden Listener-Typ eine? Wie stellt man da Threadsicherheit her? Bei jedem Add/Remove eine Neue Liste erstellen? Hm. Einige Gründe sind auch in der Doku zur EventListenerList genannt...
Naja, diese ganzen Events wurden (auf Kosten von ID's) so entworfen, dass es überschaubar viele gibt. Da würde es imho auch nicht so wehtun, für jeden typ eine separate Liste anzulegen (so mache ich das jetzt jedenfalls bei eigenen components... erstmal ohne rückwärtssaltos). Da die Listener manchmal nur ganz am anfang, und sonst auch nicht zu häufig angehängt und entfernt werden, hätte man den teil imho auch synchronisieren können, aber vielleicht fehlt mir da der Überblick, um ein entscheidendes Gegenargument zu sehen ???:L.
Wozu man da unbedingt LIFO braucht raff ich auch nicht. ist doch egal wer was als erster mitbekommt, solange alle informiert werden... naja, was soll's.
Zu 3: Abgesehen davon, dass alles, was in der main steht, in einem SwingUtilities.invokeLater stehen sollte, ist DAS auch die Möglichkeit, dort immer den richtigen Wert zu erhalten: Die Abfrage in ein SwingUtilities.invokeLater zu packen. Für "bessere" Alternativen (falls es sie gibt) müßte man das konkrete Ziel vielleicht genauer kennen...
Haha! Ich sehe den Wald wieder! *freu* :applaus:

(Goddamnit :autsch: was ist bloß los mit mir... Ich seh's mal Positiv: je peinlicher der Fehler, desto kleiner die Wahrscheinlichkeit, dass ich den wiederhole^^)

Also, ich denke mal, Problem gelöst. Vielen Dank an euch alle! :toll:
 
Zuletzt bearbeitet:
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
lumo SWT Zeichnen bescheunigen bzw eine allg. Frage AWT, Swing, JavaFX & SWT 8
S allg. Frage zur GUI-Architektur AWT, Swing, JavaFX & SWT 5
E Frage zum Schieberegler JSlider AWT, Swing, JavaFX & SWT 5
thor_norsk Java - Allgemeine - Frage AWT, Swing, JavaFX & SWT 14
thor_norsk Allgemeine Frage AWT, Swing, JavaFX & SWT 10
M Frage zu Java Bundesligaverwaltung AWT, Swing, JavaFX & SWT 7
thor_norsk Allgemeine Frage AWT, Swing, JavaFX & SWT 9
E Frage zum Textfeld AWT, Swing, JavaFX & SWT 8
H Swing JMenu aufgeklappt oder nicht - Wie frage ich das ab? AWT, Swing, JavaFX & SWT 5
pkm Frage wegen java.lang.IllegalStateException bei DocumentListener AWT, Swing, JavaFX & SWT 4
D Frage zu ActionListenern und AvtionEvents AWT, Swing, JavaFX & SWT 2
ralfb1105 JavaFX Daten zwischen Controllern austauschen- neue Frage AWT, Swing, JavaFX & SWT 7
F JavaFX Frage zum Logging AWT, Swing, JavaFX & SWT 6
E Prinzip: wie man Ereignisse in einer GUI verarbeit. Frage zum Design? AWT, Swing, JavaFX & SWT 10
ralfb1105 Swing Frage zu SwingWorker Verhalten bei cancel() AWT, Swing, JavaFX & SWT 2
J Frage zu setuserdata AWT, Swing, JavaFX & SWT 1
N Frage zu ListView AWT, Swing, JavaFX & SWT 11
L 2D-Grafik Frage zu Ellipse2D.Double, Abfrage, ob Punkt enthalten ist funktioniert nicht AWT, Swing, JavaFX & SWT 3
T Frage zu GUI - Button soll Objekt erfassen AWT, Swing, JavaFX & SWT 2
J Event Handling Frage zu der Funktion addActionListener AWT, Swing, JavaFX & SWT 2
J Frage zur objektorentierten Swing Programmierung AWT, Swing, JavaFX & SWT 10
T JavaFX Frage zum FX-Loader AWT, Swing, JavaFX & SWT 3
B drawRect Frage und Aufgabenstellung AWT, Swing, JavaFX & SWT 10
fLooojava GridLayout - Frage bezüglich Kachelgröße AWT, Swing, JavaFX & SWT 5
S Frage zu java.awt.EventQueue AWT, Swing, JavaFX & SWT 1
J Frage zu Java Projekt [2D Game] AWT, Swing, JavaFX & SWT 3
M Swing Grundlegende Frage zu SWING mit WindowBuilder AWT, Swing, JavaFX & SWT 11
M Frage zum Loggen von Fehlern AWT, Swing, JavaFX & SWT 3
T Swing API Frage zu Verzeichnisbäumen und JTree AWT, Swing, JavaFX & SWT 1
M Thread-Frage in SWT AWT, Swing, JavaFX & SWT 1
Q Cursor Frage AWT, Swing, JavaFX & SWT 8
W JavaFX TableView frage AWT, Swing, JavaFX & SWT 5
H Taschenrechnerprojekt in Javafx - Frage zu den Buttons in FXML AWT, Swing, JavaFX & SWT 1
I Grundsätzliche Frage zu ItemListener AWT, Swing, JavaFX & SWT 11
X Kurze Frage zu JPopup AWT, Swing, JavaFX & SWT 3
D Swing [Frage] ComboBox + Label AWT, Swing, JavaFX & SWT 3
D Frage zu JFrame und Graphics AWT, Swing, JavaFX & SWT 4
J Swing Frage zur Vorgehensweise (JTable?, JLabels?) AWT, Swing, JavaFX & SWT 8
S Frage zu Jtable / CellEditor AWT, Swing, JavaFX & SWT 1
kaoZ Frage zum einfügen von Componenten AWT, Swing, JavaFX & SWT 14
N Swing JTable anfänger frage AWT, Swing, JavaFX & SWT 2
S GridBagLayout-Frage AWT, Swing, JavaFX & SWT 1
V 2D-Grafik Frage zum Graphics Objekt AWT, Swing, JavaFX & SWT 2
F Swing JComboBox - Frage zur Größe AWT, Swing, JavaFX & SWT 11
G noch eine Frage zum EventDispachThread AWT, Swing, JavaFX & SWT 4
D MVC Frage AWT, Swing, JavaFX & SWT 6
Z Flackern trotz Offscreen Image / Doublebuffer, (+ Frage zu Pixelvergleich) AWT, Swing, JavaFX & SWT 25
GianaSisters 2D-Grafik BufferedImage.getSubimage - Frage AWT, Swing, JavaFX & SWT 7
M Frage zu KeyListener bzgl. JApplet AWT, Swing, JavaFX & SWT 3
M Frage zu Threads AWT, Swing, JavaFX & SWT 3
N Swing JComboBox Frage AWT, Swing, JavaFX & SWT 5
Luk10 g.drawString funktioniert nicht + Frage zur Text-Rendering Qualität AWT, Swing, JavaFX & SWT 7
Luk10 Frage zu Farb-Komposition AWT, Swing, JavaFX & SWT 9
K Gui Layout Frage AWT, Swing, JavaFX & SWT 5
V SWT Import Wizard - frage zur WizardPage AWT, Swing, JavaFX & SWT 5
N Swing Frage JXMapviewer AWT, Swing, JavaFX & SWT 4
GUI-Programmer Wieder ne Layout Frage AWT, Swing, JavaFX & SWT 11
GUI-Programmer LayoutManager Kurze Layout Frage - eine komponente mittig? AWT, Swing, JavaFX & SWT 5
H Frage zu übergebenem Vector bzw. Boolean AWT, Swing, JavaFX & SWT 3
C 2D-Grafik BufferedImage laden, Frage zum Code AWT, Swing, JavaFX & SWT 2
VfL_Freak Swing Frage zu "new JPasswordField( 10 )" AWT, Swing, JavaFX & SWT 6
H Frage zu WindowBuilder Pro AWT, Swing, JavaFX & SWT 3
C Frage/Problem mit Jpanel AWT, Swing, JavaFX & SWT 4
S Frage zu TextArea AWT, Swing, JavaFX & SWT 2
GUI-Programmer Zeichnen in Swing - Frage AWT, Swing, JavaFX & SWT 6
Luk10 Frage zu Mouseevents AWT, Swing, JavaFX & SWT 7
J Refreshing Swing Frage AWT, Swing, JavaFX & SWT 10
F Frage zu Event KeyTyped bei jPanel AWT, Swing, JavaFX & SWT 4
A Frage zu StringBuilder AWT, Swing, JavaFX & SWT 2
A Frage zu JDialog AWT, Swing, JavaFX & SWT 3
A Frage zur Methode matches() AWT, Swing, JavaFX & SWT 2
P LayoutManager Verständnis-Frage GridBagLayout AWT, Swing, JavaFX & SWT 7
H Allgemeine Frage zu Grafikfähigkeiten von Java AWT, Swing, JavaFX & SWT 24
D Repaint Frage, Design Frage AWT, Swing, JavaFX & SWT 2
Jats Frage zu JLabel & JTextField AWT, Swing, JavaFX & SWT 4
Y frage zu BufferedImage AWT, Swing, JavaFX & SWT 7
hdi Swing Frage zu invokeAndWait() Exceptions AWT, Swing, JavaFX & SWT 8
P Swing Frage zu paintComponent/getGraphics AWT, Swing, JavaFX & SWT 4
M Frage nach Swing Element AWT, Swing, JavaFX & SWT 3
S Frage zu Graphics2D AWT, Swing, JavaFX & SWT 3
T AWT Frage zu AWT AWT, Swing, JavaFX & SWT 5
B Frage zu Swing,Threads, SwingWorker und Socket Communikation AWT, Swing, JavaFX & SWT 4
F unspezifizierte Frage zu JTable/ Model AWT, Swing, JavaFX & SWT 6
B SWT Frage zu MVC und Data-Binding AWT, Swing, JavaFX & SWT 8
T LookAndFeel Look and Feel Frage AWT, Swing, JavaFX & SWT 2
J Java2D Kreis/Kurven Frage AWT, Swing, JavaFX & SWT 2
P Kurze Frage zur Gestaltung eines vertikalen Menüs AWT, Swing, JavaFX & SWT 2
Dit_ Frage zum Thema SwingUtilities.invokeLater AWT, Swing, JavaFX & SWT 5
Eldorado Frage zur Anwendung des MVC-Konzept AWT, Swing, JavaFX & SWT 33
G Frage zu processMouseEvent AWT, Swing, JavaFX & SWT 6
M Zoomen in ein JPanel... und eine andere kleine Frage AWT, Swing, JavaFX & SWT 3
D Swing implementierungs-technische Frage zu JList/AbstractListModel AWT, Swing, JavaFX & SWT 7
C Event Frage AWT, Swing, JavaFX & SWT 7
A Frage zu GridLayout AWT, Swing, JavaFX & SWT 4
F Frage zu WindowListeners AWT, Swing, JavaFX & SWT 2
E einfache Frage:warum ist Hintergrund grau ? AWT, Swing, JavaFX & SWT 24
E einfache Frage zu paintComponent und Graphics AWT, Swing, JavaFX & SWT 7
C Frage zu ActionListenern AWT, Swing, JavaFX & SWT 7
D Frage @ someActionEvent.getActionCommand() AWT, Swing, JavaFX & SWT 2
Kr0e Allgemeine Frage zu Java2D (Eigene Impl.) AWT, Swing, JavaFX & SWT 18

Ähnliche Java Themen

Neue Themen


Oben