JDialog对话框

一个完整的桌面程序通常有一个主界面和若干对话框,区别于JFrame,Swing中通常用JDialog显示对话框窗口,本篇笔记记录Swing中各种对话框的使用。

对话框的分类

对话框从界面效果上可以分为:

模态对话框:用户不关闭这个对话框就不能在主界面上操作。

非模态对话框:用户不关闭这个对话框也能在主界面上操作。

对话框从功能上可以分为:

  • 实现简单的通知、确认等功能的对话框
  • 实现文件选择的文件对话框
  • 实现复杂功能的自定义对话框

使用JOptionPane弹出对话框

JOptionPane是一个很方便的工具类,能够弹出一个简单的对话框,并接受用户返回值,而不需要编写对话框界面的代码。下面演示JOptionPane的使用。

package com.gacfox.demo;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class MainFrame extends JFrame {
    public MainFrame() {
        JButton btn = new JButton("按钮");
        btn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                int retValue = JOptionPane.showConfirmDialog(MainFrame.this,
                        "这是一个对话框");
                if (retValue == JOptionPane.OK_OPTION) {
                    System.out.println("用户选择了[是]");
                }
            }
        });
        add(btn);
        pack();
    }
}

运行结果如下图所示。

我们在JFrame上创建了一个按钮,按钮点击就会用JOptionPane弹出一个确认对话框(ConfirmDialog)。用户在对话框上的选择会传递到确认对话框的返回值。在这里,显然JOptionPane提供的对话框都是模态对话框,show()方法都具有返回值,该方法会阻塞直到用户关闭模态对话框,最后把用户的操作作为返回值返回。

JOptionPane提供的对话框

下面我们详细看一下JOptionPane中可用的的对话框。

  • MessageDialog 只有一个确定按钮,无返回值
  • ConfirmDialog 有“是”,“否”,“取消”三个按钮,返回值分别是int类型的012
  • OptionDialog 选择对话框,需要传入数组类型的选项,所有选项都会以按钮形式展示出来,返回值是数组索引
  • InputDialog 输入框,有一个文本框接收输入信息,返回值是输入的字符串

对话框图标

图标可以使用默认值或自定义,但不同观感下默认图标可能不同。对话框的show()方法有多个重载供我们选择。默认图标由对话框的消息类型决定,可用的消息类型:

  • JOptionPane.ERROR_MESSAGE 错误消息,通常是一个红色的大叹号或大叉
  • JOptionPane.INFORMATION_MESSAGE 通知消息
  • JOptionPane.WARNING_MESSAGE 警告消息
  • JOptionPane.QUESTION_MESSAGE 询问消息
  • JOptionPane.PLAIN_MESSAGE 该类型没有图标

对话框显示的消息

我们编码时会注意到,show()方法参数传入消息的Object类型,其实消息可以是:

  • String 消息字符串
  • Icon 显示一个图标
  • Component 显示组件
  • Object[] 显示数组中所有对象,依次叠加
  • 其他类型 显示该类的toString()结果

通常我们都是用String类型的消息,当然某些情况下,Component类型的消息可能更加适用。

ConfirmDialog的按钮

我们可以设置ConfirmDialog显示哪组按钮。

  • JOptionPane.DEFAULT_OPTION 默认
  • JOptionPane.YES_NO_OPTION 是/否按钮组
  • JOptionPane.YES_NO_CANCLE_OPTION 是/否/取消按钮组
  • JOptionPane.OK_CANCLE_OPTION 确认/取消按钮组

文件对话框

文件对话框也是很常用的,我们打开文件,保存文件都会用到。我们可以使用自定义对话框自己编写,但是这实在太麻烦了,我们似乎要编写一个简易的磁盘文件浏览器才行。但是由于这种需求非常常见,因此基本所有的GUI框架都提供了文件对话框。

下面我们来看一个简单的例子代码。

package com.gacfox.demo;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class MainFrame extends JFrame {
    public MainFrame() {
        JButton btn = new JButton("按钮");
        btn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                JFileChooser jFileChooser = new JFileChooser();
                int result = jFileChooser.showOpenDialog(MainFrame.this);
                if (result == JFileChooser.APPROVE_OPTION) {
                    String filename = jFileChooser.getSelectedFile()
                            .getAbsolutePath();
                    System.out.println(filename);
                }
            }
        });
        add(btn);
        pack();
    }
}
  • OpenDialog 用于打开文件的对话框
  • SaveDialog 用于保存文件的对话框

运行结果如下图所示。

上面代码打开了一个文件选择对话框,如果用户选择了文件就读取这个文件的文件名并打印到控制台上。除此之外,文件对话框还有很多实用方法。我们可以设置基于文件后缀名的过滤,可以设置用户可以选择多个文件等。这里就不展开叙述了。

其他内置的对话框

文件选择器对话框很复杂又很常用,因此Swing提供了内置的文件对话框。实际上,Swing还提供了颜色选择框JColorChooser。感兴趣的同学可以自己研究。

自定义对话框

虽然JOptionPane很方便,但是我们经常需要弹出一个比较复杂的自定义对话框,比如整个软件的设置界面,里面可能包含大量按钮、文本框、列表、树状列表等。创建自定义对话框,需要继承JDialog窗体类,和我们的应用程序继承JFrame是一样的。

MyDialog.java

package com.gacfox.demo;

import javax.swing.*;
import java.awt.*;

public class MyDialog extends JDialog {
    public MyDialog(JFrame parent) {
        super(parent, "自定义对话框", true);

        String tip = "<html><font size='4'>尊敬的用户,您好:</font><br /><p>您的余额不足,请立即充值,否则后果自负!!!</p></html>";
        JLabel lbMain = new JLabel(tip);
        add(lbMain, BorderLayout.CENTER);

        JPanel pBtns = new JPanel();
        JButton btnOk = new JButton("OK");
        JButton btnCancel = new JButton("CANCEL");
        pBtns.add(btnOk);
        pBtns.add(btnCancel);
        add(pBtns, BorderLayout.SOUTH);

        setSize(250, 150);
    }
}

MainFrame.java

package com.gacfox.demo;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class MainFrame extends JFrame {
    public MainFrame() {
        JButton btn = new JButton("按钮");
        btn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                MyDialog myDialog = new MyDialog(MainFrame.this);
                myDialog.setVisible(true);
            }
        });
        add(btn);
        pack();
    }
}

运行结果如下图所示。

关于对话框的关闭按钮行为,和JFrame一样,我们可以通过覆盖setDefaultCloseOperation()进行修改。

注意上面代码中MyDialog构造函数的super(),我们传入了三个参数:

  • 第一个参数是父组件
  • 第二个参数是对话框标题
  • 第三个参数为是否是模态对话框
作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。
Copyright © 2017-2024 Gacfox All Rights Reserved.
Build with NextJS | Sitemap