Java程序设计11——GUI设计与事件处理A
1.GUI设计
Java使用AWT和Swing类完成图形用户界面编程,AWT全称是Abstract Window Toolkit,即抽象窗口工具集,它是Sun最早提供的GUI库,只是这个库功能比较有限,后来又提供了Swing库。通过使用AWT和Swing提供的图形界面组件库,就可以基于图形界面的程序。只有界面是不够的,为了实现图形用户界面与用户交互操作,Java提供了事件处理,用于响应用户的操作。
GUI Graphics User Interface 简称GUI,图形用户界面,Java提供了基本的构建GUI的类库,这个类库就是AWT。AWT是一个窗口框架,它从不同平台的窗口系统中抽取共同组件,当程序运行时,将这些组件的创建和动作委托给程序所在的运行平台。简而言之,当使用AWT编写图形界面应用时,程序仅指定了界面组件的位置和行为,并未提供真正的实现,JVM调用操作系统本地的图形界面来创建和平台一致的对等体。使用AWT创建的图形界面应用和所在运行平台有相同的界面风格,比如在Windows操作系统上,它就表现出Windows风格,在UNIX系统上就表现Unix风格。但是AWT有自身的缺点:
1.使用AWT作出的图形用户界面在所有平台上都很丑陋,功能也非常有限
2.AWT为了迎合所有主流操作系统的界面设计,AWT组件只能使用这些操作系统上图形界面组件的交集,所以不能使用特定操作系统上负责的图形界面组件,最多只能使用四种字体
3.AWT用的是非常笨拙的、非面向对象的编程模式
。SWING是由网景公司和SUN合作提供的,这套GUI库的所有图形界面组件,例如文本框、按钮等都是绘制在空白窗口上的,只有窗口本身需要借助操作系统的窗口实现。但是保留了AWT事件模式。
注意:
Swing并没有完全替代AWT,而是建立在AWT基础之上,Swing仅提供了能力更强大的用户界面组件,即使是完全采用Swing编写的GUI程序中,依然需要使用AWT的事件处理机制。
所有和AWT编程相关的类都在java.awt包及子包中。AWT编程有两个基类,Component和MenuComponent。其中Component代表一个能以图形化方式显示出来,并可与用户交互的对象,例如Button代表按钮,TextField代表文本框,而MenuComponent代表了图形界面的菜单组件,包括MenuBar、MenuItem等子类
AWT组件继承图
2.AWT
2.1 AWT容器
任何一个窗口都可以看出一个空的容器与很多组件的结合体。通过设置组件的大小、位置等属性,就可以将该空容器和基本组件组成一个整体的窗口。容器Container是Component的子类,因此容器对象本身也是一个组件,具有组件的所有性质,可以调用Component的所有方法。Component类有如下几个常用方法来设置组件的大小、位置和可见性。
setLocation(int x,int y):设置组件位置 setSize(int width,int height):设置组件的大小 setBounds(int x,int y,int width,int height):同时设置组件的位置和大小 setVisible(Boolean b):设置组件的可见性
除此之外,容器还有盛装其他组件的功能,容器类(Container)有如下方法来访问容器里的组件:
Component add(Component comp):向容器中添加其他组件,该组件可以是普通组件,也可以是容器,并返回被添加的组件 Component getComponentAt(int x,int y):返回指定点的组件 int getComponentCount():返回该容器内组件的数量 Component[] getComponents():返回该容器内的所有组件
AWT主要提供了两种主要的容器类型
Window:可独立存在的顶级窗口,如Frame
Panel:可作为容器容纳其他组件,但不能独立存在,必须被添加到其他容器中,如Window、Panle或者Applet等
AWT继承图
上述显示了AWT容器之间的继承层次,其中粗黑线圈的容器是AWT编程中常用的组件。
在java.awt包中提供了两种基类来表示图形界面元素:Component和MenuComponent,其中Component代表一个能以图形化方式显示出来,并可与用户交互的对象,例如Button代表一个按钮,TextField代表一个文本框,而MenuComponent则代表了图形界面的菜单组件,包括MenuBar(菜单条)、MenuItem(菜单项)等子类。
除此之外,AWT图形用户界面编程里还有两个重要的概念:Container和LayoutManager,其中Container是一种特殊的Component,它代表一种容器,可以盛装普通的Component,而LayoutManager则是容器管理器中其他组件的方式。
Window类两个子类,java.awt.Dialog和java.awt.Frame。用到的基本都是这两个来放控件。当你用要出现图形界面,要关闭窗口时,就必须得用到Window 提供的Windou事件类中的WindowClosing方法。WindowOpened、 WindowClosed,还有其他一些方法,都是来控制窗口打开,关闭,最小化等功能的
2.2 Frame
其中Frame代表常见的窗口,它是Window类的子类,具有如下特征:
1.Frame对象有标题,允许通过拖拉来改变窗口的位置、大小
2.初始化时为不可见,可用setVisible(true)使其显示出来。
代码:
package chapter1; import java.awt.*; public class TestFrame { public static void main(String[] args){ Frame f = new Frame(); f.setBounds(30, 20, 22, 27); f.setVisible(true); f.setTitle("我是大头"); } }
这个窗口是windows风格的(最大化、最小化以及X还有颜色同windows风格是一样的),这也证明了AWT确实是调用程序运行平台本地API创建了该窗口,如果点击X,窗口不会被关闭,因为我们并未为该窗口编写任何事件响应,如果想关闭该窗口,可以通过关闭运行该程序的命令行窗口来关闭该窗口。如果是eclipse直接终止表示程序运行中的红方块即可
2.3 Panel
Panel是AWT中另一个典型的容器,它代表不能独立存在,必须放在其他容器中的容器,Panel外在表现为一个矩形区域,该区域可以装在其他组件中,Panel容器存在的意义在于为其他组件提供空间,Panel容器有如下几个特点:
1.可作为容器来盛装其他组件,为放置组件提供空间
2.不能单独存在,必须放在其他容器中
3.默认使用FlowLayout作为其布局管理器
package chapter1; import java.awt.*; public class TestPanel { public static void main(String[] args){ //创建一个容器 Frame frame = new Frame(); frame.setBounds(500,500,700,700); frame.setVisible(true); frame.setTitle("我是容器"); //创建容器里面的一个面板 Panel panel = new Panel(); //往面板里面添加组件 panel.add(new TextField("姓名")); panel.add(new Button("单击我")); frame.add(panel); } }
2.3 ScrollPane
ScrollPane是一个带滚动条的容器,它也不能独立存在,必须被添加到其他容器中。ScrollPane容器具有如下特点:
1.可作为容器来盛装其他组件,当组件占用空间过大时,ScrollPane自动产生滚动条,当然也可以通过指定特定的构造器参数来指定默认具有滚动条。
2.不能单独存在,必须放置到其他容器中。
3.默认使用BorderLayout作为其布局管理器,ScrollPane通常用于盛装其他容器,所以通常不允许改变ScrollPane的布局管理器。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package chapter11; import java.awt.*; public class TestScrollPane { public static void main(String[] args){ //创建一个窗口 Frame f = new Frame("奇奇大排档"); //创建一个ScrollPane容器,并且指定总是有滚动条 ScrollPane sp = new ScrollPane(ScrollPane.SCROLLBARS_ALWAYS); sp.add(new TextField(20)); sp.add(new Button("单击我")); //将ScrollPane对象添加到Frame容器中 f.add(sp); //设置窗口的大小、位置 f.setBounds(20, 20, 177, 277); //将窗口显示出来 f.setVisible(true); } }
3.布局管理器
为了使生成的图形用户界面具有良好的平台无关性,Java语言中,提供了布局管理器这个工具来管理组件在容器中的的布局,而不使用直接设置组件位置和大小方式(如果坐标不对,很明显会造成组件重叠).
Label hello = new Label("HEllo");
为了让这个hello标签里面刚好容纳HEllo这个字符串,也就是没有冗余空间,也没有内容被遮挡,也就是实现这个标签的最佳大小,Windows下可能为100像素,20像素即可,但换到Unix上,则可以设置为120像素,高24像素,那么一个应用程序从Windows移植到Unix上时,程序需要做大量工作来调整图像界面。Java的LayoutManager可以解决这个问题,它根据运行平台来调整组件的大小。程序设计者需要做的是为容器选择合适的布局管理器。
所有的AWT容器都有默认的布局管理器,如果没有指定布局管理器,则使用默认的。为容器指定布局管理器通过调用容器对象的setLayoutManager(LayoutManager lm)方法来完成。
使用如下代码:
c.setLayoutManager(new XxxLayout());
AWT提供了FlowLayout、BorderLayout、GridLayout、GridBigLayout、CardLayout五个常用的布局管理器,Swing还提供了BoxLayout布局管理器。
3.1 FlowLayout布局管理器
在FlowLayout布局管理器中,组件像水流一样向某方法流动(排列),遇到障碍(边界)就折回,重头开始排列,默认情况下FlowLayout布局管理器从左向右排列所有组件,遇到边界就会折回下一行重新开始。这个就像文字输入一样,文字默认从左往右排列,遇到边界就折回下一行重新开始。
FlowLayout有如下三个构造器:
FlowLayout():使用默认对齐方式、默认垂直、水平间距创建FlowLayout布局管理器 FlowLayout(int align):使用指定对齐方式、默认垂直、水平间距创建FlowLayout布局管理器 FlowLayout(int align,int hgap,int vgap):使用指定对齐方式、指定垂直、水平间距创建FlowLayout布局管理器
其中hgap、vgap代表水平间距、垂直间距,这两个参数传输整数值,而align即排列的意思,代表排列方向 (从左往右、从右往左、从中间往两边等)。该参数使用FlowLayout类的静态常量:FlowLayout.LEFT/RIGHT/CENTER
Panel和applet都默认使用FlowLayout布局管理器。
package chapter1; import java.awt.*; public class TestLayout { public static void main(String[] args){ //创建一个窗口 Frame frame = new Frame("雷神托尔"); frame.setLayout(new FlowLayout(FlowLayout.LEFT,20,5)); //像窗口中添加10个按钮 for(int i = 0 ; i < 100 ; i++){ frame.add(new Button("按钮" + i)); } //设置窗口为最佳大小 frame.pack(); //显示窗口 frame.setVisible(true); } }
上面用了一个方法pack(),这个方法是Window容器提供的一个方法,该方法用于将窗口调整到最佳大小。与前面类似的是,通过Java编写图形用户界面程序时,很少直接设置窗口的大小,通常都是调用pack()方法来讲窗口调整到最佳大小。
3.2 BorderLayout布局管理器
BorderLayout将容器分为东西南北中五个区域,普通组件可以放置在这五个区域中任意一个,如下图:
当改变使用BorderLayout的容器大小时,NORTH、SOUTH和CENTER区域水平调整,而EAST、WEST和CENTER垂直调整。使用BorderLayout有如下两个注意点:
1.当向使用BorderLayout布局管理器的容器添加组件时,需要指定要添加到哪个区域里,如果没有指定要添加到哪个区域里,则默认添加到中间区域里
2.如果向同一个区域添加多个组件时,后放入的组件会覆盖前面的组件。前面的ScrollPane中添加了两个按钮,但是最后只看到最后一个按钮。
Frame、Dialog、ScrollPane默认使用BorderLayout布局管理器,BorderLayout有如下两个构造器:
BorderLayout():使用默认水平间距、垂直间距创建BorderLayout布局管理器
BorderLayout(int hgap, int vgap):使用指定水平间距、垂直间距创建BorderLayout布局管理器
当向使用BorderLayout布局管理器的容器添加组件时,应该使用BorderLayout类的几个静态属性来指定添加到哪个区域,BordeLayout有如下几个静态常量:EAST、NORTH、WEST、SOUTH、CENTER,如下程序示例了BorderLayout的用法:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package chapter11; import java.awt.*; public class TestBorderLayout { public static void main(String[] args){ //创建一个顶级Window窗口 Frame f = new Frame("你好,世界!"); //设置窗口的布局管理器 f.setLayout(new BorderLayout(30, 5)); //往窗口中添加组件 f.add(new Button("东"), BorderLayout.EAST); f.add(new Button("西"), BorderLayout.WEST); f.add(new Button("南"), BorderLayout.SOUTH); f.add(new Button("北"), BorderLayout.NORTH); //默认添加到中间 f.add(new Button("中")); //优化布局 f.pack(); //显示窗口 f.setVisible(true); } }
BorderLayout最多只能放5个组件,但可以放少于5个组件,如果某个区域没有放置组件,该区域并不会出现空白,旁边区域的组件会自动占据该区域,从而保证窗口有较好的外观。虽然BorderLayout最多只能放5个组件,但因为容器也是一个组件,所以我们可以先向Panel里添加多个组件,再把Panel添加到BorderLayout布局管理器中,从而让BorderLayout布局管理器中的实际组件数远远超过5个。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package chapter11; import java.awt.*; public class TestBorderLayout { public static void main(String[] args){ //创建一个顶级Window窗口 Frame f = new Frame("你好,世界!"); //设置窗口的布局管理器 f.setLayout(new BorderLayout(30, 5)); //创建面板 Panel p = new Panel(); //往面板中添加组件 p.add(new TextField("你好,世界!")); p.add(new Button("单击我")); //默认添加到中间 f.add(p); //往窗口中添加组件 f.add(new Button("东"), BorderLayout.EAST); f.add(new Button("南"), BorderLayout.SOUTH); f.add(new Button("北"), BorderLayout.NORTH); //优化布局 f.pack(); //显示窗口 f.setVisible(true); } }
3.3 GridLayout布局管理器
GridLayout布局管理器件将容器分割成纵横线分割的网格,每个网格所占的区域大小相同。当向使用GridLayout的容器中添加组件时,默认从左向右、从上向下添加到每个网格中,与FlowLayout不同的是,放在GridLayout布局管理器中的各组件的大小由组件所处的区域来决定(每个组件将自动涨大到占满整个区域。)
GridLayout有如下两个构造器:
1.GridLayout(int rows, int cols):采用指定行数、列数、默认横向间距、纵向间距将容器分成多个网格
2.GridLayout(int rows, int cols, int hgap, int vgap):采用指定行数、列数、指定横向间距、指定纵向间距将容器分成多个网格。
下面结合BorderLayout和GridLayout开发了一个计算器的可视化窗口:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package chapter11; import java.awt.*; public class TestGridLayout { public static void main(String[] args){ Frame f = new Frame("计算器"); Panel p1 = new Panel(); p1.add(new TextField("30")); f.add(p1, BorderLayout.NORTH); Panel p2 = new Panel(); //设置Panel p2使用的布局管理器 p2.setLayout(new GridLayout(5, 3, 4, 4)); String[] name = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "+", "-", "*", "/", "." }; //向Panel中添加15个按钮 for(int i = 0; i < name.length; i++){ p2.add(new Button(name[i])); } //默认将Panel对象添加到Frame中间 f.add(p2); //设置窗口最佳大小 f.pack(); //显示窗口 f.setVisible(true); } }
上面程序的Frame采用默认的布局管理器:BorderLayout布局管理器,程序向BorderLayout中只添加了两个组件:NORTH区域添加了一个文本框,CENTER区域添加了一个Panel容器,该容器采用GridLayout,Panel容器中添加了15个按钮。
上面程序Frame使用BorderLayout布局管理器,CENTER区域的Panel使用GridLayout布局管理器,实际上,大部分应用窗口都不能使用一个布局管理器直接做出来,必须采用这种嵌套的方式。
3.4 GridBagLayout布局管理器
GridBagLayout布局管理器是功能最强大,但也是最复杂的布局管理器,与GridLayout布局管理器不同的是:在GridBagLayout布局管理器中,一个组件可以跨越一个或多个网格,并可以设置各网格的大小互不相同,从而增加了布局的灵活性。当窗口的大小发生变化时,GridBagLayout布局管理也可以准确地控制窗口各部分的反应。
为了处理GridBagLayout中GUI组件的大小、跨越性,Java提供了GridBagConstraints对象,该对象与特定的GUI组件关联,用于控制该GUI组件的大小、跨越性。
使用GridBagLayout布局管理器的步骤如下:
1. 创建GridBagLayout布局管理器,并指定GUI容器使用该布局管理器,如下代码:
GridBagLayout gb = new GridBagLayout();
container.setLayout(gb);
2. 创建GridBagConstraints对象,并设置该对象的相关属性(用于设置受该对象控制的GUI组件的大小、跨越性等)。如下代码:
gbc.gridx = 2;//设置受该对象控制的GUI组件位于网格的横向索引
gbc.gridy = 1;//设置受该对象控制的GUI组件位于网格的横向索引
gbc.gridwidth = 2;//设置受该对象控制的GUI组件横向跨越多少网格
gbc.gridheight = 1;//设置受该对象控制的GUI组件纵向跨越多少网格
3. 调用Grid对象的方法来建立GridBagConstraints对象和受控制组件之间的关联。如下代码:
gb.setConstraints(c, gbc);//设置c组件受gbc对象控制
4. 添加组件,与采用普通布局管理器添加组件的方法完全意义,如下代码:
container.add(c)
如果需要向一个容器添加多个GUI组件,则需要多次重复上面的步骤,由于GridBagConstraints对象可以多次重用,所以实际上只需要创建一个GridBagConstraints对象即可,每次添加GUI组件之前先改变GridBagConstraints对象的属性即可。
从上面可以看出,使用GridBagLayout布局管理器的关键在于GridBagConstraints,它才是精确控制每个GUI组件的核心类,该类具有如下几个方法:
gridx、gridy:设置受该对象控制的GUI组件的左上角所在的网格的横向索引、纵向索引,除此之外,这两个值的值还可以是GridBagConstraints.RELATIVE,它表明当前组件紧跟在上一个组件之后。
gridwidth、gridheight:设置受该对象控制的GUI组件横向、纵向跨越多少个网格,两个属性值的默认值都是1。如果设置这两个属性值为GridBagConstraints.REMAINDER,这表明受该对象控制的GUI组件是横向、纵向最后一个组件;如果设置这两个属性值为GridBagConstraints.RELATIVE,这表明受对象控制的GUI组件是横向、纵向倒数第二个组件。
fill:设置受该对象控制的GUI组件如何占领空白区域。该属性可以接受如下几个属性值:
GridBagConstraints.NONE:GUI组件不扩大,HORIZONTAL:GUI组件水平扩大以占领空白区域,VERTICAL:GUI组件垂直扩大占领空白区域,BOTH:GUI组件水平、垂直同时扩大以占领空白区域。
insets:设置受该对象控制的GUI组件的外部填充的大小,即该组件边界和显示区域边界之间的距离。
weightx、weighty:设置受该对象控制的GUI组件占领多余空间的水平、垂直增加比例(也叫权重,即weight的直译),这两个属性的默认值是0,即该组件不占领多余空间。假设,某个容器的水平线上包括3个GUI组件,它们的水平增加比例分别是1、2、3,但容器增加宽度60像素,则依次增加10像素、20像素和30像素。
如果希望某个组件的大小会随容器的增大而增大,则必须同时设置控制该组件的GridBagConstraints对象的fill属性和weightx、weighty属性。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
从上图可以看出,虽然我们设置了按钮4、按钮5横向上不会扩大,但因为按钮4、按钮5的宽度会受上一行四个按钮的影响,所以它们实际上依然会变大,同理按钮8、9不会扩大,但因为受按钮7的影响,所以按钮9纵向上依然会变大,但按钮8不会变高。
3.5 CardLayout布局管理器
CardLayout布局管理器以时间而非空间来管理它里面的组件,它将加入容器的所有组件看成一叠卡片,每次只有最上面的那个Component才可见。就好像一副扑克牌,它们叠在一起,每次只有最上面的一张扑克牌才可见。CardLayout提供了如下两个构造器:
CardLayout():创建默认的CardLayout布局管理器
CardLayout(int hgap, int vgap):通过指定卡片与容器左右边界的间距、上下边界的间距来创建CardLayout布局管理器。
CardLayout用于控制组件可见的5个常用方:
first(Container target):显示target容器中第一个卡片
last(Container target):显示target容器中最后一个卡片
previous(Container target):显示target容器中前一个卡片
next(Container target):显示target容器中后一个卡片
show(Container target, String name):显示target容器中指定名字的卡片
下面的例子示范了CardLayout布局管理器的用法:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
上面程序中通过Frame创建了一个窗口,该窗口被分为上下两个部分,其中上面Panel使用CardLayout布局管理器,该Panel中放置了5张卡片,每张卡片里放一个按钮;下面的Panel使用FlowLayout布局管理器,依次放了5个按钮,用于控制上面Panel中卡片的5种显示方式,运行上面的程序,可以看到如下运行窗口:
3.6 绝对定位
Java也提供了那种拖控件的方式,即Java也可以对GUI进行绝对定位,步骤如下:
1.将Container的布局管理器设为null,即setLayout(null)
2.往容器上加组件的时候,先调用setBounds()或setSize()方法来先设置组件的大小、位置。或者直接创建GUI组件时通过构造参数指定该组件的大小、位置,然后将该组件添加到容器中。
下面程序示范了如何使用绝对定位来控制窗口中的GUI组件,程序如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
3.7 BoxLayout布局管理器
GridBagLayout布局管理器虽然功能强大,但它实在太复杂了,所以Swing引入了一个新的布局管理器:BoxLayout。它保留了GridBagLayout的很多优点,但是却没那么复杂。BoxLayout可以在垂直和水平两个方向上摆放GUI组件,BoxLayout提供了一个如下的简单构造器。
BoxLayout(Container target, int axis):指定创建基于target容器的BoxLayout布局管理器,该布局管理器组件按axis方向排列,其中axis有BoxLayout.X_AXIS(横向)和BoxLayout.Y_AXIS(纵向)两个方向。
下面程序示范了使用BoxLayout布局管理器来控制容器中按钮的布局:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
BoxLayout通常和Box容器结合使用,Box是一个特殊的容器,它有点像Panel容器,但该容器默认使用BoxLayout布局管理器,Box提供了如下两个静态方法来创建Box对象:
createHorizontalBox():创建一个水平排列组件的Box容器
createVerticalBox():创建垂直排列组件的Box容器
一旦获得了Box容器之后,就可以使用Box来盛装普通GUI组件,然后再将这些Box组件添加到其他容器中,从而形成整体的窗口布局:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
3.7 AWT常用组件
AWT组件需要调用运行平台的图形界面来创建和平台一致的对等体,所以AWT只能使用所有平台都支持的公共组件,所以AWT只提供了一些常用的GUI组件。
1.基本组件
AWT提供了如下基本组件:
Button:按钮,可接受单击操作。
Canvas:用于绘图的画布
Checkbox:复选框组件(也可编程单选框组件)
CheckboxGroup:用于将多个Checkbox组件组合在一组,一组Checkbox组件将只有一个可以被选中,即全部编程单选框组件。
Choice:下拉式选择框组件
Frame:窗口,在GUI程序里通过该类创建窗口
Label:标签类,用于放置提示性文本
List:列表框组件,可以添加多项条目
Panel:不能单独存在基本容器类,必须放到其他容器中
Scrollbar:滑动条组件,如果需要用户输入位于某个范围的值,就可以使用滑动条组件,如调色板中设置RGB的三个值所用的滑动条,当创建一个滑动条时,必须指定它的方向、初始值、滑块的大小、最小值和最大值。
ScrollPane:带水平及垂直滚动条的容器组件
TextArea:多行文本域
TextField:单行文本框
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
3.8 对话框
对话框是Window类的子类,是一个容器类,属于特殊组件,对话框也是可以独立存在的顶级窗口,用法和普通窗口几乎一样。但对话框有两点需要注意:
1.对话框通常依赖于其他窗口,就是通常有一个parent窗口
2.对话框有非模式和模式两种,当某个模式对话框被打开之后,该模式对话框总是位于它依赖的窗口之上;在模式对话框被关闭之前,它依赖的窗口无法获得焦点。
对话框有多个重载的构造器,她的构造器有如下三个参数:
owner:指定该对话框所依赖的窗口,既可以是窗口,也可以是对话框
title:指定该对话框的窗口标题
modal:指定该对话框是否是模式的,可以是true或false
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
Dialog类还有一个子类:FileDialog,它代表一个文件对话框,用于打开或者保存文件,FileDialog也提供了几个构造器,分别可支持parent、title和mode三个构造参数,其中parent、title指定文件对话框的所属父窗口和标题,而mode用于指定该窗口用于打开文件或保存文件,该参数支持如下两个参数值:FileDialog.LOAD、FileDialog.SAVE
FielDialog提供了如下两个方法来获取被打开/保存文件的路径:
1.getDirectory():获取FileDialog被打开/保存文件的绝对路径
2.getFile():获取FileDialog被打开/保存文件的文件名
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
这个对话框是由Windows平台提供的。