一个完整的桌面程序通常有一个主界面和若干对话框,区别于JFrame
,Swing中通常用JDialog
显示对话框窗口,本篇笔记记录Swing中各种对话框的使用。
对话框从界面效果上可以分为:
模态对话框:用户不关闭这个对话框就不能在主界面上操作。
非模态对话框:用户不关闭这个对话框也能在主界面上操作。
对话框从功能上可以分为:
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
中可用的的对话框。
MessageDialog
只有一个确定按钮,无返回值ConfirmDialog
有“是”,“否”,“取消”三个按钮,返回值分别是int
类型的0
,1
,2
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
显示哪组按钮。
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()
,我们传入了三个参数: