2015-08-17 1 views
5

Если я просто создаю пустой класс, простирающийся от javafx.scene.control.Dialog<R>, он не будет закрываться, когда я нажимаю кнопку «x» в правом верхнем углу угол.javafx.scene.control.Dialog <R> не будет закрываться при нажатии «x»

Как реализовать это поведение? API, похоже, говорит мне, что мне нужно реализовать кнопку закрытия. Но в моем случае я не хочу кнопку закрытия, я просто хочу закрыть окно с помощью кнопки x или нажатием ESC. Это возможно?

ответ

10

Чтобы обойти это, вы можете добавить скрытую кнопку закрытия в диалог.

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); 
    } 
} 

Затем диалог отвечает как ваше требование того, чтобы быть в состоянии быть закрыто через окно закрыть значок родной оконной системы, а также требования JavaFX Диалог включения кнопки закрытия в диалоговом окне для закрытия значка на работу.

В качестве альтернативы вы можете использовать Stage с showAndWait вместо Dialog. Этап без каких-либо включенных кнопок закрывается с помощью значка окна закрытия окна окна.

6

процитировать Api Docs:

JavaFX диалоги могут быть закрыты только 'ненормально' (как определено выше) в две ситуации:

  1. Когда диалог имеет только одну кнопку, или

  2. Если в диалоговом окне имеется несколько кнопок, до тех пор, пока один из них отвечает одному из следующих требований:

    1. Кнопка имеет тип ButtonType, ButtonData имеет тип ButtonData.CANCEL_CLOSE.
    2. Кнопка ButtonType, где ButtonData возвращает true, когда вызывается ButtonData.isCancelButton().

    ...

Так что либо добавить по крайней мере одну кнопку или несколько кнопок, и один из них имеет тип ButtonData.CANCEL_CLOSE, например:

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

Редактировать:

Это поведение реализовано в javafx.scene.control.FXDialog.requestPermissionToClose(Dialog<?>), но реальный FXDialog показан HeavyweightDialog, который не является публичным API, поэтому не является точкой расширения.

+1

Как вы понимаете, что вам нужно использовать кнопку закрытия, чтобы использовать другую кнопку закрытия? Почему у вас должны быть оба? Есть ли что-нибудь еще, что я могу использовать, если мне нужно вернуть результат из окна без каких-либо кнопок (кроме тех, которые указаны в строке заголовка, например «x»). Первоначально я создал свой собственный класс с нуля, чтобы реализовать это поведение, но мне не удалось вернуть результат. –

+0

@JonatanStenbacka Единственное решение - реализовать собственный 'FXDialog' .. но я бы не рекомендовал этого. Но я не могу представить Диалог без кнопок ...? – eckig

+0

Подтверждение того, что это единственный рабочий параметр, который я видел. Удивительная благодарность. – JonasAnon

11

Обходной путь от @eckig или @jewelsea работает очень хорошо. Но я бы использовал что-то вроде этого:

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

Я не знаю никаких ограничений этого использования, но это сработало для меня. И я рекомендую инициализировать окно сразу после инициализации диалогового окна, как описано выше.

1

В моих Dialog<ButtonType> я использую то, что @vbargl сказал:

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

Он закрывает диалог, но принес мне настоящую ошибки в значения.

Чтобы избежать этого, я также проверяю result.get() и что result.isPresent().

Смежные вопросы