2015-08-17 17 views
5

Jeśli utworzę pustą klasę obejmującą javafx.scene.control.Dialog<R>, nie zamknie się po naciśnięciu przycisku "x" w prawym górnym rogu kąt.javafx.scene.control.Dialog <R> nie zamknie się po naciśnięciu "x"

Jak zaimplementować to zachowanie? Interfejs API wydaje mi się, że muszę zaimplementować przycisk zamykania. Ale w moim przypadku nie chcę przycisku zamknięcia, chcę tylko zamknąć okno za pomocą przycisku x lub naciskając klawisz ESC. czy to możliwe?

Odpowiedz

10

Aby obejść ten problem, można dodać ukryty przycisk zamykania do okna dialogowego.

import javafx.application.Application; 
import javafx.scene.*; 
import javafx.scene.control.*; 
import javafx.stage.Stage; 

public class DialogClosure extends Application{ 

    @Override 
    public void start(Stage stage) throws Exception { 
     Button openDialog = new Button("Open Dialog"); 
     openDialog.setOnAction(event -> { 
      Dialog dialog = new Dialog(); 
      dialog.getDialogPane().getButtonTypes().add(ButtonType.CLOSE); 
      Node closeButton = dialog.getDialogPane().lookupButton(ButtonType.CLOSE); 
      closeButton.managedProperty().bind(closeButton.visibleProperty()); 
      closeButton.setVisible(false); 
      dialog.showAndWait(); 
     }); 

     stage.setScene(new Scene(openDialog)); 
     stage.show(); 
    } 
    public static void main(String[] args) { 
     launch(args); 
    } 
} 

Następnie dialogowe spełnia oba Twój wymóg jest w stanie być zamknięty poprzez natywny system okienkowy za oknem ścisłej ikony, a także wymogu JavaFX Dialog z tym przycisk Zamknij w oknie dialogowym dla blisko ikona do pracy.

Alternatywnie można użyć stołu montażowego o numerze showAndWait zamiast Dialog. Etap bez żadnych dołączonych przycisków można zamknąć za pomocą ikony okna zamykania systemu okien.

6

zacytować Api Docs:

JavaFX dialogi mogą być zamknięte tylko 'nienormalnie' (jak określono powyżej) w dwóch sytuacjach:

  1. Gdy okno ma tylko jeden przycisk, lub

  2. Gdy okno dialogowe ma wiele przycisków, o ile jedno z nich spełnia jeden z następujących wymagań:

    1. Przycisk ma ButtonType, którego ButtonData jest typu ButtonData.CANCEL_CLOSE.
    2. Przycisk ma ButtonType którego ButtonData zwraca wartość true po wywołaniu ButtonData.isCancelButton().

    ...

Więc albo dodać co najmniej jeden przycisk lub kilka przycisków, a jednym z nich jest typu ButtonData.CANCEL_CLOSE, na przykład:

Dialog<ButtonType> dialog = new Dialog<>(); 
dialog.getDialogPane().getButtonTypes().add(new ButtonType("Got it!", ButtonData.CANCEL_CLOSE)); 
dialog.setContentText("test"); 
dialog.showAndWait(); 

Edytuj:

To zachowanie jest zaimplementowane w javafx.scene.control.FXDialog.requestPermissionToClose(Dialog<?>), ale pokazany prawdziwy FXDialog to HeavyweightDialog, który nie jest publicznym interfejsem API, a więc nie jest punktem rozszerzenia.

+1

Jak to ma sens, że trzeba zaimplementować przycisk zamykania, aby móc użyć innego przycisku zamykania? Dlaczego musisz mieć jedno i drugie? Czy jest coś jeszcze, co mogę użyć, jeśli chcę zwrócić wynik z okna, nie chcąc żadnych przycisków (z wyjątkiem tych na pasku tytułu, takich jak "x"). Początkowo stworzyłem własną klasę od podstaw, aby zaimplementować to zachowanie, ale nie udało mi się zwrócić wyniku. –

+0

@ JonatanStenbacka Jedynym rozwiązaniem byłoby zaimplementowanie własnego 'FXDialog' .. ale nie polecam tego. Ale nie mogę sobie wyobrazić Dialog bez żadnych przycisków ...? – eckig

+0

Potwierdzam, że jest to jedyna działająca opcja, jaką widziałem. Wielkie dzieki. – JonasAnon

11

Obejście z @eckig lub @jewelsea działa całkiem dobrze. Ale użyłbym czegoś takiego:

// Somewhere in code 
Dialog<?> dialog = new Dialog<>(); 
Window window = dialog.getDialogPane().getScene().getWindow(); 
window.setOnCloseRequest(event -> window.hide()); 

Nie znam żadnych ograniczeń tego użycia, ale zadziałało to dla mnie. I polecam zainicjować okno zaraz po inicjalizacji dialogu, jak wyżej.

1

W moim Dialog<ButtonType> Używam co @vbargl powiedział:

Window window = alert.getDialogPane().getScene().getWindow(); 
window.setOnCloseRequest(event -> window.hide()); 

To zamyka okno, ale to przynosząc mi żadna wartość obecną błąd.

Aby tego uniknąć, sprawdzam również result.get() oraz result.isPresent().

Powiązane problemy