5

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

 1 year ago
source link: https://blog.51cto.com/mugexuetang/5987323
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

对话框是桌面应用程序中一种很重要的组件,例如在删除一个文件的时候,系统就会用对话框的形式提醒用户是否确定要删除这个文件。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

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class Exam20_22Frame extends JFrame{
JButton[] buttons;
public Exam20_22Frame(){
init();
}
private void init( ){
Container container = this.getContentPane();
container.setLayout(null);
buttons = new JButton[3];
buttons[0] = new JButton("对话框1");
buttons[1] = new JButton("对话框2");
buttons[2] = new JButton("对话框3");
for(int i=0;i<buttons.length;i++){
buttons[i].setSize(200, 40);
buttons[i].setLocation(50, i*60+20);
buttons[i].setFont(new Font("微软雅黑", Font.PLAIN, 20));
container.add(buttons[i]);
}
buttons[0].addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//弹出消息对话框,仅设置消息
JOptionPane.showMessageDialog(Exam20_22Frame.this,
"您的会员资格将于3天后到期");
}
});

buttons[1].addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//弹出消息对话框,设置消息、标题、消息类型
JOptionPane.showMessageDialog(Exam20_22Frame.this,
"您的会员资格将于3天后到期","会员到期提醒",JOptionPane.WARNING_MESSAGE);
}
});
buttons[2].addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//弹出消息对话框,设置消息、标题、消息类型、图标
JOptionPane.showMessageDialog(Exam20_22Frame.this,
"您的会员资格将于3天后到期","会员到期提醒",JOptionPane.WARNING_MESSAGE,
new ImageIcon("a.png"));
}
});
}
}
public class Exam20_22 {
public static void main(String[] args) {
Exam20_22Frame frame = new Exam20_22Frame();
frame.setSize(320, 250);
frame.setLocationRelativeTo(null);
frame.setTitle("Exam20_22Frame");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}

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

第二十章《Java Swing》第7节:对话框_输入对话框

图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

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class Exam20_23Frame extends JFrame{
JButton button;
public Exam20_23Frame(){
init();
}
private void init( ){
Container container = this.getContentPane();
container.setLayout(null);
button = new JButton("确认对话框1");
button.setSize(200, 40);
button.setLocation(50,20);
button.setFont(new Font("微软雅黑", Font.PLAIN, 20));
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//弹出确认对话框,设置对话框文本、标题、按钮组合
JOptionPane.showConfirmDialog(Exam20_23Frame.this,
"在关闭前是否保存文档?","关闭文档提示",JOptionPane.YES_NO_CANCEL_OPTION);
}
});
container.add(button);
}
}
public class Exam20_23 {
public static void main(String[] args) {
Exam20_23Frame frame = new Exam20_23Frame();
frame.setSize(320, 150);
frame.setLocationRelativeTo(null);
frame.setTitle("Exam20_23Frame");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}

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

第二十章《Java Swing》第7节:对话框_消息对话框_02

图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

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class Exam20_24Frame extends JFrame{
JButton button;
public Exam20_24Frame(){
init();
}
private void init( ){
Container container = this.getContentPane();
container.setLayout(null);
button = new JButton("输入对话框");
button.setSize(200, 40);
button.setLocation(50,20);
button.setFont(new Font("微软雅黑", Font.PLAIN, 20));
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//弹出输入对话框
Object input = JOptionPane.showInputDialog(Exam20_24Frame.this,
"请问你想要什么礼物?","选择礼物", JOptionPane.QUESTION_MESSAGE, null,
new String[]{"iPhone","iPad","ice cream"}, "iPad");
}
});
container.add(button);
}
}
public class Exam20_24 {
public static void main(String[] args) {
Exam20_24Frame frame = new Exam20_24Frame();
frame.setSize(320, 150);
frame.setLocationRelativeTo(null);
frame.setTitle("Exam20_24Frame");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}

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

第二十章《Java Swing》第7节:对话框_输入对话框_03

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

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

20.7.4内部信息对话框

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

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

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

Exam20_25.java

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class Exam20_25Frame extends JFrame{
JButton button;
public Exam20_25Frame(){
init();
}
private void init( ){
Container container = this.getContentPane();
container.setLayout(null);
button = new JButton("内部信息对话框");
button.setSize(200, 40);
button.setLocation(50,20);
button.setFont(new Font("微软雅黑", Font.PLAIN, 20));
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//弹出内部信息对话框
JOptionPane.showInternalMessageDialog(container, "内部信息对话框");
}
});
container.add(button);
}
}
public class Exam20_25{
public static void main(String[] args) {
Exam20_25Frame frame = new Exam20_25Frame();
frame.setSize(320, 150);
frame.setLocationRelativeTo(null);
frame.setTitle("Exam20_25Frame");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}

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

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

图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

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
//自定义对话框类
class MyDialog extends JDialog{
JTextField txtUserName;
JPasswordField pwdPassword;
JButton btnOk,btnCancel;
JLabel lblUserName, lblPassword;
String value = null;
public MyDialog(Frame owner, String title){
super(owner, title);
init();
}
private void init( ){
Container container = this.getContentPane();
container.setLayout(null);
txtUserName = new JTextField();
pwdPassword = new JPasswordField();
btnOk = new JButton("确定");
btnCancel = new JButton("取消");
lblUserName = new JLabel("用户名");
lblPassword = new JLabel("密 码");
this.setSize(300,200);
this.setLocationRelativeTo(null);

lblUserName.setSize(80, 30);
lblUserName.setLocation(30, 20);
lblUserName.setFont(new Font("微软雅黑", Font.PLAIN, 20));
txtUserName.setSize(140, 30);
txtUserName.setLocation(110, 20);
txtUserName.setFont(new Font("微软雅黑", Font.PLAIN, 20));
lblPassword.setSize(80, 30);
lblPassword.setLocation(30, 60);
lblPassword.setFont(new Font("微软雅黑", Font.PLAIN, 20));
pwdPassword.setSize(140, 30);
pwdPassword.setLocation(110, 60);
pwdPassword.setFont(new Font("微软雅黑", Font.PLAIN, 20));
btnOk.setSize(80, 30);
btnOk.setLocation(50, 100);
btnOk.setFont(new Font("微软雅黑", Font.PLAIN, 20));
btnOk.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//获取用户填写的用户名和密码并赋值给value
value = "用户名:"+txtUserName.getText()
+"密码:"+new String(pwdPassword.getPassword());
//关闭对话框
MyDialog.this.dispose();
}
});
btnCancel.setSize(80, 30);
btnCancel.setLocation(150, 100);
btnCancel.setFont(new Font("微软雅黑", Font.PLAIN, 20));
btnCancel.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
MyDialog.this.dispose();
}
});
container.add(txtUserName);
container.add(pwdPassword);
container.add(btnOk);
container.add(btnCancel);
container.add(lblUserName);
container.add(lblPassword);
//设置为模态对话框
this.setModal(true);
this.setVisible(true);
}
//返回用户填写的信息
public String getValue(){
return value;
}
}
//窗体类
class Exam20_26Frame extends JFrame{
JButton button;
public Exam20_26Frame(){
init();
}
private void init( ){
Container container = this.getContentPane();
container.setLayout(null);
button = new JButton("自定义对话框");
button.setSize(200, 40);
button.setLocation(50,20);
button.setFont(new Font("微软雅黑", Font.PLAIN, 20));
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//弹出内部信息对话框
MyDialog myDialog = new MyDialog(Exam20_26Frame.this,"自定义对话框");
//当对话框关闭后执行getValue()方法
String input = myDialog.getValue();
System.out.println(input);
}
});
container.add(button);
}
}
public class Exam20_26 {
public static void main(String[] args) {
Exam20_26Frame frame = new Exam20_26Frame();
frame.setSize(320, 150);
frame.setLocationRelativeTo(null);
frame.setTitle("Exam20_26Frame");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}

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

第二十章《Java Swing》第7节:对话框_消息对话框_05

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

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

本文字版教程还配有更详细的视频讲解,小伙伴们可以 ​点击这里观看。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK