对话框(JDialog)是Swing中的一种顶层容器,它与框架类似都是可以移动窗口。与框架不同的是,对话框一般依附于一个框架之上,由该框架来调用。对话框分为有模式对话框和非模式对话框,有模式对话框是指在该对话框被关闭之前,其它窗口无法接收任何形式的输入,直到对话框被关闭;而非模式对话框允许用户在处理对话框的同时与其它窗口进行交流。
对话框采用JDialog类来实现,其主要构造方法如下:
- JDialog(Frame owner):创建一个没有标题的非模式对话框。
- JDialog(Frame owner, boolean modal):创建一个指定模式的没有标题的对话框,话框架的模式由参数modal来指定,true为有模式对话框,false为非模式对话框。
- JDialog(Frame owner, String title):创建一个有标题的非模式对话框。
- JDialog(Frame owner, String title, boolean modal):创建一个指定模式的有标题的对话框,话框架的模式由参数modal来指定。
与JFrame类似,刚创建的对话框是不可见的,需要调用setVisible(true)方法才能将其显示出来。
【例1】下面程序演示了对话框的创建以及JFrame窗口与对话框之间的通信。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class JDialogDemo extends JDialog{
JTextField textField=new JTextField(12);
JTextArea textArea=new JTextArea();
JButton sendButton=new JButton("发送信息");
JButton closeButton=new JButton("关闭对话框");
public JDialogDemo(Frame owner,String title,boolean modal,
JTextArea text) {
super(owner,title,modal);//调用父类的构造方法
setSize(300,200);
setLocationRelativeTo(null);
JPanel panel1=new JPanel();
panel1.add(new JLabel("传递给窗口的信息:"));
panel1.add(textField);
JPanel panel2=new JPanel();
panel2.add(sendButton);
panel2.add(closeButton);
add(panel1,BorderLayout.NORTH);
add(textArea,BorderLayout.CENTER);
add(panel2,BorderLayout.SOUTH);
//发送信息按钮注册事件监听器
sendButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//向传递给对话框的窗口文本区组件添加信息
text.append(textField.getText()+"\n");
}
});
//关闭对话框按钮注册事件监听器
closeButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
setVisible(false);//设置对话框为不可视
}
});
}
public static void main(String[] args) {
JFrame frame=new JFrame("主窗口");
frame.setSize(300,200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
JTextField textField=new JTextField(12);
JTextArea textArea=new JTextArea();
JButton showButton=new JButton("显示对话框");
JButton sendButton=new JButton("发送信息");
JDialogDemo dialog=new JDialogDemo(frame,"对话框",false,textArea);
//显示对话框按钮注册事件监听器
showButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
dialog.setVisible(true);//设置对话框为可视
}
});
//发送信息按钮注册事件监听器
sendButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//向对话框中文本区组件添加信息
dialog.textArea.append(textField.getText()+"\n");
}
});
JPanel panel1=new JPanel();
panel1.add(new JLabel("传递给对话框的信息:"));
panel1.add(textField);
JPanel panel2=new JPanel();
panel2.add(showButton);
panel2.add(sendButton);
frame.add(panel1,BorderLayout.NORTH);
frame.add(textArea,BorderLayout.CENTER);
frame.add(panel2,BorderLayout.SOUTH);
frame.setVisible(true);
}
}
运行上述程序,执行结果如图1所示。点击主窗口中的显示对话框按钮,弹出右侧所示的对话框。点击主窗口中的发送信息按钮,则会将其文本框中的信息插入到对话框中的文本区内;点击对话框中的发送信息按钮,则会将其文本框中的信息插入到主窗口中的文本区内。
图1. 对话框使用示例
JDialog类通常用于创建自定义对话框,但有时候对话框只要显示一段文字或进行简单的选择,这时候使用JOptionPane类提供的标准对话框,可以极大地减少代码的编写量。利用JOptionPane创建对话框通常不需要使用new操作符来创建JOptionPane对象,而是使用JOptionPane类中定义的多个形如showXxxDialog的静态方法来创建标准对话框。主要的标准对话框有:消息对话框(showMessageDialog)、输入对话框(showInputDialog)、确认对话框(showConfirmDialog)、选项对话框(showOptionDialog),除了选择对话框外,其它几种标准对话框都定义有若干个不同格式的同名方法。在这里,我们主要介绍每种标准对话框的一般方法格式。
(1)消息对话框
消息对话框的主要作用是显示信息,告知用户发生了什么情况。可以使用JOptionPane类中的静态方法showMessageDialog()来创建消息对话框,其主要格式如下:
void showMessageDialog(Component parentComponent, Object message,
String title, int messageType, Icon icon)
其中,parentComponent表示对话框的父窗口对象,如果取值为null,则对话框将在屏幕正中显示;message为显示在对话框中的描述信息;title为对话框的标题,messageType为消息类型,其取值如表1所示,这些值可以给出对话框的外观,例如,取值为JOptionPane.QUESTION_MESSAGE时,对话框的外观上有一个明显的“?”符号;icon为对话框上显示的装饰性图标,如果没有指定,则会根据参数messageType显示默认图标。
表1 标准对话框的消息类型
消息类型取值 | 消息类型含义 | 消息类型图标 |
JOptionPane.INFORMATION_MESSAGE | 提示消息 | |
JOptionPane.WARNING_MESSAGE | 警告消息 | |
JOptionPane.ERROR_MESSAGE | 错误消息 | |
JOptionPane.QUESTION_MESSAGE | 提问消息 | |
JOptionPane.PLAIN_MESSAGE | 简约消息 | 无图标 |
例如,执行下面代码会显示一个如图2所示的消息对话框。
JOptionPane.showMessageDialog(null, "File not found","消息会话框", JOptionPane.ERROR_MESSAGE); |
图2. 消息对话框示例
(2)确认对话框
确认对话框的作用是显示问题,要求用户进行确认。可以使用JOptionPane类中的静态方法showConfirmDialog()来创建确认对话框,其主要格式如下:
int showConfirmDialog(Component parentComponent, Object message,
String title, int optionType,int messageType, Icon icon)
其中,参数parentComponent、message、title、messageType和icon与消息对话框中相应的参数含义是一致的,optionType表示对话框上按钮的类型,可以取如下常量:
JOptionPane.YES_NO_OPTION
JOptionPane.YES_NO_CANCEL_OPTION
JOptionPane.OK_CANCEL_OPTION
该方法的返回值为用户选择的按钮序号,主要有:JOptionPane.YES_OPTION、JOptionPane.NO_OPTION、JOptionPane.CANCEL_OPTION、JOptionPane.OK_OPTION和JOptionPane.CLOSED_OPTION等,分别代表了用户选择了YES、NO、CANCEL、OK等按钮以及未选择直接关闭对话框。
例如,
int select=JOptionPane.showConfirmDialog(null, "Create one",
"确认会话",JOptionPane.YES_NO_CANCEL_OPTION);
if(select==JOptionPane.YES_OPTION) {
//用户点击是(Y)按钮
}else if(select==JOptionPane.NO_OPTION) {
//用户点击否(N)按钮
}else if(select==JOptionPane.CANCEL_OPTION) {
//用户点击取消按钮
}else if(select==JOptionPane.CLOSED_OPTION) {
//用户直接关闭对话框
}
执行上面代码会显示一个如图3所示的确认对话框,用户点击“是(Y)”按钮,方法返回值为JOptionPane.YES_OPTION,点击“否(N)”按钮,方法返回值为JOptionPane.NO_OPTION,点击“取消”按钮,方法返回值为JOptionPane.CANCEL_OPTION,如果直接关闭对框架,方法的返回值为JOptionPane.CLOSED_OPTION。
图3. 确认对话框示例
(3)输入对话框
输入对话框含有供用户输入的文本框或可选择选项的组合框,以及一个确认按钮和一个取消按钮。可以使用JOptionPane类中的静态方法showInputDialog()来创建输入对话框,其主要格式如下:
int showConfirmDialog(Component parentComponent, Object message, String title, int optionType,int messageType, Icon icon)
其中,参数parentComponent、message、title、messageType和icon与消息对话框中相应的参数含义是一致的;selectionValues表示所有可能的选项值,如果没有指定,则显示文本框,否则显示组合框;initialSelectionValue表示默认的选项或信息。
例如,执行代码会显示如图4(a)所示的带文本的输入对话框。
String input=JOptionPane.showInputDialog(null, "请输入信息", "带文本框输入对话框",JOptionPane.INFORMATION_MESSAGE); |
执行下面代码显示如图4(b)所示的带组合框的输入对话框。
String[] selectionValues={"计算机科学与技术","软件工程","网络空间安全"}; String selectedValue=(String)JOptionPane.showInputDialog(null, "请选择:", "输入对话框", JOptionPane.INFORMATION_MESSAGE,null, selectionValues,selectionValues[0]); |
![]() | ![]() |
图4. 输入对话框示例
(4)选项对话框
选项对话框显示一组选项按钮,用户可以从中选择一个。可以使用JOptionPane类中的静态方法showOptionDialog()来创建选项对话框,其主要格式如下:
int showOptionDialog(Component parentComponent, Object message, String title, int optionType, int messageType, Icon icon, Object[] options, Object initialValue)
其中,参数parentComponent、message、title、optionType 、messageType和icon与确认对话框中相应的参数含义是一致的;options表示可供用户选择的按钮选项,initialValue表示默认的选项。
例如,执行下面代码显示如图5所示的选项对话框。
String[] options= {"选项A","选项B","选项C","选项D"};
int select=JOptionPane.showOptionDialog(panel, "请选择你的选项:", "选项对话框",
JOptionPane.DEFAULT_OPTION,JOptionPane.QUESTION_MESSAGE,
null, options, options[0]);
if(select==0) {
//点击"选项A"按钮
}else if(select==1) {
//点击"选项B"按钮
}else if(select==2) {
//点击"选项C"按钮
}else if(select==3){
//点击"选项D"按钮
}
图5. 选项对话框示例