zoukankan      html  css  js  c++  java
  • 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的布局管理器。

    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);
        }
    }
    View Code

    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的用法:

    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);
        }
    }
    View Code

    BorderLayout最多只能放5个组件,但可以放少于5个组件,如果某个区域没有放置组件,该区域并不会出现空白,旁边区域的组件会自动占据该区域,从而保证窗口有较好的外观。虽然BorderLayout最多只能放5个组件,但因为容器也是一个组件,所以我们可以先向Panel里添加多个组件,再把Panel添加到BorderLayout布局管理器中,从而让BorderLayout布局管理器中的实际组件数远远超过5个。

    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);
        }
    }
    View Code

    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开发了一个计算器的可视化窗口:

    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);
            
        }
    }
    View Code

      上面程序的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属性。

    View Code

      从上图可以看出,虽然我们设置了按钮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布局管理器的用法:

    View Code

      上面程序中通过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组件,程序如下:

    View Code

    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布局管理器来控制容器中按钮的布局:

    View Code

      BoxLayout通常和Box容器结合使用,Box是一个特殊的容器,它有点像Panel容器,但该容器默认使用BoxLayout布局管理器,Box提供了如下两个静态方法来创建Box对象:
    createHorizontalBox():创建一个水平排列组件的Box容器
    createVerticalBox():创建垂直排列组件的Box容器
    一旦获得了Box容器之后,就可以使用Box来盛装普通GUI组件,然后再将这些Box组件添加到其他容器中,从而形成整体的窗口布局:

    View Code

    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:单行文本框

    View Code

    3.8 对话框                             

      对话框是Window类的子类,是一个容器类,属于特殊组件,对话框也是可以独立存在的顶级窗口,用法和普通窗口几乎一样。但对话框有两点需要注意:
    1.对话框通常依赖于其他窗口,就是通常有一个parent窗口
    2.对话框有非模式和模式两种,当某个模式对话框被打开之后,该模式对话框总是位于它依赖的窗口之上;在模式对话框被关闭之前,它依赖的窗口无法获得焦点。
    对话框有多个重载的构造器,她的构造器有如下三个参数:
    owner:指定该对话框所依赖的窗口,既可以是窗口,也可以是对话框
    title:指定该对话框的窗口标题
    modal:指定该对话框是否是模式的,可以是true或false

    View Code

    Dialog类还有一个子类:FileDialog,它代表一个文件对话框,用于打开或者保存文件,FileDialog也提供了几个构造器,分别可支持parent、title和mode三个构造参数,其中parent、title指定文件对话框的所属父窗口和标题,而mode用于指定该窗口用于打开文件或保存文件,该参数支持如下两个参数值:FileDialog.LOAD、FileDialog.SAVE
    FielDialog提供了如下两个方法来获取被打开/保存文件的路径:
    1.getDirectory():获取FileDialog被打开/保存文件的绝对路径
    2.getFile():获取FileDialog被打开/保存文件的文件名

    View Code

      这个对话框是由Windows平台提供的。

  • 相关阅读:
    SharePoint 2010 User Profile Sync Service自动停止
    如何区别多个svchost.exe?
    Log Parser分析IIS log的一个简单例子
    Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.
    Windows中右键点击文件夹, 结果找不到共享选项卡, 怎么办?
    介绍SOS中的SaveModule命令
    SharePoint中Draft版本的文档不会收到document added的Alert Email
    和我一起学Windows Workflow Foundation(1)创建和调试一个WF实例
    门户网站
    C#基础—— check、lock、using语句归纳
  • 原文地址:https://www.cnblogs.com/people/p/3078957.html
Copyright © 2011-2022 走看看