Download presentation
Presentation is loading. Please wait.
1
高级组件GUI设计
2
9.6 对 话 框 设 计 顾名思义,对话框(Dialog)是向用户显示信息并获取程序继续运行所需数据的窗口,可以起到与用户交互的作用。从本质上讲,对话框是一种特殊的窗体,它通过一个或多个组件与用户交互。与JFrame一样,对话框是有边框、有标题且独立存在的容器,并且不能被其他容器所包容,但是对话框不能作为程序的最外层容器,也不能包含菜单条,此外,Java的对话框上没有最大化和最小化按钮。
3
Java提供了JDialog与JOptionPane两类对话框组件。JOptionPane提供了许多现成的对话框样式供用户选择使用。如果JOptionPane提供的样式无法满足我们的需求时,就需要使用JDialog来自行设计。 此外,对话框可分为模态和非模态两种类型。在程序的运行过程中,模态对话框一旦出现在屏幕上,则要求用户必须对该对话框作出响应,然后关闭对话框后才能回到原来的应用程序中继续执行。而非模态对话框则无上述要求。使用JOptionPane对象所得到的对话框都是模态对话框,而使用JDialog设计的对话框则可根据实际需要进行选择。
4
JOptionPane对话框 JOptionPane提供了许多现成的对话框样式,用户只需使用该类提供的静态方法,指定方法中所需要的参数,JOptionPane对话框就能轻易的显示出来。利用JOptionPane类来制作对话框不仅简单快速,而且程序代码简洁清晰。JOptionPane类的继承关系如下: java.lang. Object java.awt.Component java.awt.Container javax.swing. JComponent javax.swing.JOptionPane
5
表9.12 JOptionPane的构造方法 构 造 方 法 说 明 JOptionPane( )
说 明 JOptionPane( ) 创建一个显示测试信息的JOptionPane组件 JOptionPane(Object message) 创建一个显示特定信息的JOptionPane组件 JOptionPane(Object message,int messageType) 创建一个显示特定信息的JOptionPane组件,并设置信息类型 JOptionPane(Object message,int messageType, int optionType) 创建一个显示特定信息的JOptionPane组件,并设置信息与选项类型
6
表9.12 JOptionPane的构造方法 JOptionPane(Object message,int messageType,
int optionType,Icon icon) 创建一个显示特定信息的JOptionPane组件,并设置信息与选项类型,且可以显示出图案 int optionType,Icon icon,Object[ ] options) 创建一个显示特定信息的JOptionPane组件,并设置信息与选项类型,且可以显示出图案。选项值是一个ObjectArray,可用作更改按钮上的文字 int optionType,Icon icon,Object[ ] options, Object initialValue) 创建一个显示特定信息的JOptionPane组件,并设置信息与选项类型,且可以显示出图案。选项值是一个ObjectArray,可用作更改按钮上的文字,并设置默认按钮
7
实际上,利用JOptionPane类来产生对话框,通常不用new创建JOptionPane对象,而是使用JOptionPane类所提供的一些静态方法产生对话框。根据对话框的用途,可将JOptionPane类的对话框分为4种类型,分别是只给出提示信息的Message Dialog、要求用户进行确认的Confirm Dialog、可输入数据的Input Dialog和由用户自己定义类型的Option Dialog。系统分别为这4种类型的对话框提供了足够多的静态方法,下面分别予以说明。
8
1.Message Dialog Message Dialog是提示信息对话框。这种对话框中通常只含有一个“确定”按钮,例如,安装完某个软件时通常会跳出一个对话框告知您安装已经成功。创建这种对话框的静态方法列于表9.13中。
9
表9.13 Message Dialog的静态方法 Message Dialog的静态方法
void showMessageDialog(Component parentComponent, Object message) Object message,String title,int messageType) Object message,String title,int messageType,Icon icon) void showInternalMessageDialog(Component parentComponent, Object message,String title, int messageType, Icon icon)
10
表9.13 Message Dialog的静态方法 参 数 说 明
parentComponent:是指产生对话框的组件类型,通常是指Frame或Dialog组件; message:是指要显示的组件,通常是String或Label类型; title:对话框标题上显示的文字; messageType:指定信息类型(图标及字符串); icon:自定义的图标
11
表9.3中的messageType共有5种类型,分别用下述字符常量表达:ERROR_MESSAGE, INFORMATION_MESSAGE,WARNING_MESSAGE,QUESTION_MESSAGE,PLAIN_MESSAGE。指定messageType后,对话框中就会出现相应的图标及提示字符串,使用PLAIN_MESSAGE则没有图标。
12
2.Confirm Dialog Confirm Dialog称为确认对话框,这类对话框通常会询问用户一个问题,要求用户作YES/NO的回答。例如,当我们修改了某个文件的内容却没存盘就要关闭此文件时,系统通常都会弹出一个确认对话框,询问我们是否要保存修改过的内容。Confirm Dialog的静态方法列于表9.14中。
13
表9.14 Confirm Dialog的静态方法 int showConfirmDialog(Component parentComponent,Object message) int showConfirmDialog(Component parentComponent,Object message,String title,int optionType) int showConfirmDialog(Component parentComponent,Object message,String title,int optionType,int messageType) int showConfirmDialog(Component parentComponent,Object message,String title,int optionType,int messageType,Icon icon) int showInternalConfirmDialog(Component parentComponent,Object message) int showInternalConfirmDialog(Component parentComponent,Object message,String title,int optionType) int showInternalConfirmDialog(Component parentComponent,Object message,String title,int optionType,int messageType) int showInternalConfirmDialog(Component parentComponent,Object message,String title,int optionType,int messageType,Icon icon)
14
确认对话框的静态方法中共有6个参数,其中parentComponent、message、title、messageType和icon等5个参数的含义与提示信息对话框(Message dialog)中的相同,新增的一个optionType参数用于指定按钮的类型,可有4种不同的选择,分别是DEFAULT_OPTION、YES_NO_OPTION、YES_NO_CANCEL_OPTION与OK_CANCEL_OPTION。 这些方法的返回值是一个整数,依用户按下的按钮而定:YES、OK=0;NO=1;CANCEL=2;CLOSED=-1(当用户直接关掉对话框时)。
15
3.Input Dialog Input Dialog称为输入对话框,这类对话框可以让用户输入相关的信息,当用户完成输入并按下确定按钮后,系统会得到用户所输入的信息。输入对话框不仅可以让用户自行输入数据,也可以提供ComboBox组件让用户选择相关信息,避免用户输入错误。Input Dialog的静态方法列于表9.15中。
16
表9.15 Input Dialog的静态方法 String showInputDialog(Object message)
String showInternalInputDialog(Object message) String showInputDialog(Component parentComponent,Object message) String showInternalInputDialog(Component parentComponent,Object message) String showInputDialog(Component parentComponent,Object message,String title,int messageType String showInternalInputDialog(Component parentComponent,Object message,String title,int messageType) Object showInputDialog(Component parentComponent,Object message,String title,int messageType,Icon icon,Object[ ] selectionValues,Object initialselectionValue) Object showInternalInputDialog(Component parentComponent,Object message,String titleint messageType,Icon icon,Object[ ]selectionValues,Object initialselectionValue)
17
输入对话框的静态方法中共有7个参数,其中parentComponent、message、title、messageType和icon等5个参数的含义与提示信息对话框(Message Dialog)中的相同,另外两个参数中的selectionValue给用户提供了可能的选择值(数组),这个数组中的数据会以ComboBox方式显示出,而initialSelectionValue是对话框初始化时所显示的值。 当用户按下确定钮时会返回用户输入的信息,若按下取消钮则返回null。
18
4. Option Dialog Option Dialog称为选择对话框,这类的对话框可以让用户自已定义对话框的类型。它的最大好处是可以改变按钮上的文字,对于看不懂英文的用户,使用这种对话框则较为理想。Option Dialog的静态方法列于表9.16中。
19
表9.16 Option Dialog的静态方法 int showOptionDialog(Component parentComponent,Object message,String title,int optionType,int messageType,Icon icon,Object[ ] options,Object initialValue) int showInternalOptionDialog(Component parentComponent,Object message,String title,int optionType,int messageType,Icon icon,Object[ ] options,Object initialValue)
20
选择对话框的静态方法中共有8个参数,这些参数中的7个与输入对话框(Input Dialog)中的完全相同,新增的参数options对象数组是为用户提供设置按钮上文字的项。选择对话框返回值的类型及其具体值也与输入对话框相同。 上面我们列出了JOptionPane类所提供的4类对话框,下面通过两个例子来说明这些对话框的使用方法。
21
【示例程序c9_13.java】 编程实现提示信息对话框(Message Dialog)。
import java.awt.*; import javax.swing.*; import java.awt.event.*; public class c9_13 implements ActionListener { JFrame f = null; public c9_13( ) f = new JFrame("OptionPane Demo"); Container cp= f.getContentPane( ); cp.setLayout(new GridLayout(2,2)); JButton bt=new JButton("Show Error Icon"); bt.addActionListener(this);
22
cp.add(bt); bt=new JButton("Show Warning Icon"); bt.addActionListener(this); bt= new JButton("Show Plain Icon"); bt= new JButton("Show User Define Icon"); f.pack( ); f.setVisible(true); f.addWindowListener(new WinLis( )); }
23
class WinLis extends WindowAdapter
{ public void windowClosing(WindowEvent e) { System.exit(0); } } public static void main(String[ ] args) { new c9_13( ); } public void actionPerformed(ActionEvent e) { String cmd = e.getActionCommand( ); String title = "Message Dialog"; //设置对话框标题名 String message =""; int type = JOptionPane.PLAIN_MESSAGE; //指定信息类型 if(cmd.equals("Show Error Icon")) { type = JOptionPane.ERROR_MESSAGE; message = " Error Message"; //指定对话框内显示的信息
24
} else if(cmd.equals("Show Warning Icon")) {
type = JOptionPane.WARNING_MESSAGE; message = " Warning Message"; } else if(cmd.equals("Show Plain Icon")) { type = JOptionPane.PLAIN_MESSAGE; message = " Plain Message"; } else if(cmd.equals("Show User Define Icon")) { message = " User Define Message"; JOptionPane.showMessageDialog(f, message, title, type, new ImageIcon("g1.gif")); //输出设置图标的信息对话框 return; } JOptionPane.showMessageDialog(f,message,title,type); //输出未设图标的信息对话框
25
程序运行后首先出现如图9. 17(a)所示的界面,在此界面中我们点击“Show Error Icon”按钮,则出现图9
程序运行后首先出现如图9.17(a)所示的界面,在此界面中我们点击“Show Error Icon”按钮,则出现图9.17(b)中的信息对话框,按确定后返回图9.17(a)中的界面;点击“Show Warning Icon”按钮,则出现图9.17(c)中的信息对话框;点击“Show Plain Icon”按钮,则出现图9.17(d)中的信息对话框;点击“Show User Define Icon”按钮,则出现图9.17(e)中的信息对话框。
26
(a) (b) (c) 图9.17 程序c9_13的运行结果
27
(d) (e) 图9.17 程序c9_13的运行结果
28
【示例程序c9_14.java】 编程实现输入对话框(Input Dialog)。
import java.awt.*; import javax.swing.*; import java.awt.event.*; public class c9_14 implements ActionListener { JFrame f=null; JLabel lb=null; public c9_14( ) { f = new JFrame("OptionPane Demo"); Container cp=f.getContentPane( ); JPanel pa=new JPanel( ); pa.setLayout(new GridLayout(2,1)); JButton bt=new JButton("Show Text Input"); bt.addActionListener(this);
29
pa.add(bt); bt=new JButton("Show ComboBox Input"); bt.addActionListener(this); lb= new JLabel(" ",JLabel.CENTER); cp.add(lb,BorderLayout.NORTH); cp.add(pa,BorderLayout.CENTER); f.pack( ); f.setVisible(true); f.addWindowListener(new WinLis( )); } class WinLis extends WindowAdapter {
30
public void windowClosing(WindowEvent e) { System.exit(0); }
public static void main(String[ ] args) { new c9_14( ); } public void actionPerformed(ActionEvent e) { String cmd = e.getActionCommand( ); String title = "Input Dialog"; String message ="您最熟悉哪一种程序语言?"; int messageType = JOptionPane.QUESTION_MESSAGE; String[ ] values = {"VB","C++","JAVA","ASP","PHP"}; String result =""; if(cmd.equals("Show Text Input")) { result = JOptionPane.showInputDialog(f, message, title, messageType);
31
} else if(cmd.equals("Show ComboBox Input")) {
result = (String)JOptionPane.showInputDialog(f, message, title, messageType,null,values,values[0]); } if (result == null) lb.setText("您取消了对话框"); else{ lb.setText("您输入:"+result);
32
程序运行后首先出现图9. 18(a)所示的界面,在此界面中我们点击“Show Text Input”按钮,则出现图9
程序运行后首先出现图9.18(a)所示的界面,在此界面中我们点击“Show Text Input”按钮,则出现图9.18(b)所示的输入对话框,在此对话框中我们输入“JAVA”,按“确定”按钮后将输入值返回到第一个界面上,如图9.18(c)所示;在此界面上,再点击“Show ComboBox Input”按钮,则出现图9.18(d)所示的输入对话框,在此对话框中我们点击“VB”,按“确定”按钮后又将输入值返回到第一个界面上。
33
(a) (b) (c) (d) 图9.18 程序c9_14的运行结果
34
JDialog对话框 如果JOptionPane提供的样式无法满足我们的需求,就需要使用JDialog来自行设计对话框。用JDialog来制作对话框时,必须制作对话框中的每一个组件,所以比较麻烦。但是,当我们想要了解对话框的更多细节时,还是有必要学习用JDialog来制作对话框的过程的。事实上,当使用JOptionPane时,系统会自动产生JDialog组件,并将JOptionPane的内容放入JDialog的ContentPane中,而不需要我们介入。
35
JDialog是java.awt.Dialog的子类,其继承关系如下:
java.1ang.Object java.awt.Component java.awt.Container java.awt.Window java.awt.Dialog javax.swing.JDialog
36
表9.17 Jdialog的构造方法 方 法 说 明 JDialog( ) 建立一个空的对话框 JDialog(Dialog owner)
方 法 说 明 JDialog( ) 建立一个空的对话框 JDialog(Dialog owner) 建立一个空的、没有对话框标题、属于Dialog组件的对话框 JDialog(Dialog owner,boolean modal) 使用指定的Dialog组件创建一个无标题、模态对话框 JDialog(Dialog owner,String title) 使用指定的组件创建一个有标题、非模态对话框 JDialog(Dialog owner,String title, boolean modal) 使用指定的组件创建一个有标题、模态对话框 JDialog(Frame owner) 使用指定的Frame组件创建一个无标题、非模态对话框 JDialog(Frame owner,boolean modal) 使用指定的Frame组件创建一个无标题、模态对话框 JDialog(Frame owner,String title) 使用指定的Frame组件创建一个有标题、非模态对话框 JDialog(Frame owner,String title, 使用指定的Frame组件创建一个有标题、模态对话框
37
表中的modal是对话框的操作模式,可分为模态和非模态两种,用modal参数的true与false表示。当modal为true时,称为模态对话框,它要求用户在应用程序继续执行之前必须对该对话框作出响应,关闭对话框后才能回到原来的应用程序继续执行。当modal为false时,称为非模态对话框,非模态对话框则无上述要求。 使用JDialog与使用JFrame非常类似,要加入组件到JDialog上必须先取得JDialog的ContentPane,然后再把组件加到此ContentPane中。JDialog默认的版面管理器是BorderLayout,它是不可见的,可以使用show( )方法显示它。下面我们用示例程序来说明它的制作与使用方法。
38
【示例程序c9_15.java】 JDialog的制作与使用。
import javax.swing.*; import javax.swing.border.*; import java.awt.*; import java.awt.event.*; public class c9_15 implements ActionListener { String s1=" "; JFrame f=null; JLabel lb=new JLabel("对话框示例 "); JTextField tf1,tf2; //声明对话框中的文本框对象 JDialog dialog; //声明对话框对象 public c9_15( )
39
{ f=new JFrame("对话框示例");
Container cp=f.getContentPane( ); JPanel pa=new JPanel(new GridLayout(3,1)); pa.add(lb); JButton bt=new JButton("进入对话框"); bt.addActionListener(this); pa.add(bt); bt=new JButton("结束"); pa.setBorder(BorderFactory.createTitledBorder( BorderFactory.createLineBorder(Color.blue,3), "对话框示例",TitledBorder.CENTER,TitledBorder.TOP));
40
cp.add(pa,BorderLayout.CENTER);
f.pack( ); f.setVisible(true); f.addWindowListener(new WinLis( )); } public void actionPerformed(ActionEvent e) { String cmd=e.getActionCommand( ); if (cmd.equals("进入对话框")) { dial( ); } //在该方法中创建对话框 else if (cmd.equals("结束")) { System.exit(0); } //对话框中的按钮事件 if (cmd.equals("确定")) { } else if(cmd.equals("返回")) {
41
s1=tf1.getText( ); s1=s1+tf2.getText( ); lb.setText(s1);dialog.dispose( ); } class WinLis extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); } public static void main(String[ ] args) { new c9_15( ); } public void dial( )
42
dialog=new JDialog(f,"进入对话框",true); //创建对话框对象
Container diacp=dialog.getContentPane( ); //创建对话框的容器对象 diacp.setLayout(new FlowLayout( )); //设置创建对话框的容器的布局 JLabel lb1=new JLabel("输入学号: "); JLabel lb2=new JLabel("输入姓名: "); JPanel pa1=new JPanel(new GridLayout(3,2)); //面板布局为3行2列布局 tf1=new JTextField(8); tf2=new JTextField(8); pa1.add(lb1); pa1.add(tf1); pa1.add(lb2); pa1.add(tf2); JButton bt1=new JButton("确定");
43
pa1.add(bt1); bt1= new JButton("返回"); bt1.addActionListener(this); diacp.add(pa1); //对话框的容器上放入面板 dialog.setBounds(150,150,200,150); //设置对话框的容器的大小 dialog.show( ); //将对话框变为可见 }
44
在上面的示例程序中有一个JFrame窗口和一个对话框。在JFrame窗口中定义了一个标签组件(lb)、两个按钮组件(bt),如图9
在上面的示例程序中有一个JFrame窗口和一个对话框。在JFrame窗口中定义了一个标签组件(lb)、两个按钮组件(bt),如图9.19所示。在对话框中定义了2个标签(lb1,lb2),2个文本框(tf1,tf2),两个按钮组件(bt1,bt2),如图9.20所示。程序运行时首先出现图9.19所示的界面,当点击这个界面的“进入对话框”按钮后则出现图9.20所示的对话框,在这个对话框中输入学号和姓名,输入完后按“返回”按钮则出现图9.21所示的画面,它实际上是图9.19所示界面中的标签文本接受了我们在对话框中输入的信息后的再现。
45
图 9.19
46
图 9.20
47
图 9.21
Similar presentations