在JavaFX的官方API中,是没有对话框相关的类。所以我们在需要使用对话框的时候,可以使用Swing的库。但是由于风格相差较大,更多的时候我们需要用JavaFX来创建对话框。
下面我们来看看怎么用JavaFX来创建一个对话框吧。
JavaFX用于创建对话框的类是Stage,没错。JavaFX程序的起始界面也是一个Stage。
我们先用JavaFX Scene Builder来创建一个布局文件。
如图所示,是一个简单的提示框布局,命名为AlertDialog.fxml。
然后修改XML文件如下图所示:
根部用fx:root标签,然后指定根部的类型为javafx.scene.layout.AnchorPane,注意,这里要跟后面代码里相对应。然后把之前的布局文件用<children>标签包含起来。
下面是我们事件代码:
- import java.io.IOException;
- import javafx.event.ActionEvent;
- import javafx.fxml.FXML;
- import javafx.fxml.FXMLLoader;
- import javafx.scene.Scene;
- import javafx.scene.control.Label;
- import javafx.scene.control.TitledPane;
- import javafx.scene.layout.AnchorPane;
- import javafx.stage.Stage;
- import javafx.stage.StageStyle;
- /**
- *
- * @author Wing
- */
- public class WiAlertDialog extends AnchorPane{
- @FXML
- Label alertMessage;
- @FXML
- TitledPane alertTitledPane;
- private static WiAlertDialog wiAlertDialog;
- private static Stage newAlertDialog ;
- private WiAlertDialog(String message) {
- FXMLLoader fXMLLoader = new FXMLLoader(getClass().getResource("AlertDialog.fxml"));
- fXMLLoader.setRoot(WiAlertDialog.this);
- fXMLLoader.setController(WiAlertDialog.this);
- try {
- fXMLLoader.load();
- } catch (IOException exception) {
- throw new RuntimeException(exception);
- }
- alertTitledPane.setFocusTraversable(false);
- alertMessage.setText(message);
- }
- public static void showAlertDialog(String message) {
- newAlertDialog = new Stage(StageStyle.TRANSPARENT);
- newAlertDialog.setResizable(false);
- wiAlertDialog = new WiAlertDialog(message);
- newAlertDialog.setScene(new Scene(wiAlertDialog));
- newAlertDialog.show();
- }
- public static void hideAlertDialog() {
- if(newAlertDialog != null) {
- newAlertDialog.hide();
- }
- }
- @FXML
- private void onAlertOKClick(ActionEvent event) {
- WiAlertDialog.hideAlertDialog();
- }
- }
我们先用FXMLLoader来载入FXML文件,然后设置根元素为当前,也就是AnchorPane。接着设置Controller为当前,也就是在FXML中指定的事件,我们可以在这里实现(例如后面的onAlertOKClick事件)。
然后我们用一个静态的showAlertDialog来显示对话框。
在showAlertDialog中,我们创建一个Stage,和一个包含当前界面的Scene。通过Stage.show来显示对话框,然后点击"确定"按钮后,执行onAlertOKClick来将Stage关闭。
下面我们来看看效果:
上下两个对话框均是这样实现的。
大家可以在JavaFX开发中尝试一下