it-swarm.com.de

So schließen Sie ein Java-Fenster mit einem Klick - JavaFX-Projekt

Ich habe ein JavaFX-Projekt erstellt und die GUI für den Rahmen der ersten Anmeldung im Java Scene Builder erstellt. Wenn der Login erfolgreich ist, muss der Login-Frame geschlossen und der nächste Frame sichtbar sein (Hauptprogramm-Frame). Ich kann den neuen Frame anzeigen lassen, aber ich kann den Login-Frame nicht schließen. Ich habe Sachen wie dispose() ausprobiert, aber nichts geht. Unten ist der Code für die Hauptklasse:

public class KuberComm extends Application {

    @Override
    public void start(Stage stage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));

        Scene scene = new Scene(root);
        stage.setResizable(false);
        stage.setTitle("Login to KuberComm");
        stage.setScene(scene);

        stage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }

}

Der Handler für die Login-Schaltfläche befindet sich in einer anderen Klasse (Controller-Klasse, die von der NetBeans-IDE erstellt wurde). Ich kann nicht herausfinden, wie der Name des Frames lautet, um ihn in der Controller-Klasse zu verwenden.

Jede Hilfe wird sehr geschätzt!

14
Aristomenis

geben Sie Ihrem Button einen Namen in der Controller-Klasse:

@FXML
public Button closeButton;

und füge diese Methode hinzu:

@FXML
public void handleCloseButtonAction(ActionEvent event) {
    Stage stage = (Stage) closeButton.getScene().getWindow();
    stage.close();
}

In Ihrer FXML benötigen Sie einen Verweis auf den Schaltflächennamen und die Methode, um onAction aufzurufen:

<Button fx:id="closeButton" cancelButton="true" layoutX="350.0" layoutY="767.0" mnemonicParsing="false" onAction="#handleCloseButtonAction" prefWidth="100.0" text="Close" />

Dies würde die Phase schließen, in der sich diese Schaltfläche befindet.

25
Moh-Aw

Benutzen 

stage.hide()

Wenn Sie dies von einem Controller aus tun, können Sie die Bühne von einer beliebigen Node innerhalb der Szene der Bühne abrufen (lassen Sie den FXML-Loader ggf. einem Feld des Controllers mithilfe des id-Attributs aus dem fxml-Namespace in fxml zuweisen):

Window stage = node.getScene().getWindow();
6
fabian

Ähnlich wie die anderen Antworten, aber genauer.

@FXML
public void handleCloseButtonAction(ActionEvent event) {
    ((Stage)(((Button)event.getSource()).getScene().getWindow())).close();
}
5
Sedrick

Danke für Ihre Zeit, um zu antworten, aber am Ende habe ich herausgefunden, wie ich es reparieren kann. ich benutzte 

((Node)(event.getSource())).getScene().getWindow().hide();

in derifdass es für den erfolgreichen Login verantwortlich ist. Ich meine, nachdem ein Dialog erscheint, der den Benutzer über die erfolgreiche Anmeldung informiert, wird der Code dort angezeigt.

(Ich habe auch das richtige Zeug importiert, damit diese Codezeile funktioniert)

4
Aristomenis

Obwohl

    getScene().getWindow();

bei einer Node erhalten Sie die Stufe vom Controller. Beachten Sie, dass der Aufruf von close() oder hide() gleichwertig ist und das Anmeldefenster einfach unsichtbar wird. Wie für dispose():

Dieser Link kann helfen, Verwirrung zu beseitigen.

0
Forager