AWT/SWING intern - Wie funktioniert die Component-Ermittlung

Status
Nicht offen für weitere Antworten.

kdot

Mitglied
Hallo an alle,

mich würde interessieren, wie genau es funktioniert, dass ein, sagen wir mal MouseEvent (Click/Enter/Exit/...) auch von der korrekten Componente ausgelöst wird?

Konkreter: Wenn ich auf einen Button oder eine beliebige andere Komponente einer GUI klicke, wie ermittelt AWT dann die genaue Komponente? Meine erste idee wäre, alle Komponenten sind irgendwo registriert(auf einem Panel oder Frame z.b.) und wenn ein Klick durchgeführt oder die Maus bewegt wird, werden stets sämtliche registrierte Komponenten durchlaufen, deren sichtbare Bereiche abgefragt und letztendlich geprüft, ob sich die Maus gerade in einer Komponente befindet. sollte dies der Fall sein, wird ggf. der passende Actionlistener aufgerufen und der enthaltene Code ausgeführt.

IMHO ist dies eine recht rechenintensive Sache und würde bedeuten, dass eine GUI immer langsamer werden würde, je mehr Komponenten und Listener es auf ihr gibt.

Ich weiß bereits, dass seit java 1.1 nur diejenigen Komponenten geprüft werden, die einen Actionlistener besitzen.

Tortzdem wäre das noch sehr aufwändig, wenn man immer alle (lauschenden) Komponenten prüfen würde.

Vereinfachungen, wie sortierte Listen und entsprechend optimierte suchalgorithmen, fallen mir viele ein(zwei sortierte listen in denen je alle komponenten enthalten sind, einmal nach x- und zum anderen nach y-position sortiert, danach quicksearch auf beiden listen oder binäre suche etc. pp.)

Welche Technik setzt AWT/SWING nun aber konkret ein?

für Informationen wäre ich enorm dankbar :)

kdot
 

Ebenius

Top Contributor
Das hängt vom Event-Typ ab. Bei einem MouseEvent beispielsweise funktioniert's so, dass jedes Window einen LightWeightDispatcher hat. Dieser LightWeightDispatcher bekommt den MouseEvent, Fragt das Window, welche Komponente an diesen Koordinaten liegt.

Das Window (ist ja ein Container) geht die Liste seiner Kinder durch und schaut, ob es ein Kind gibt, welches da liegt und dargestellt wird und fragt dann dieses Kind (sofern es ein Container ist), ob es ein Kind hat das an dieser Stelle liegt. Und so weiter.

Bei einem KeyEvent ist's anders. Da gibt es einen FocusManager, der immer die Komponente mit dem Focus kennt.

Ein ActionEvent ist wieder anders. Der ist ein HighLevel-Event und wird ausgelöst durch andere Ereignisse; wie zum Beispiel einen MouseEvent oder einen KeyEvent.

Source-Code, den Du Dir dazu anschauen kannst:
  • java.awt.LightweightDispatcher.dispatchEvent(AWTEvent e)
  • java.awt.LightweightDispatcher.processMouseEvent(MouseEvent e)
  • java.awt.Container.getMouseEventTarget(int x, int y, boolean includeSelf)

Die GUI wird mit mehr Komponenten natürlich langsamer. Die Anzahl der Listeners hat nicht so viel Auswirkung; dann eher die Komplexität der Listeners.

Hilft das soweit?

Ebenius
 

kdot

Mitglied
Hallo Ebenius,

vielen Dank für die schnelle Antwort.

Ebenius hat gesagt.:
....... Fragt das Window, welche Komponente an diesen Koordinaten liegt.
..............
Das Window (ist ja ein Container) geht die Liste seiner Kinder durch und schaut, ob es ein Kind gibt, welches da liegt und dargestellt wird ...

wie genau wird "geschaut" ? werden die Kinder tatsächlich stur nacheinander durchsucht und befragt, ob sich die aktuellen Mauskoordinaten im zeichenbereich befinden oder gibt es eine spezielle Datenstruktur, die eine schnellere Suche ermöglicht als o(n) ?

An dieser Stelle könnte ich mir eben, wie gesagt, diverse optimierungen vorstellen (Quicksearch, Quicksearch auf sortierten Listen etc.).

mir geht es im Übrigen um MouseEvents :)

ps.: wo kann ich die quellen des lightweightdispatchers finden? die des Containers befand sich im zip-file welches ich von der sun seite laden konnte...nur der dispatcher entzieht sich noch meinen suchbemühungen...
 

Marco13

Top Contributor
Nur aus Neugier: Ist das eine rein akademische Frage, oder hat das einen anderen Anlass? Es dauert zwar O(n), alle Components durchzugehen (auf einer Ebene - rein von der Struktur her ist das ja schon eine Bounding Volume Hierarchy :D ) aber ... Lass' mal 1000 Components in einem Container liegen - wie viele MIKROsekunden dauert es, mal 1000 bounds zu testen, um zu sehen, wo der Mauszeiger gerade drin liegt?....
 

Ebenius

Top Contributor
kdot hat gesagt.:
wie genau wird "geschaut" ? werden die Kinder tatsächlich stur nacheinander durchsucht und befragt [...]
Das ist doch ohnehin eine Baumsuche. So wesentliche Geschwindigkeitsvorteile wird man da mit "optimierte[n] suchalgorithme[n]" kaum rausholen. Und ich hatte bisher keine Performance-Probleme die ich auf zu langsames Event-Verteilen zurückführen würde. Du?

kdot hat gesagt.:
ps.: wo kann ich die quellen des lightweightdispatchers finden? die des Containers befand sich im zip-file welches ich von der sun seite laden konnte...nur der dispatcher entzieht sich noch meinen suchbemühungen...
Der LightWeightDispatcher ist eine package-sichtbare Klasse in java.awt und befindet sich in Container.java

Benutzt Du kein Eclipse? In Eclipse einfach CTRL+T und dann "LWD" eingeben. :)

Gruß, Ebenius
 

kdot

Mitglied
@marco13 es ist keine rein akademische frage ;)

ich entwickle gerade eine GUI für eine Industrierobotersteuerung. dazu hab ich eine eigene sprache entwickelt, als höhere abstraktion der doch arg userunfreundlichen maschinensprachen, die es in dem bereich so gibt.

nun muss ich selbst eine art awt eventqueue bauen um Benutzereingaben abzufangen. da die maschinen nur begrenzte rechenleistung besitzen, will ich optimieren, wo es nur geht.

wieviele Millisekunden es für die 1000 komponenten braucht, hängt vom zugrundeliegenden Prozessor ab ;) ( mit O(n) wollte ich den satz "es es müssen genausoviele prüfungenn durchgeführt werden, wie es komponenten gibt" ein wenig abkürzen ;) - auch wenn es informatisch nicht korrekt war...)
 

kdot

Mitglied
@Ebenius

Nein, ich hatte auch keine Probleme bisher. jedenfalls nicht auf normalen PCs oder Macs. nur spielt es bei 33Mhz Prozessoren eine größere Rolle, aber davon konntest du ja nichts wissen ;)

nochmal danke für die ausführlichen Antworten und Kommentare

kdot
 

Ebenius

Top Contributor
kdot hat gesagt.:
"es es müssen genausoviele prüfungenn durchgeführt werden, wie es komponenten gibt"
Das entspricht ja eben nicht der Wahrheit. Ein Beispiel: Die Buchstaben A-F benennen Panels, G-M sind andere Komponenten:
Code:
--------------------------------------
|A         |B                |C      |
|          |                 |       |
|          |                 |       |
|------------------------------------|
|D         |E                |F      |
| -------- | --------------  | ----- |
| |G     | | |I           |  | |L  | |
| |      | | --------------  | ----- |
| |      | |                 |       |
| -------- | --------------  | ----- |
| |H     | | |K           |  | |M  | |
| -------- | --------------  | ----- |
|          |                 |       |
--------------------------------------

Angenommen Du klickst in Komponente K, dann werden die Komponenten G, H, L, M nie geprüft, da deren Parents D & F gar nicht die Mauskordinaten beinhalten.

← Anbei möchte ich auf meine Signatur hinweisen. :)

Ebenius
 

kdot

Mitglied
mittlerweile ist es mir klar ;)

also kann man die Abfragegeschwindigkeit erhöhen, indem man die Komponenten "effektiver" verschachtelt...was das ganze zu einer Probierarbeit macht. oder führt JAVA hier intern noch eine Optimierung zu Ladezeit der GUI durch?

angenommen, es gäbe nur den Container E und alle anderen Komponenten befänden sich innerhalb dieses Containers, so wird im ersten durchlauf erkannt, dass sich die maus in E befindet. Im darauffolgenden Schritt müssen jedoch alle enthaltenen komponenten geprüft werden. und in genau diesem Fall wären wir wieder am anfang der Diskussion angelangt ;)

Diesen Grenzfall muss ich abdecken und optimieren. (s. antwort zu marco13's Post)

wie kann ich den hinweis auf deine signatur hierbei verstehen? ich hab keine andere wahl, als "es" zu optimieren denn ansonsten ist meine oberfläche schlicht nicht nutzbar auf den langsamen kisten für die ich programmiere ;)
 

Ebenius

Top Contributor
Es gibt keine "Optimierung zur Ladezeit". Und die sollte auch nicht notwendig sein. An Deiner Stelle würde ich erst einmal den Ansatz übernehmen und die GUI so aufbauen wie es inhaltlich Sinn ergibt. Optimierung folgt später, und nur falls es unbedingt notwendig wird und Potential sichtbar ist. So ist auch meine Signatur gemeint.

Viel Erfolg!
Ebenius
 

kdot

Mitglied
alles klar :)

ich ziehe es vor, mögliche optimierungen gleich einzubauen, anstatt sie dann mühsam im nachhinein zu integrieren ;) aber das ist wohl geschmackssache

viel spaß noch :)

kdot
 

Tobias

Top Contributor
Damit verschaffst du dir eine Menge Arbeit, deren Wert bestenfalls zweifelhaft ist. Machen, messen, wenn nötig verbessern. Ansonsten fummelst du höchstwahrscheinlich nur an den falschen Stellen rum.
 

Ebenius

Top Contributor
Tobias hat gesagt.:
Damit verschaffst du dir eine Menge Arbeit, deren Wert bestenfalls zweifelhaft ist. Machen, messen, wenn nötig verbessern. Ansonsten fummelst du höchstwahrscheinlich nur an den falschen Stellen rum.

Da sind sich judäische Volksfront und Volksfront von Judäa einig. :)
 

André Uhres

Top Contributor
Wie macht sich denn der Optimierungsbedarf bemerkbar?
Reagiert die Maschine zu langsam, oder nur die GUI?
Wenn es nur die GUI ist, dann müssen wir den Malcode optimieren,
statt der Eventqueue. Oder schlimmstenfalls müssen wir beides tun.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Juelin javax.swing in javafx AWT, Swing, JavaFX & SWT 1
A Eclipse 2023 und Swing AWT, Swing, JavaFX & SWT 4
W 2 JTables in einem Swing-Fenster? AWT, Swing, JavaFX & SWT 5
H Swing Componente zur Läufzeit ändern AWT, Swing, JavaFX & SWT 3
B Actionlistener mit Java Swing AWT, Swing, JavaFX & SWT 2
W Gibt es einen "automatischen Listener" in Swing oder JTable oder der ATM-Klasse? AWT, Swing, JavaFX & SWT 14
H Swing Buttons erst nach Klick sichtbar AWT, Swing, JavaFX & SWT 13
ExceptionOfExpectation Anpassung von JKomponentengrößen (Swing) AWT, Swing, JavaFX & SWT 3
thor_norsk AWT SWING Aufgabe AWT, Swing, JavaFX & SWT 7
U Zwei Fragen zu eienr Swing Aufgabe AWT, Swing, JavaFX & SWT 2
M Swing Bilder in Swing anzeigen AWT, Swing, JavaFX & SWT 9
H Swing , GridLayout, Größenbestimmung der Komponenten im Layout AWT, Swing, JavaFX & SWT 8
H Simple Animation mit Swing AWT, Swing, JavaFX & SWT 2
Guybrush Threepwood Einfachste Möglichkeit zum Abspielen eines Videos in Swing AWT, Swing, JavaFX & SWT 4
A Swing ProgressBar über 2 parallel laufende Threads AWT, Swing, JavaFX & SWT 2
M Swing GridLayout AWT, Swing, JavaFX & SWT 2
O return-Statement mit Swing AWT, Swing, JavaFX & SWT 6
O Ein Java-Programm mit Swing steuern AWT, Swing, JavaFX & SWT 1
Monokuma Swing zu JavaFX AWT, Swing, JavaFX & SWT 5
J Swing Slider AWT, Swing, JavaFX & SWT 11
G Thread starten Swing AWT, Swing, JavaFX & SWT 5
G Swing JPasswordField AWT, Swing, JavaFX & SWT 12
L Swing Button Farbe ändern/wechseln AWT, Swing, JavaFX & SWT 2
C Swing AWT GUI Anfänger Aufgabe AWT, Swing, JavaFX & SWT 7
W Inject bei einem Swing Frontend AWT, Swing, JavaFX & SWT 8
L Kommunikation zwischen Klassen / Konstruktoren bei Swing AWT, Swing, JavaFX & SWT 9
M Feldvalidierung swing AWT, Swing, JavaFX & SWT 4
E Swing Componenten werden nach Änderung des display modes verzerrt dargestellt AWT, Swing, JavaFX & SWT 8
D [Swing] Anordnung von Komponenten mit GridLayout Manager AWT, Swing, JavaFX & SWT 13
O Zukunft von Swing und JavaFX ? AWT, Swing, JavaFX & SWT 3
S Swing Fenster State Machine AWT, Swing, JavaFX & SWT 1
T Swing Swing an Bildschirm anpassen AWT, Swing, JavaFX & SWT 3
S Swing Panel wird nicht neu gezeichnet AWT, Swing, JavaFX & SWT 3
M Swing Java Swing/AWT Combobox Bug AWT, Swing, JavaFX & SWT 3
M Swing GUI mittels erben sowie variabler Dateninhalt AWT, Swing, JavaFX & SWT 1
W Swing Multitouch mit Swing AWT, Swing, JavaFX & SWT 6
S Swing-Applikation die ein Numpad nachbildet samt Keybindings..? AWT, Swing, JavaFX & SWT 5
S Swing Java Swing AWT, Swing, JavaFX & SWT 6
Blender3D Problem mit € Symbol Font Gotham Windows 10 Swing AWT, Swing, JavaFX & SWT 11
J Swing oder JavaFX AWT, Swing, JavaFX & SWT 21
D Swing Anwendung ohne JPanel erstellen AWT, Swing, JavaFX & SWT 1
D SQL Statements mit Java Swing benutzen AWT, Swing, JavaFX & SWT 4
Damtonix BufferStrategy flackert (Swing) AWT, Swing, JavaFX & SWT 9
D DatePicker für Java Swing AWT, Swing, JavaFX & SWT 2
B JavaFX oder swing AWT, Swing, JavaFX & SWT 3
T Java Swing - kleines Rechteck unter dem cursor AWT, Swing, JavaFX & SWT 5
L 2D-Grafik Swing paint|paintComponent AWT, Swing, JavaFX & SWT 2
L Swing Größe automatisch anpassen AWT, Swing, JavaFX & SWT 14
G Swing Swing Binding JList funktioniert nicht AWT, Swing, JavaFX & SWT 5
Blender3D Meine Swing Anwendung läuft unter Windows 10 und Ubuntu aber nicht auf Windows 7 AWT, Swing, JavaFX & SWT 16
B Bar Plot in Swing JPanel AWT, Swing, JavaFX & SWT 0
D Swing in Kombination mit JGraphX und JGraphT AWT, Swing, JavaFX & SWT 0
F main-Funktion bei Swing AWT, Swing, JavaFX & SWT 4
S Java Swing Print() method AWT, Swing, JavaFX & SWT 4
S Java Swing auf Windows Phone AWT, Swing, JavaFX & SWT 6
I JAVAFX - Übergabe der Inhalte an eine Scene - Wo ist der Vorteil gegenüber Swing? AWT, Swing, JavaFX & SWT 2
S Manuelles Menu in Swing AWT, Swing, JavaFX & SWT 3
T Custom Window ohne Swing / AWT / FX..?! AWT, Swing, JavaFX & SWT 1
MaxG. Swing Swing Komponenten zur Laufzeit hinzufügen AWT, Swing, JavaFX & SWT 2
Java_RY Bin Ratlos bzgl Malen in Swing AWT, Swing, JavaFX & SWT 5
offi Swing Shuttle List AWT, Swing, JavaFX & SWT 9
I Graph mit Swing zeichnen AWT, Swing, JavaFX & SWT 8
D Swing Swing Objekte sehen im Entwurf anders aus als beim Ausführen AWT, Swing, JavaFX & SWT 3
S Swing & Clean und build Problem AWT, Swing, JavaFX & SWT 12
javampir Swing repaint in JavaFX Anwendung AWT, Swing, JavaFX & SWT 3
K Mit JavaFX angefangen. Lohnt sich Swing? AWT, Swing, JavaFX & SWT 28
B Swing Update Swing Komponente bevor Methode startet. AWT, Swing, JavaFX & SWT 4
B Swing Tabelle(JTable) filtern swing GUI AWT, Swing, JavaFX & SWT 3
M Swing Swing-Widgets und paintComponent() AWT, Swing, JavaFX & SWT 2
B Swing WindowBuilde: Menu -> anderes Panel wechseln AWT, Swing, JavaFX & SWT 1
K eigener button in swing AWT, Swing, JavaFX & SWT 3
A JavaFX DatePicker in Swing beim Start nicht sichtbar AWT, Swing, JavaFX & SWT 2
windl Bufferstrategy in Swing nachstellen AWT, Swing, JavaFX & SWT 0
M Kamera in Java Swing einbinden AWT, Swing, JavaFX & SWT 4
Z Swing Swing und die Progressbar AWT, Swing, JavaFX & SWT 1
J Frage zur objektorentierten Swing Programmierung AWT, Swing, JavaFX & SWT 10
Xanny 2D-Grafik Beginner! Probleme mit Swing, Gprahics class und paint AWT, Swing, JavaFX & SWT 13
F Java Swing Rechteck in JPanel zeichnen AWT, Swing, JavaFX & SWT 7
N Swing Benötige Hilfe um ein Swing Canvas zu speichern AWT, Swing, JavaFX & SWT 4
stylegangsta JButton Fehelr javax.swing.ImageIcon.<init>(Unknown Source) AWT, Swing, JavaFX & SWT 24
RalleYTN Swing JavaFX VideoPlayer in Swing einbetten. Ich komm nicht an die Dimension des Videos! AWT, Swing, JavaFX & SWT 0
T swing läuft nur beding flüssig AWT, Swing, JavaFX & SWT 1
A Sonderzeichen bei Swing AWT, Swing, JavaFX & SWT 3
L DoubleBuffering unter Swing AWT, Swing, JavaFX & SWT 0
N Programm mit Swing und Thread, Figur bewegen sich nicht AWT, Swing, JavaFX & SWT 6
D Java Swing, Label lässt sich nicht mit Checkboxen/Knopf verändern AWT, Swing, JavaFX & SWT 2
J Swing Basics - JButton funktioniert nicht. AWT, Swing, JavaFX & SWT 1
J Swing/AWT | Dynamisch erzeugte Objekte ansprechen AWT, Swing, JavaFX & SWT 1
N JavaFX Umstieg von Swing auf Java FX AWT, Swing, JavaFX & SWT 6
J GUI Anfänger einfaches Program AWT, Swing, JavaFX & SWT AWT, Swing, JavaFX & SWT 3
M Swing Grundlegende Frage zu SWING mit WindowBuilder AWT, Swing, JavaFX & SWT 11
M Plugin oder eigenes Tool mit zB SWING AWT, Swing, JavaFX & SWT 2
Z Java-Swing : JComponent AWT, Swing, JavaFX & SWT 2
Z Swing Swing: Elemente werden doppel/verschoben gezeichnet, sind teils unsichtbar etc... AWT, Swing, JavaFX & SWT 10
S JComboBox aus anderer Klasse füllen (Java-Swing) AWT, Swing, JavaFX & SWT 0
N JComboBox in JTable [Swing] -> totaler UI-Einsteiger AWT, Swing, JavaFX & SWT 3
T Swing Kompatibilitätsproblem zwischen Swing und JavaFX AWT, Swing, JavaFX & SWT 4
M Layout-Probleme unter Swing AWT, Swing, JavaFX & SWT 5
T Swing / Kreis zeichnen AWT, Swing, JavaFX & SWT 2
S (Swing)Vollbild anzeigen unter Linux/Mac AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben