Wie zu hören WindowEvent.WINDOW_SHOWN in den Knoten des Szenengraphen?
Scheint es WindowEvent.WINDOW_SHOWN wird nie ausgelöst, auf einen der Knoten im Szene graph, noch ist es sowieso (die ich finden konnte) zu wissen, Wann ein Knoten sichtbar/gerendert/dargestellt. Zum Beispiel:
TestLauncher.java
package com.example.javafx.event;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class TestLauncher extends Application
{
public static void main(String[] args)
{
Application.launch(TestLauncher.class, args);
}
@Override
public void start(Stage stage) throws Exception
{
Parent root = FXMLLoader.load(TestController.class.getResource("TestView.fxml"));
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
}
}
TestController.java
package com.example.javafx.event;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import javafx.scene.control.TextField;
import javafx.stage.WindowEvent;
public class TestController implements Initializable
{
@FXML private Parent root;
@FXML private TextField serverAddressInput;
@FXML private TextField usernameInput;
@Override
public void initialize(URL url, ResourceBundle rb)
{
serverAddressInput.setText("127.0.0.1");
//won't work because stage isn't visible yet
trySetFocusOnUsernameInput1();
//apparently Stage never passes on any WindowEvents to the children...
trySetFocusOnUsernameInput2();
}
private void trySetFocusOnUsernameInput1()
{
usernameInput.requestFocus();
}
private void trySetFocusOnUsernameInput2()
{
root.addEventFilter(WindowEvent.WINDOW_SHOWN, new EventHandler<WindowEvent>()
{
@Override
public void handle(WindowEvent window)
{
usernameInput.requestFocus();
}
});
root.addEventHandler(WindowEvent.WINDOW_SHOWN, new EventHandler<WindowEvent>()
{
@Override
public void handle(WindowEvent window)
{
usernameInput.requestFocus();
}
});
}
public void handleWindowShownEvent()
{
usernameInput.requestFocus();
}
}
TestView.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<VBox
xmlns:fx="http://javafx.com/fxml"
fx:id="root"
fx:controller="com.example.javafx.event.TestController"
prefHeight="150"
prefWidth="200"
>
<children>
<TextField fx:id="serverAddressInput" />
<TextField fx:id="usernameInput" />
</children>
</VBox>
Also, eigentlich, wie sonst kann ein Knoten Kenntnis von der Tatsache, dass es sichtbar/gerendert/dargestellt?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich vermute, dass eine der möglichen Lösungen ist, fügen Sie die folgende Methode, um TestController.java
und ändern Sie dann die
start
Methode in TestLauncher der folgenden:Ich würde wirklich begrüßen, andere Lösungen als dieses scheint mir zu klobig...
Andere Lösung, die zwar nicht sehr sexy, aber entkoppelt die Knoten aus der Anwendung:
Mehr Sinn in meinem Fall.