• 第二十章《Java Swing》第7节:对话框


    对话框是桌面应用程序中一种很重要的组件,例如在删除一个文件的时候,系统就会用对话框的形式提醒用户是否确定要删除这个文件。Swing体系中有两类对话框:第一类是系统对话框,第二类是自定义对话框。系统对话框就是Swing体系已经定义好的对话框,它们的基本界面是Java基础类库已经设计好的,程序员只需要调用一个方法就能把这个对话框显示出来。而自定义对话框是指由程序员自己设计的对话框,这种对话框的界面完全由程序员根据实际业务的需要自行设计。任何对话框都是从某个窗体上弹出来的,没有凭空出现的对话框。

    系统对话框又可以分为三种,分别消息对话框、确认对话框和输入对话框。对话框不能做最大化、最小化以及调节大小的操作。系统对话框的基本结构是固定的,它们都有标题、图标、消息和按钮四个部分。本小节将详细讲解三种系统对话框和自定义对话框的使用。

    20.7.1消息对话框

    消息对话框用于向用户传达一件已经发生了的事情,用户在看到这个对话框之后所能做的操作就只有点击一下“确定”按钮,表示自己已经知道了这个消息。所有弹出系统对话框,都要调用JoptionPane类的showMessageDialog()静态方法。showMessageDialog()方法有3个重载版本,如表20-12所示。

    表20-12 showMessageDialog()方法

    方法

    功能

    void showMessageDialog(Component parentComponent,Object message)

    在parentComponent窗体上弹出消息对话框,消息为message

    void showMessageDialog(Component parentComponent,Object message, String title, int messageType)

    在parentComponent窗体上弹出消息对话框,消息为message,对话框标题为title,消息类型为messageType

    void showMessageDialog(Component parentComponent,Object message, String title, int messageType, Icon icon)

    在parentComponent窗体上弹出消息对话框,消息为message,对话框标题为title,消息类型为messageType

    从表20-12可以看出:消息对话框的类型messageType是int型参数,这个参数一般都用JOptionPane类的静态属性表示,下面的表20-13展示了各种静态属性所代表的消息类型。

    表20-13 消息类型

    静态属性

    所代表的消息类型

    ERROR_MESSAGE

    错误

    INFORMATION_MESSAGE

    提示信息

    WARNING_MESSAGE

    警告

    QUESTION_MESSAGE

    提问

    PLAIN_MESSAGE

    普通消息

    下面的【例20_22】展示了如何弹出三种消息对话框。

    【例20_22 消息对话框】

    Exam20_22.java

    1. import java.awt.*;
    2. import java.awt.event.*;
    3. import javax.swing.*;
    4. class Exam20_22Frame extends JFrame{
    5. JButton[] buttons;
    6. public Exam20_22Frame(){
    7. init();
    8. }
    9. private void init( ){
    10. Container container = this.getContentPane();
    11. container.setLayout(null);
    12. buttons = new JButton[3];
    13. buttons[0] = new JButton("对话框1");
    14. buttons[1] = new JButton("对话框2");
    15. buttons[2] = new JButton("对话框3");
    16. for(int i=0;i
    17. buttons[i].setSize(200, 40);
    18. buttons[i].setLocation(50, i*60+20);
    19. buttons[i].setFont(new Font("微软雅黑", Font.PLAIN, 20));
    20. container.add(buttons[i]);
    21. }
    22. buttons[0].addActionListener(new ActionListener() {
    23. @Override
    24. public void actionPerformed(ActionEvent e) {
    25. //弹出消息对话框,仅设置消息
    26. JOptionPane.showMessageDialog(Exam20_22Frame.this,
    27. "您的会员资格将于3天后到期");
    28. }
    29. });
    30. buttons[1].addActionListener(new ActionListener() {
    31. @Override
    32. public void actionPerformed(ActionEvent e) {
    33. //弹出消息对话框,设置消息、标题、消息类型
    34. JOptionPane.showMessageDialog(Exam20_22Frame.this,
    35. "您的会员资格将于3天后到期","会员到期提醒",JOptionPane.WARNING_MESSAGE);
    36. }
    37. });
    38. buttons[2].addActionListener(new ActionListener() {
    39. @Override
    40. public void actionPerformed(ActionEvent e) {
    41. //弹出消息对话框,设置消息、标题、消息类型、图标
    42. JOptionPane.showMessageDialog(Exam20_22Frame.this,
    43. "您的会员资格将于3天后到期","会员到期提醒",JOptionPane.WARNING_MESSAGE,
    44. new ImageIcon("a.png"));
    45. }
    46. });
    47. }
    48. }
    49. public class Exam20_22 {
    50. public static void main(String[] args) {
    51. Exam20_22Frame frame = new Exam20_22Frame();
    52. frame.setSize(320, 250);
    53. frame.setLocationRelativeTo(null);
    54. frame.setTitle("Exam20_22Frame");
    55. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    56. frame.setVisible(true);
    57. }
    58. }

    【例20_22】的运行结果如图20-23所示。

    图20-23【例20_22】运行结果

    在图20-23所示的窗体上,单击任意一个按钮都会一个消息对话框,图20-23所示的弹出第二种形式,即指定了消息对话框的消息、标题以及消息类型。【例20_22】的第三个按钮所弹出的消息对话框要设置一个图标,这个图标是a.png,为了正确显示出这个图标,需要读者在工程根目录下添加a.png。

    20.7.2确认对话框

    确认对话框的作用主要是用来向用户确认要不要做某个操作,或者用户到底想做什么样的操作。例如在删除文件的时候,系统就会用一个确认对话框向用户确认是不是真的要删除这个文件。弹出确认对话框是由JOptionPane类的showConfirmDialog()静态方法完成的,这个方法有4个重载的版本,如表20-14所示。

    表20-14 showConfirmDialog()方法

    方法

    功能

    int showConfirmDialog(Component parentComponent,Object message)

    在parentComponent窗体上弹出确认对话框,对话框文本是message

    int showConfirmDialog(Component parentComponent, Object message, String title, int optionType)

    在parentComponent窗体上弹出确认对话框,对话框文本是message,对话框标题为title,按钮组合类型为optionType

    int showConfirmDialog(Component parentComponent, Object message, String title, int optionType, int messageType)

    在parentComponent窗体上弹出确认对话框,对话框文本是message,对话框标题为title,按钮组合类型为optionType,消息类型为messageType

    int showConfirmDialog(Component parentComponent, Object message, String title, int optionType,int messageType, Icon icon)

    在parentComponent窗体上弹出确认对话框,对话框文本是message,对话框标题为title,按钮组合类型为optionType,消息类型为messageType,图标为icon

    从表20-14可以看出:大部分情况下确认对话框需要设置按钮组合,所谓“按钮组合”就是指确认对话框上显示的按钮有哪些,这些按钮组合也都是有JOptionPane类的静态属性表示的,如表20-15所示。

    表20-15 确认对话框按钮组合

    静态属性

    按钮组合

    YES_NO_OPTION

    是与否的按钮组合

    YES_NO_CANCEL_OPTION

    是、否与取消的按钮组合

    OK_CANCEL_OPTION

    OK与取消的按钮组合

    DEFAULT_OPTION

    默认按钮组合

    从表20-14还可以看出:showConfirmDialog()方法的返回值类型为int,这个返回值代表了用户点击了哪一个按钮。这些返回值也可以由JOptionPane类的静态属性表示,这些静态属性如表20-16所示。

    表20-16确认对话框的返回值

    静态属性

    返回值意义

    YES_OPTION

    用户点击了“是”按钮

    NO_OPTION

    用户点击了“否”按钮

    CANCEL_OPTION

    用户点击了“取消”按钮

    OK_OPTION

    用户点击了“OK”按钮,与YES_OPTION相同

    CLOSED_OPTION

    用户关闭了确认对话框

    下面的【例20_23】展示了如何弹出确认对话框,由于弹出确认对话框和弹出消息对话框有很多相同的参数,本例只演示弹出其中一种确认对话框。

    【例20_23 确认对话框】

    Exam20_23.java

    1. import java.awt.*;
    2. import java.awt.event.*;
    3. import javax.swing.*;
    4. class Exam20_23Frame extends JFrame{
    5. JButton button;
    6. public Exam20_23Frame(){
    7. init();
    8. }
    9. private void init( ){
    10. Container container = this.getContentPane();
    11. container.setLayout(null);
    12. button = new JButton("确认对话框1");
    13. button.setSize(200, 40);
    14. button.setLocation(50,20);
    15. button.setFont(new Font("微软雅黑", Font.PLAIN, 20));
    16. button.addActionListener(new ActionListener() {
    17. @Override
    18. public void actionPerformed(ActionEvent e) {
    19. //弹出确认对话框,设置对话框文本、标题、按钮组合
    20. JOptionPane.showConfirmDialog(Exam20_23Frame.this,
    21. "在关闭前是否保存文档?","关闭文档提示",JOptionPane.YES_NO_CANCEL_OPTION);
    22. }
    23. });
    24. container.add(button);
    25. }
    26. }
    27. public class Exam20_23 {
    28. public static void main(String[] args) {
    29. Exam20_23Frame frame = new Exam20_23Frame();
    30. frame.setSize(320, 150);
    31. frame.setLocationRelativeTo(null);
    32. frame.setTitle("Exam20_23Frame");
    33. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    34. frame.setVisible(true);
    35. }
    36. }

    【例20_23】的运行结果如图20-24所示。

    图20-24【例20_23】运行结果

    在图20-24所示的窗体上单击“确认对话框1”就会弹出确认对话框。

    20.7.3输入对话框

    输入对话框的作用是让用户输入一些信息,其中最常见的形式就是在对话框上出现一个文本框,由用户在文本框当中输入信息。输入对话框由JOptionPane类的showInputDialog()实现,这个方法有6个的重载的版本,如表20-17所示。

    表20-17 showInputDialog()方法

    方法

    功能

    String showInputDialog(Object message)

    弹出输入对话框,对话框文本是message

    String showInputDialog(Object message, Object initialSelectionValue)

    弹出输入对话框,对话框文本是message,默认的输入信息为initialSelectionValue

    String showInputDialog(Component parentComponent,Object message)

    在parentComponent弹出输入对话框,对话框文本是message

    String showInputDialog(Component parentComponent, Object message,                                         Object initialSelectionValue)

    在parentComponent弹出输入对话框,对话框文本是message,默认的输入信息为initialSelectionValue

    String showInputDialog(Component parentComponent, Object message, String title, int messageType)

    在parentComponent弹出输入对话框,对话框文本是message,默认的输入信息为initialSelectionValue,对话框标题是title,消息类型是messageType

    Object showInputDialog(Component parentComponent, Object message, String title, int messageType, Icon icon,        Object[] selectionValues, Object initialSelectionValue)

    在parentComponent弹出输入对话框,对话框上有一个下拉框。对话框文本是message,对话框标题是title,消息类型是messageType,对话框图标是icon,输入选项是selectionValues,默认输入信息为initialSelectionValue

    从表20-17可以看出:showInputDialog()方法的返回值类型为String,这个返回值就是用户所输入(或选择)的信息。下面的【例20_24】展示了如何弹出一个输入对话框。

    【例20_24 输入对话框】

    Exam20_24.java

    1. import java.awt.*;
    2. import java.awt.event.*;
    3. import javax.swing.*;
    4. class Exam20_24Frame extends JFrame{
    5. JButton button;
    6. public Exam20_24Frame(){
    7. init();
    8. }
    9. private void init( ){
    10. Container container = this.getContentPane();
    11. container.setLayout(null);
    12. button = new JButton("输入对话框");
    13. button.setSize(200, 40);
    14. button.setLocation(50,20);
    15. button.setFont(new Font("微软雅黑", Font.PLAIN, 20));
    16. button.addActionListener(new ActionListener() {
    17. @Override
    18. public void actionPerformed(ActionEvent e) {
    19. //弹出输入对话框
    20. Object input = JOptionPane.showInputDialog(Exam20_24Frame.this,
    21. "请问你想要什么礼物?","选择礼物", JOptionPane.QUESTION_MESSAGE, null,
    22. new String[]{"iPhone","iPad","ice cream"}, "iPad");
    23. }
    24. });
    25. container.add(button);
    26. }
    27. }
    28. public class Exam20_24 {
    29. public static void main(String[] args) {
    30. Exam20_24Frame frame = new Exam20_24Frame();
    31. frame.setSize(320, 150);
    32. frame.setLocationRelativeTo(null);
    33. frame.setTitle("Exam20_24Frame");
    34. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    35. frame.setVisible(true);
    36. }
    37. }

    【例20_24】的运行结果如图20-25所示。

    图20-25【例20_24】运行结果

    在图20-25所示的界面中,单击“输入对话框”按钮就能弹出如图所示的输入对话框,这个输入对话框上有一个下拉框。如果使用前5个版本的showInputDialog()方法,则可以弹出一个带有文本框的输入对话框,读者可以自行尝试实现。

    20.7.4内部信息对话框

    内部信息对话框是从指某个容器上弹出的对话框,这个对话框不能离开弹出它的容器。实际上,通过getContentPane()方法获得的内容面板实际上就是一个容器,从这个容器上弹出的对话框不能在容器以外的范围内显示。内部对话框也分为3种,与普通的系统对话框一一对应。为与弹出普通对话框的方法相区别,弹出内部信息对话框的方法名称中会增加一个单词“Internal”,例如内部信息确认对话框的方法是showInternalConfirmDialog()。

    弹出内部信息对话框时,会把“父组件”指定为一个容器而不是窗体对象本身。下面的【例20_25】展示了如何弹出一个内部信息对话框。

    【例20_25 内部信息对话框】

    Exam20_25.java

    1. import java.awt.*;
    2. import java.awt.event.*;
    3. import javax.swing.*;
    4. class Exam20_25Frame extends JFrame{
    5. JButton button;
    6. public Exam20_25Frame(){
    7. init();
    8. }
    9. private void init( ){
    10. Container container = this.getContentPane();
    11. container.setLayout(null);
    12. button = new JButton("内部信息对话框");
    13. button.setSize(200, 40);
    14. button.setLocation(50,20);
    15. button.setFont(new Font("微软雅黑", Font.PLAIN, 20));
    16. button.addActionListener(new ActionListener() {
    17. @Override
    18. public void actionPerformed(ActionEvent e) {
    19. //弹出内部信息对话框
    20. JOptionPane.showInternalMessageDialog(container, "内部信息对话框");
    21. }
    22. });
    23. container.add(button);
    24. }
    25. }
    26. public class Exam20_25{
    27. public static void main(String[] args) {
    28. Exam20_25Frame frame = new Exam20_25Frame();
    29. frame.setSize(320, 150);
    30. frame.setLocationRelativeTo(null);
    31. frame.setTitle("Exam20_25Frame");
    32. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    33. frame.setVisible(true);
    34. }
    35. }

    【例20_25】的运行结果如图20-26所示。

    图20-26【例20_25】运行结果

    在窗体上单击“内部信息对话框按钮”就可以弹出一个内部信息对话框,从图20-26可以很明显的看出:内部信息对话框无法超出弹出它的容器。

    20.7.5自定义对话框

    在Swing体系中,用JDialog类来表示对话框,无论是系统对话框还是自定义对话框都使用这个类来表示。前文之所以在介绍系统对话框时没有给读者介绍这个类,就是因为程序员如果希望弹出一个系统对话框,只需要调用JOptionPane类的静态方法就可以了,而这些静态方法在实现弹出对话框的过程中实际上就是创建了一个JDialog类的对象。各位读者可以把JDialog理解为一种特殊的窗体,之所以说它特殊,就是因为它不能像普通窗体那样实现最大化、最小化以及修改大小的操作。程序员创建一个自定义的对话框和创建一个窗体的过程是一样的:只要定义一个类并且让这个类继承JDialog就可以了。当创建出自定义对话框类对象后,调用其setVisible()方法并为方法传递参数true就能够把自定义对话框显示出来。

    对话框分为“模态对话框”和“非模态对话框”,所谓“模态对话框”是指当对话框弹出后,用户无法操作弹出它的窗体上的任何组件,例如之前介绍的消息对话框、确认对话框都属于模态对话框,而非模态对话框则没有这个限制。自定义对话框上往往会出现文本框等组件,程序员如果希望获得自定义对话框上组件的内容,就必须把自定义对话框设置为模态对话框。设置模态对话框的方法是setModal(),只需要为该方法传递true作为参数就能够把一个自定义对话框设置为模态对话框。需要注意:模态对话框一旦被显示,也就是说当模态对话框执行了setVisible()方法并为方法传递参数true后,setVisible()之后的语句将暂停执行,因此一般都会把调用模态对话框setVisible()方法的语句置于整个初始化方法的最后一行。

    通常情况下,自定义的模态对话框都会用来用户所输入的信息。程序员可以在自定义对话框中定义一个收集信息的方法,当关闭对话框后通过调用这个方法来收集用户所填写的信息。

    下面的【例20_26】展示了如何弹出一个自定义对话框并获取对话框上文本框中的信息。在这个例子中,以MyDialog类作为自定义对话框,并以MyDialog类的getValue()作为收集用户所填写信息的方法。

    【例20_26 自定义对话框】

    Exam20_26.java

    1. import java.awt.*;
    2. import java.awt.event.*;
    3. import javax.swing.*;
    4. //自定义对话框类
    5. class MyDialog extends JDialog{
    6. JTextField txtUserName;
    7. JPasswordField pwdPassword;
    8. JButton btnOk,btnCancel;
    9. JLabel lblUserName, lblPassword;
    10. String value = null;
    11. public MyDialog(Frame owner, String title){
    12. super(owner, title);
    13. init();
    14. }
    15. private void init( ){
    16. Container container = this.getContentPane();
    17. container.setLayout(null);
    18. txtUserName = new JTextField();
    19. pwdPassword = new JPasswordField();
    20. btnOk = new JButton("确定");
    21. btnCancel = new JButton("取消");
    22. lblUserName = new JLabel("用户名");
    23. lblPassword = new JLabel("密 码");
    24. this.setSize(300,200);
    25. this.setLocationRelativeTo(null);
    26. lblUserName.setSize(80, 30);
    27. lblUserName.setLocation(30, 20);
    28. lblUserName.setFont(new Font("微软雅黑", Font.PLAIN, 20));
    29. txtUserName.setSize(140, 30);
    30. txtUserName.setLocation(110, 20);
    31. txtUserName.setFont(new Font("微软雅黑", Font.PLAIN, 20));
    32. lblPassword.setSize(80, 30);
    33. lblPassword.setLocation(30, 60);
    34. lblPassword.setFont(new Font("微软雅黑", Font.PLAIN, 20));
    35. pwdPassword.setSize(140, 30);
    36. pwdPassword.setLocation(110, 60);
    37. pwdPassword.setFont(new Font("微软雅黑", Font.PLAIN, 20));
    38. btnOk.setSize(80, 30);
    39. btnOk.setLocation(50, 100);
    40. btnOk.setFont(new Font("微软雅黑", Font.PLAIN, 20));
    41. btnOk.addActionListener(new ActionListener() {
    42. @Override
    43. public void actionPerformed(ActionEvent e) {
    44. //获取用户填写的用户名和密码并赋值给value
    45. value = "用户名:"+txtUserName.getText()
    46. +"密码:"+new String(pwdPassword.getPassword());
    47. //关闭对话框
    48. MyDialog.this.dispose();
    49. }
    50. });
    51. btnCancel.setSize(80, 30);
    52. btnCancel.setLocation(150, 100);
    53. btnCancel.setFont(new Font("微软雅黑", Font.PLAIN, 20));
    54. btnCancel.addActionListener(new ActionListener() {
    55. @Override
    56. public void actionPerformed(ActionEvent e) {
    57. MyDialog.this.dispose();
    58. }
    59. });
    60. container.add(txtUserName);
    61. container.add(pwdPassword);
    62. container.add(btnOk);
    63. container.add(btnCancel);
    64. container.add(lblUserName);
    65. container.add(lblPassword);
    66. //设置为模态对话框
    67. this.setModal(true);
    68. this.setVisible(true);
    69. }
    70. //返回用户填写的信息
    71. public String getValue(){
    72. return value;
    73. }
    74. }
    75. //窗体类
    76. class Exam20_26Frame extends JFrame{
    77. JButton button;
    78. public Exam20_26Frame(){
    79. init();
    80. }
    81. private void init( ){
    82. Container container = this.getContentPane();
    83. container.setLayout(null);
    84. button = new JButton("自定义对话框");
    85. button.setSize(200, 40);
    86. button.setLocation(50,20);
    87. button.setFont(new Font("微软雅黑", Font.PLAIN, 20));
    88. button.addActionListener(new ActionListener() {
    89. @Override
    90. public void actionPerformed(ActionEvent e) {
    91. //弹出内部信息对话框
    92. MyDialog myDialog = new MyDialog(Exam20_26Frame.this,"自定义对话框");
    93. //当对话框关闭后执行getValue()方法
    94. String input = myDialog.getValue();
    95. System.out.println(input);
    96. }
    97. });
    98. container.add(button);
    99. }
    100. }
    101. public class Exam20_26 {
    102. public static void main(String[] args) {
    103. Exam20_26Frame frame = new Exam20_26Frame();
    104. frame.setSize(320, 150);
    105. frame.setLocationRelativeTo(null);
    106. frame.setTitle("Exam20_26Frame");
    107. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    108. frame.setVisible(true);
    109. }
    110. }

    【例20_26】的运行结果如图20-27所示。

    图20-27【例20_26】运行结果

    在图20-27所示窗体上单击“自定义对话框”按钮就会出现一个自定义对话框,当用户在该对话框中输入用户名和密码后再单击“确定”按钮,控制台上就会输出用户所填写的用户名和密码。实现这一效果的关键是MyDialog类中定义了一个value属性用于保存用户名和密码,当关闭对话框后,调用getValue()方法获得用户名和密码。

    除阅读文章外,各位小伙伴还可以点击这里观看我在本站的视频课程学习Java!

  • 相关阅读:
    如何使用 MyBatis-Plus 实现公共字段自动填充
    SQL教程之 SQL 聚合函数入门教程
    《最新出炉》系列初窥篇-Python+Playwright自动化测试-5-元素定位大法-上篇
    内网渗透-DC-9靶机渗透
    【有限元分析】异型密封圈计算泄漏量与参数化优化过程(带分析源文件)
    MySQL:12-Java中使用MySQL(JDBC)
    关于IO口的一个没见过的坑
    自学(黑客)技术方法 必看 ——网络安全
    C语言——量
    Java:为什么2022年Java应用开发很流行?
  • 原文地址:https://blog.csdn.net/shalimu/article/details/128145653