3. Диалогови прозорци (Dialogs)
Диалоговият прозорец представлява вторичен (помощен) прозорец, използван за взаимодействие с потребителя. Той служи за:
- показване на информация;
- извеждане на предупреждения;
- изискване на потвърждение;
- въвеждане на данни.
Диалоговите прозорци са важен елемент от графичния потребителски интерфейс, тъй като реализират контролирана комуникация между приложението и потребителя.
В JavaFX диалоговите прозорци могат да бъдат реализирани по два основни начина:
чрез готови класове (напр. Alert); чрез създаване на самостоятелен прозорец (Stage), който често се описва чрез FXML
- Основни понятия
1.1. Stage (прозорец)
Stage представлява самостоятелен прозорец в JavaFX. Всеки диалогов прозорец всъщност е нов Stage.
Характеристики:
- съдържа сцена (Scene);
- може да бъде главен или дъщерен;
- поддържа различни стилове и модалност.
1.2. Scene (декор)
Scene представлява контейнер за визуалните компоненти, които се показват в прозореца.
- Реализация на диалогов прозорец
Диалогов прозорец може да бъде реализиран чрез:
- създаване на FXML файл (layout);
- зареждане на файла чрез FXMLLoader;
- създаване на нов Stage;
- асоцииране на сцена;
- визуализация.
2.1. Извикване на диалог
FXMLLoader loader = new FXMLLoader(getClass().getResource("dialog.fxml"));
Parent root = loader.load();
Stage dialogStage = new Stage();
dialogStage.setScene(new Scene(root));
dialogStage.setTitle("FXML Диалог");
dialogStage.show();
2.1. FXML файл за диалог
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.VBox?>
<VBox xmlns:fx="http://javafx.com/fxml"
fx:controller="com.example.DialogController"
spacing="10" alignment="CENTER">
<Label text="Това е диалогов прозорец"/>
<Button text="Затвори" onAction="#handleClose"/>
</VBox>
2.1. Контроллер
package bg.tu_varna.sit.ps.lab8.task1.example;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.stage.Stage;
public class DialogController {
@FXML
private Button closeButton;
@FXML
private void handleClose() {
Stage stage = (Stage) closeButton.getScene().getWindow();
stage.close();
}
}
Всеки елемент на изгледа е свързан с Декора, в който е разположен. На свой ред всеки декор е свързан с прозореца, в който се намира.
- Метода getScene извлича обекта на декора в който се намира графичния елемент
- Метода getWindow извлича прозореца, в който се намира декора
- Дъщерен прозорец (Child Window)
Дъщерният прозорец е диалог, който е логически свързан с главния прозорец.
Тази връзка се реализира чрез:
4.1. Owner
dialogStage.initOwner(primaryStage);
Определя кой е родителският прозорец.
4.2. Modality
dialogStage.initModality(Modality.WINDOW_MODAL);
Модалността определя дали потребителят може да взаимодейства с други прозорци.
Видове:
- NONE – няма ограничения;
- WINDOW_MODAL – блокира само родителския прозорец;
- APPLICATION_MODAL – блокира цялото приложение.
Stage dialogStage = new Stage();
dialogStage.initOwner(primaryStage);
dialogStage.initModality(Modality.WINDOW_MODAL);
dialogStage.setScene(new Scene(root));
dialogStage.showAndWait();
4.3 Метода showAndWait()
- спира изпълнението на текущия поток;
- изчаква затварянето на прозореца;
- използва се при диалози, изискващи резултат.