JDialog 是 Swing 的另一个顶级窗口,它和 Dialog 一样都表示对话框。JDialog 对话框可分为两种:模态对话框和非模态对话框。所谓模态对话框是指用户需要等到处理完对话框后才能继续与其他窗口交互的对话框,而非模态对话框是允许用户在处理对话框的同时与其他窗口交互的对话框。

    对话框是模态还是非模态,可以在创建 JDialog 对象时为构造方法传入参数来设置,也可以在创建 JDialog 对象后调用它的 setModaI()方法来进行设置。JDialog 常用的构造方法如下表所示。

    方法声明 功能描述
    JDialog(Frame owner) 构造方法,用来创建一个非模态的对话框,owner 为对话框所有者(顶级窗口 Frame)
    JDialog(Frame owner, String title) 构造方法,创建一个具有指定标题的非模态对话框
    JDialog(Frame owner, boolean modal) 创建一个有指定模式的无标题对话框

    上表中列举了 JDialog 3 个常用的构造方法,在这 3 个构造方法中都需要接收一个 Frame 类型的对象,表示对话框所有者,如果该对话框没有所有者,参数 owner 可以传入 null。第 3 个构造方法中,参数 modal 用来指定 JDialog 窗口是模态还是非模态,如果 modal 的值设置为 **true,对话框就是模态对话框,反之就是非模态**对话框如果**设置 modal 的值,其默认值为 false,也就是非模态**对话框

    接下来通过一个案例来学习如何使用 JDialog 对话框,如下所示。

    1. import java.awt.*;
    2. import javax.swing.*;
    3. public class example16 {
    4. public static void main(String[] args) {
    5. //建立两个按钮
    6. JButton btn1 = new JButton("模态对话框");
    7. JButton btn2 = new JButton("非模态对话框");
    8. JFrame frame = new JFrame("DialogDemo");
    9. frame.setSize(300, 250);
    10. frame.setLocation(300, 200);
    11. frame.setLayout(new FlowLayout()); //为内容面板设置布局管理器
    12. //在 Container 对象上添加按钮
    13. frame.add(btn1);
    14. frame.add(btn2);
    15. //设置单击关闭按钮默认关闭窗口
    16. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    17. frame.setVisible(true);
    18. final JLabel label = new JLabel();
    19. final JDialog dialog = new JDialog(frame, "Dialog");
    20. final JButton btn3 = new JButton("确定"); //创建按钮对象
    21. dialog.setSize(220, 150); //设置对话框大小
    22. dialog.setLocation(350, 250); //设置对话框位置
    23. dialog.setLayout(new FlowLayout()); //设置布局管理器
    24. dialog.add(btn3); //在对话框的内容面板添加按钮
    25. dialog.add(label); //在对话框的内容面板添标签
    26. //为“模态对话框”按钮添加单击事件
    27. btn1.addActionListener(new ActionListener() {
    28. public void actionPerformed(ActionEvent e) {
    29. //设置对话框为模态
    30. dialog.setModal(true);
    31. //修改标签的内容
    32. label.setText("模式对话框,点击确定按钮关闭");
    33. //显示对话框
    34. dialog.setVisible(true);
    35. }
    36. });
    37. //为“非模态对话框”按钮添加单击事件
    38. btn2.addActionListener(new ActionListener() {
    39. public void actionPerformed(ActionEvent e) {
    40. //设置对话框为非模态
    41. dialog.setModal(false);
    42. //修改标签的内容
    43. label.setText("非模式对话框,点击确定按钮关闭");
    44. //显示对话框
    45. dialog.setVisible(true);
    46. }
    47. });
    48. //为对话框中的按钮添加事件
    49. btn3.addActionListener(new ActionListener() {
    50. public void actionPerformed(ActionEvent e) {
    51. dialog.dispose();
    52. }
    53. });
    54. }
    55. }

    允许程序,生成的窗口如下图所示。
    QQ截图20200622152625.png QQ截图20200622152637.png QQ截图20200622152644.png
    第一张图显示,在 JFrame 窗口中添加了“模态对话框”和“非模态对话框”两个按钮。当单击“模态对话框”按钮时,显示出第二张图中的对话窗口,这时只能操作该对话框,其他对话框都处于一种冰封的状态,不能进行如何操作,直到用户单击对话框中的“确定”按钮,把该对话框关闭后,才能继续其他操作,此时不但能对弹出的对话框进行操作,而且能对其他的窗口进行操作,这就是模态对话框和非模态对话框的区别。

    书上的代码和上面演示的有些不同,下面写出来书上演示的代码。

    1. btn1.addActionListener(new ActionListener() {
    2. public void actionPerformed(ActionEvent e) {
    3. dialog.setModal(true);
    4. //调用 dialog 里的 getComponents()方法,该方法获得的是一个数组,然后查看数组长度属性并判断是否为 1,这里的 1 代表着 btn3 组件
    5. if (dialog.getComponents().length == 1) {
    6. dialog.add(label);
    7. }
    8. label.setText("模式对话框,点击确定按钮关闭");
    9. dialog.setVisible(true);
    10. }
    11. });

    下面给出了 getComponents()方法的具体内容,可以看到,数据返回的是一个数组类型。
    QQ截图20200622144833.png