JavaFX Von welcher Klasse und zu welchem Zeitpunkt werden Event-Objekte erstellt?

B

BigMemo007

Aktives Mitglied
Hallo Community,

ich habe mal da eine blöde Frage. Ich habe folgenden einfachen Code:

Java:
public class MeinMausBewegtEvent extends Application {
    @Override
    public void start(Stage primaryStage) {
        Circle kreis = new Circle(30);
        Group gruppe = new Group();
        Scene sc = new Scene(gruppe);
        
        sc.setOnMouseMoved(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent event) {
                kreis.setCenterX(event.getX());
                kreis.setCenterY(event.getY());
            }
        });
        
        gruppe.getChildren().add(kreis);
        primaryStage.setScene(sc);
        primaryStage.show();
    }
    
    public static void main(String[] args) {
        launch(args);
    }
}


Hier wird ein Kreis mit einem Radius von 30 erstellt. Dieser wird in eine Group und die Group in die Scene eingepakkt. Die Scene regiert mit setOnMouseMoved auf Mausbewegungen, in dem es auf MouseEvent-Daten zurückgreift. Der Kreis folgt der Mausbewegung innerhalb der Scene. Soweit so gut. Das Programm funktioniert. Ich habe da nur eine kleine Verständnisfrage. Mit dem Aufruf der Scene-Funktion setOnMouseMoved wird eine anonyme Klasse erstellt, die das Interface EventHandler implementiert und mit MouseEvent parametisiert ist. Welche Klasse erstellt das MouseEvent-Objekt? Ich sehe nirgendswo den Aufruf von "new MouseEvent()".
Auch wenn ich eine eigene Klasse mache wie folgt:

Java:
public class MyEventHandler implements EventHandler<RotateEvent>{

    Circle c;
    
    public MyEventHandler(Circle c) {
        this.c = c;
    }
    
    @Override
    public void handle(MouseEvent event) {
        c.setCenterX(event.getX());
        c.setCenterY(event.getY());

    }
}

Das funktioniert auch. Aber auch hier wird nirgendswo "new MouseEvent" gemacht. Ich habe etwas ganz banales nicht verstanden oder vergessen. Bitte helft mir gerade die Funktionsweise richtig zu verstehen.
 
H

httpdigest

Top Contributor
Die JavaFX-Laufzeitumgebung erstellt solche Eventobjekte. Es wird das Betriebssystem nach solchen Ereignissen für das native Fenster gefragt, dann wird geguckt, welches JavaFX-Element sich an dieser Position befindet und dann wird ein EventObjekt gebaut und die EventHandler-Methode "handle" aufgerufen.
Die JavaFX-Laufzeit bzw. die Scene weiss ja von deinem EventHandler durch deinen Aufruf von setOnMouseMoved() auf der Scene. Und dementsprechend holt sich die JavaFX-Laufzeitumgebung dann diesen EventHandler von der Scene und ruft seine "handle"-Methode mit einem MouseEvent-Objekt auf, was dann dazu führt, dass deine Methode in deinem EventHandler ausgeführt wird.
 
B

BigMemo007

Aktives Mitglied
Woww cool was die JavaFX-Laufzeitumgebung für einen alles macht :) Danke für die Aufklärung. Jetzt hab ich ein besseres Gesamtbild von der Sache.
 
mihe7

mihe7

Top Contributor
ich habe mal da eine blöde Frage.
Tatsächlich ist das die Frage, deren Antwort den essentiellen Kern der Java-UI-Programmierung erklärt :)

Die Ereignisse werden nämlich nicht zu beliebigen Zeitpunkten (z. B. parallel) verteilt, sondern der Reihe nach. Dazu werden sie in eine Warteschlange eingereiht und der Reihe nach abgearbeitet. Letzteres passiert in einem eigenen Thread, dem sog. UI-Thread (unter AWT/Swing passenderweise auch Event Dispatch Thread genannt).

Warum macht man das und was hat das für Konsequenzen?

Das UI läuft auf diese Weise Java-seitig praktisch in einem einzigen Thread. Das hat den Vorteil, dass man sich nicht um eine Koordination von Threads kümmern muss.

Wenn Du Deine handle-Methode ansiehst, setzt Du dort erst die x-Koordinate, dann die y-Koordinate. Was passiert z. B., wenn sich nach dem Setzen der x-Koordinate das Betriebssystem überlegt, dass das Fenster neu gezeichnet werden muss?

Würde keine Warteschlange verwendet und auch keine Thread-Synchronisation stattfinden, würde das Fenster sofort neu gezeichnet, so dass der Kreis kurzzeitig falsch dargestellt würde (die x-Koordinate ist bereits aktualisiert, die y-Koordinate aber noch nicht). Je nach Programmlogik kann so etwas zu ganz üblen Effekten führen. Kurz: es würde das Chaos ausbrechen.

Durch die Warteschlange wird alles sehr einfach: das Neuzeichnen-Erignis wird in die Warteschlange eingereiht, so dass Deine handle-Methode erst vollständig abgearbeitet wird. Danach wird das nächste Ereignis aus der Warteschlange verarbeitet usw. Irgendwann ist dann auch das zuvor eingereihte Neuzeichnen-Ereignis an der Reihe.

Das hat zur Folge, dass Änderungen am UI erst sichtbar werden können, wenn die handle-Methode vollständig abgearbeitet wurde. Daraus folgt wiederum, dass z. B. Animationen nicht einfach mit einer Schleife in der handle-Methode möglich sind oder dass die Reaktionszeit des UI davon abhängig ist, wie lange die Verarbeitung des Ereignisses im UI-Thread dauert. Wartest Du in Deiner handle-Methode z. B. 10 Sekunden, wird das UI eben 10 Sekunden lang nicht reagieren, weil die Ereignisse, die in der Warteschlange stehen, nicht abgearbeitet werden können.

Die Lösung solcher Probleme besteht darin, derlei Aufgaben in einem anderen Thread zu erledigen und dafür zu sorgen, dass Änderungen am UI wiederum nur im UI-Thread ausgeführt, also in die Warteschlange eingereiht werden. Letzteres erreicht man "low-level" mittels Platform.runLater. Auch stellen die verschiedenen Frameworks z. T. ausgefeilte Lösungen zur Verfügung, die sich darum kümmern. Für JavaFX gibt es wohl Task und Service (s. https://docs.oracle.com/javase/8/javafx/interoperability-tutorial/concurrency.htm), für Swing dagegen den SwingWorker. Bzgl. Animationen kann man in JavaFX auf Timeline zurückgreifen, unter Swing muss man den (Swing-)Timer bemühen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
dereki2000 Welcher Methodenaufruf bei Hover, click,... AWT, Swing, JavaFX & SWT 5
J JavaFX von einem Array aus Buttons herausfinden auf welcher geklickt wurde aus dem Array. AWT, Swing, JavaFX & SWT 1
Z Swing Welcher Layoutmanager bei ScrollPane? AWT, Swing, JavaFX & SWT 4
N Welcher LayoutManager AWT, Swing, JavaFX & SWT 16
G Welcher Teil der Java Standard Edition API ist für das Zeichnen von einfachen Grafiken gedacht? AWT, Swing, JavaFX & SWT 3
SexyPenny90 Welcher LayoutManager erfüllt meine Bedingung AWT, Swing, JavaFX & SWT 7
S LayoutManager Welcher LayoutManager für dieses zweispaltige Layout? AWT, Swing, JavaFX & SWT 13
P LayoutManager welcher LM ist der richtige? AWT, Swing, JavaFX & SWT 3
A Welcher Layout Manager ist hier richtig? AWT, Swing, JavaFX & SWT 3
S LayoutManager Welcher Manager AWT, Swing, JavaFX & SWT 2
R KeyListener - welcher Komponente hinzufügen AWT, Swing, JavaFX & SWT 5
S Swing DnD: Wie finde ich heraus, von welcher Zelle aus im JTable der Drag gestartet wurde? AWT, Swing, JavaFX & SWT 3
M Swing Bild wird nie angezeigt, egal mit welcher Methode! AWT, Swing, JavaFX & SWT 10
C Abfragen welcher Tab aktiv ist? AWT, Swing, JavaFX & SWT 2
V Welcher Listener für JTable? AWT, Swing, JavaFX & SWT 3
A JToolBar: Welcher Button wurde gedrückt? AWT, Swing, JavaFX & SWT 5
G welcher Jtogglebutton geklickt? AWT, Swing, JavaFX & SWT 3
S Welcher Listener ? In JTable mehrere Zeilen markieren & AWT, Swing, JavaFX & SWT 2
J jTable, welcher listener für Änderung der Spaltenbreite AWT, Swing, JavaFX & SWT 2
M Welcher Listener für JLabel? AWT, Swing, JavaFX & SWT 4
M Welcher Layout Manager? AWT, Swing, JavaFX & SWT 5
M Ein Chatfenster mit Emoticons etc.mit welcher Komponente? AWT, Swing, JavaFX & SWT 10
T JTextArea, in welcher Zeile befindet sich der Cursor AWT, Swing, JavaFX & SWT 25
J Welcher Layoutmanager? AWT, Swing, JavaFX & SWT 20
Monokuma KeyEvent in der Canvas Klasse AWT, Swing, JavaFX & SWT 0
B Was würden Profis an meiner Klasse verbessern? AWT, Swing, JavaFX & SWT 1
B JavaFX Verständnisfrage EventHandler<ActionEvent> Implementierung in meiner Klasse AWT, Swing, JavaFX & SWT 2
B JavaFX Farbe eines Quadrates in einer separaten Klasse ändern AWT, Swing, JavaFX & SWT 4
S Stream API, Anonyme Klasse AWT, Swing, JavaFX & SWT 8
N Aufruf einer anderen Klasse durch Button ActionListener AWT, Swing, JavaFX & SWT 2
F jTree und das Model aus einer eigenen Klasse AWT, Swing, JavaFX & SWT 1
F Jtree aus Klasse mit Arraylisten AWT, Swing, JavaFX & SWT 1
L Javafx Controller Klasse in Maven AWT, Swing, JavaFX & SWT 7
karlmasutra JavaFX Zugriff auf eine erzeugte Scene aus einer anderen Klasse AWT, Swing, JavaFX & SWT 1
J Bild von anderer Klasse will nicht laden AWT, Swing, JavaFX & SWT 1
L CardLayout in einer Klasse? AWT, Swing, JavaFX & SWT 2
L Java- UI zweites Fenster aus einer anderen Klasse öffnen durch ButtonClick AWT, Swing, JavaFX & SWT 4
ralfb1105 Swing Ausführung einer SwingWorker Klasse stoppen AWT, Swing, JavaFX & SWT 4
xYurisha JLabel Text einer geöffneten Gui über eine andere Klasse ändern! AWT, Swing, JavaFX & SWT 3
J 2D-Grafik Background einer Jpanel Klasse ändern AWT, Swing, JavaFX & SWT 1
J JFram Location aus Konstruktor einer anderen Klasse auslesen AWT, Swing, JavaFX & SWT 10
J 2D-Grafik Background Image Klasse AWT, Swing, JavaFX & SWT 14
K Frame aus anderer Klasse schließen AWT, Swing, JavaFX & SWT 3
M Eigene Klasse mit Grafikobjekten schreiben AWT, Swing, JavaFX & SWT 4
0 Swing JTable aus anderer Klasse updaten AWT, Swing, JavaFX & SWT 5
it_is_all Event Handling ActionListener in anderer Klasse klappt nicht AWT, Swing, JavaFX & SWT 4
L JavaFX button über andere Klasse ändern AWT, Swing, JavaFX & SWT 7
K über Button andere Java Klasse aufrufen AWT, Swing, JavaFX & SWT 15
C Nach Aufruf von anderer Klasse streikt Grafik AWT, Swing, JavaFX & SWT 1
S per Button Variableninhalt aus anderer Klasse holen AWT, Swing, JavaFX & SWT 3
F AWT Robot Klasse Screenshot nach Pixelmustern in bestimmten Radius um Bildschirmmittelpunkt absuchen AWT, Swing, JavaFX & SWT 13
K JButton auf anderer Klasse AWT, Swing, JavaFX & SWT 6
R Update eines Labels bei Methodenaufruf einer anderen Klasse AWT, Swing, JavaFX & SWT 9
Java_RY AWT Frame in eine eigene klasse auslagern und aufrufen AWT, Swing, JavaFX & SWT 6
L JavaFX Verbindung zwischen Beschreibung und Listener (Codebehind Klasse) AWT, Swing, JavaFX & SWT 4
J JTextfield automatisch aus zweiter Klasse aktualisieren AWT, Swing, JavaFX & SWT 5
J JavaFX Tableview Daten hinzufügen aus anderer Klasse AWT, Swing, JavaFX & SWT 7
Ghostman1711 GUI Java von Klasse mit Application Windows anderes Application Window aufrufen AWT, Swing, JavaFX & SWT 6
K JTable in extra Klasse, Zugriff in einer anderen klasse nicht möglich AWT, Swing, JavaFX & SWT 26
D JavaFX Probleme bei Service-Klasse beim ändern der GUI AWT, Swing, JavaFX & SWT 8
T Klasse über JButton schließen AWT, Swing, JavaFX & SWT 4
N JavaFX Erweitern der Line(Shape)-Klasse AWT, Swing, JavaFX & SWT 1
T Durch klicken eines Buttons Klasse wechseln AWT, Swing, JavaFX & SWT 2
7 JavaFX Verwendung einer ResizableCanvas-Klasse in fxml-Datei AWT, Swing, JavaFX & SWT 3
A JavaFX Von Klasse auf Controller Inhalt zugreifen AWT, Swing, JavaFX & SWT 9
L Swing Teile eines JPanel in eigene Klasse auslagern AWT, Swing, JavaFX & SWT 3
J Eigene Klasse auf Basis Textfield in SceneBuilder anzeigen AWT, Swing, JavaFX & SWT 4
B Swing Auf JList-Elemente aus einer anderen Klasse zugreifen AWT, Swing, JavaFX & SWT 1
J JavaFX Mehrfache Benutzung von Methoden einer Klasse AWT, Swing, JavaFX & SWT 17
B Jlabel Text von anderen Klasse aus ändern AWT, Swing, JavaFX & SWT 9
stylegangsta Eigene Klasse für JButton aus dem JFrame abrufen AWT, Swing, JavaFX & SWT 29
N JavaFX GUI Elemente einer anderen (FXML)Klasse ansprechen AWT, Swing, JavaFX & SWT 16
O JTabeddpane aber jedes JPanel als eigene Klasse anlegen AWT, Swing, JavaFX & SWT 7
B Swing GUI in einer anderen Klasse aufrufen AWT, Swing, JavaFX & SWT 4
B Klasse mit ArrayList AWT, Swing, JavaFX & SWT 1
G Event Handling Event Handling in eigene Klasse AWT, Swing, JavaFX & SWT 4
W Paint-Methode in anderer Klasse funktioniert nicht AWT, Swing, JavaFX & SWT 7
L JavaFX Verständnisfrage zu JavaFX FXML und Controller-Klasse AWT, Swing, JavaFX & SWT 1
T Generische Klasse in JList über DefaultListModel AWT, Swing, JavaFX & SWT 1
D Event Handling Aus einer anderen Klasse heraus einen Text des JLabels ändern. AWT, Swing, JavaFX & SWT 12
F Instanzierung einer inneren Klasse in Klasse eines anderen Packets AWT, Swing, JavaFX & SWT 3
C JavaFX Zugriff auf TextField aus einer anderen Klasse AWT, Swing, JavaFX & SWT 4
A JavaFX Scene Builder eigene Klasse hinzufügen AWT, Swing, JavaFX & SWT 2
S 2 Paint-Methoden in einer Klasse ? AWT, Swing, JavaFX & SWT 2
H JavaFX Controller Klasse splitten? AWT, Swing, JavaFX & SWT 16
S JComboBox aus anderer Klasse füllen (Java-Swing) AWT, Swing, JavaFX & SWT 0
S ActionListener Klasse aufrufen AWT, Swing, JavaFX & SWT 4
M Swing JTextField getText Mehtode übergeben in eine Klasse zu einer Rechnung AWT, Swing, JavaFX & SWT 1
M Panel in geerbter JFrame Klasse adden AWT, Swing, JavaFX & SWT 4
F JavaFX Zugriff auf Controller Methode von einer normalen Klasse aus AWT, Swing, JavaFX & SWT 4
D AWT Das ganze GUI in eine Klasse? AWT, Swing, JavaFX & SWT 1
C JavaFX Klasse wird nicht als public erkannt AWT, Swing, JavaFX & SWT 6
J zwei Paint methoden in einer Klasse AWT, Swing, JavaFX & SWT 3
V kann ich in einer Klasse stage und scene deklarieren, aber in anderen Klassen Inhalte hinzufügen ? AWT, Swing, JavaFX & SWT 5
V JavaFX, Pane construktor von einer Klasse in der Main verwenden. AWT, Swing, JavaFX & SWT 4
S 2 paint-Methoden in einer Klasse ? AWT, Swing, JavaFX & SWT 2
W JavaFX Label in Controller-Klasse in einer anderen Controller-Klasse ändern AWT, Swing, JavaFX & SWT 9
X buttons aus externe klasse lesen? AWT, Swing, JavaFX & SWT 3
H Swing JTable- Meine Tabelle der Klasse JTable wird nur bedingt angezeigt AWT, Swing, JavaFX & SWT 4
M Gui in einer anderen Java Klasse aufrufen AWT, Swing, JavaFX & SWT 1

Ähnliche Java Themen

Anzeige

Neue Themen


Oben