2012-11-26 12 views
31

muszę zamknąć bieżące okno fxml kodem w kontrolerzezamknij okno fxml kodem, JavaFX

wiem stage.close() lub stage.hide() to zrobić w fx

jak zaimplementować to w fxml? Próbowałem:

ale to nie działa!

Cała pomoc zostanie bardzo doceniona. Dzięki!

Odpowiedz

102
  1. dać swoją blisko przycisk FX: id, jeśli nie masz jeszcze: <Button fx:id="closeButton" onAction="#closeButtonAction">
  2. W swojej klasie kontrolera:

    @FXML private javafx.scene.control.Button closeButton; 
    
    @FXML 
    private void closeButtonAction(){ 
        // get a handle to the stage 
        Stage stage = (Stage) closeButton.getScene().getWindow(); 
        // do what you have to do 
        stage.close(); 
    } 
    
+3

To podejście nie działa dla mnie. Otrzymuję niesamowite dzieło 'NullPointerException' –

+0

! , na wszelki wypadek, ludzie pamiętają, sprawdź nazwę swojego przycisku (ten przypadek closeButton) i nazwę swojego onClick (w tym przypadku closeButtonAction) –

+0

Zamyka tylko okno, ale aplikacja nadal działa !!! –

1

Nie jestem pewien, czy to najlepszy sposób (czy to działa), ale można spróbować:

private void on_btnClose_clicked(ActionEvent actionEvent) { 

     Window window = getScene().getWindow(); 

     if (window instanceof Stage){ 
      ((Stage) window).close(); 
     } 
} 

(Zakładając, że kontroler jest węzłem przeciwnym razie trzeba uzyskać węzeł pierwszy. (getScene() to metoda Node)

13

Jeśli masz okno, które rozszerza się o javafx.application.Application;, możesz skorzystać z poniższej metody.

Platform.exit(); 

przykład:

public class MainGUI extends Application { 
......... 

Button exitButton = new Button("Exit"); 
exitButton.setOnAction(new ExitButtonListener()); 
......... 

public class ExitButtonListener implements EventHandler<ActionEvent> { 

    @Override 
    public void handle(ActionEvent arg0) { 
    Platform.exit(); 
    } 
} 

edycji dla urody Java 8:

public class MainGUI extends Application { 
    ......... 

    Button exitButton = new Button("Exit"); 
    exitButton.setOnAction(actionEvent -> Platform.exit()); 
} 
+0

'Platform.exit()' zamknie wszystkie etapy i zestrzelił całą aplikację. To może nie być pożądane. – nonybrighto

+0

Oryginalny plakat był pytaniem, jak zamknąć okno (etap), a nie aplikację. –

0
stage.setOnCloseRequest(new EventHandler<WindowEvent>() { 
    public void handle(WindowEvent we) {       
     Platform.setImplicitExit(false) 
      stage.close() 
     } 
    }); 

jest równoważne hide. Więc kiedy zamierzasz go otworzyć następnym razem, po prostu sprawdź, czy obiekt stage jest zakończony, czy nie. Jeśli zostanie zakończone, po prostu show(), tj. (stage.show()) połączenia. W przeciwnym razie musisz rozpocząć etap.

4

Zaimplementowałem to w następujący sposób po otrzymaniu NullPointerException z zaakceptowanej odpowiedzi.

W moim FXML:

<Button onMouseClicked="#onMouseClickedCancelBtn" text="Cancel"> 

W moim Controller Klasa:

@FXML public void onMouseClickedCancelBtn(InputEvent e) { 
    final Node source = (Node) e.getSource(); 
    final Stage stage = (Stage) source.getScene().getWindow(); 
    stage.close(); 
} 
1

Znalazłem ładne rozwiązanie, które nie wymaga zdarzenie być wyzwalany:

@FXML 
private Button cancelButton; 

close(new Event(cancelButton, stage, null)); 

@FXML 
private void close(Event event) { 
    ((Node)(event.getSource())).getScene().getWindow().hide();      
} 
0

cię można to osiągnąć za pomocą,

@FXML 
private void closeAction(ActionEvent evt){ 
    System.exit(0); 
} 

zrobi za Ciebie.

Powiązane problemy