java--GUI(图形用户接口)


转载请申明出处:http://blog.csdn.net/xmxkf/article/details/9795435

day22

01-GUI(概述)

GUI(图形用户界面)

1、 GUI(Griphical User Interface)图形用户接口

用图形的方式来显示计算机操作的界面,这样方便更直观。

2、 CLI(Command line User Interface)命令行用户接口

     就是常见的Dos命令行操作,需要记忆一些常用的命令,操作不直观。

举例:比如:创建文件夹,或者删除文件夹等

JAVA为GUI提供的对象都存在于java.Awt和javax.Swing两个包中

 

3、Awt与Swing       

    java . Awt:Abstract Window ToolKit(抽象窗口工具包)。需要调用本地系统方法实现功能。属于重量级控件。

    java .Swing:在AWT的基础上,建立的一套图形界面系统,其中提供了更多的组件,而且完全由java实现。强了移植性,属于轻量级控件

    还有swt包,eclipse就是用他开发界面

 

 

4、体系继承关系:

                                                                      Component  组件

                                                   Container--|                |-- Button

                                                 Panel--|                         |-- Lable

                                            Window --|                         |-- Checkbox

                                     Frame--|   框架                         |-- TextComponent

                                    Dialog --|                                                 |--TextArea

                       FileDialog--|                                                        |-- TextField

Container:是容器,是一个特殊的组件,该组件中可以通过add方法添加其他组件进来            

                

02-GUI(布局)

1、布局管理器:容器中的组件的排列方式,就是布局。

2、常见的布局管理器:

       FlowLayout(流式布局管理器) 从左到右的顺序排列。Panel默认的布局管理器。

       BorderLayout(边界布局管理器)  东南西北中。Frame默认的布局管理器。

       GridLayout(网格布局管理器)   计算器中的键  ;     规则的矩形。

       CardLayout(卡片布局管理器) 选择卡。

       GridBagLayout(网格包布局管理器)非规则的矩阵。


03-GUI(Frame)   一个简单窗体

建立一个简单的窗体:

  Container常用子类:Window  Panel(面板不能单独存在)

  Window常用子类:Frame  Dialog

简单的窗体创建过程:

import java.awt.*;

/*

 * 创建图形化界面:

 * 1,创建frame窗体

 * 2,对窗体进行基本设置,比如大小,位置,布局

 * 3,定义组件,让组件通过窗体的add方法添加到窗体中

 * 4,让窗体显示,通过setVisible(true)

 */

public class AwtDemo

{

       public static void main(String[]args)

       {

              Framef = new Frame("myawt");

              f.setSize(500,400);      //设置窗体大小

              f.setLocation(300,200);   //设置窗体出现在屏幕上的位置

              f.setLayout(newFlowLayout());    //为窗体设置流式布局管理器

             

              Buttonb = new Button("我是按钮");

              f.add(b);     //添加按钮

             

              f.setVisible(true);    //设置窗体可见

       }

}

                                                             

04-GUI(事件监听机制)                                                               

1、事件监听机制组成:

事件源(组件)                相当于c#中控件 (按钮)  btn_myBtn

事件(Event)                相当于按钮的点击事件(Click)

监听器(Listener)

相当于c#中委托 this.btn_myBtn.Click += new System.EventHandler(this.btn_myBtn_Click);  

事件处理(引发事件后处理方式)相当于点击后的方法    btn_myBtn_Click()

 

2、事件源:就是awt包或者swing包中的那些图形界面组件;

事件:每个事件源都有自己特有的对应事件和共性事件;

监听器:将可以触发某一个事件的动作(不止一个动作)都已经封装到了监听器中;

以上三者在java中都定义好了。直接获取其对象来用就可以了。我们要做的事情就是对产生的动作进行处理。

理解:其实就是   事件源。Add监听器(new 监听器 {处理动作(事件 e){动作}});

      事件源调用自己的方法添加监听器对象;监听器中封装了很多动作(方法),这些方法的参数是一个事件对象;当事件发生时,监听器对象中的方法会接受事件对象,并产生相应的动作,也就是处理动作(监听器类中的方法)

 

 

05-GUI(窗体事件)

1、在java.awt.event包中封装了很多事件类和监听器类。当窗体添加了监听器的实例,监听器就可以监听窗体的很多事件,因为监听器中有很多相对应的方法,这些方法可以接受事件对象作为参数,当某事件产生就会调用相对应的方法,这样实现监听。

2、比如:

WindowListener用于接收窗口事件的监听器接口,里面封装了7个方法(敞口打开,关闭,活动等)。处理窗口事件的类要实现此接口并覆盖里面7个方法才能创建监听器对象,这是很不方便的。

WindowAdapter实现了此接口,并复写了7个方法,但是方法体都为空

Public voidwindowClosed(WindowEvent e){};创建它的对象也没有意义,所以干脆加上abstract,让它成为抽象类不能创建对象。处理窗口事件的类继承此抽象类后就可创建监听器对象。并且不用全部复写七种方法,需要哪个就覆盖那个。

 

3、窗口添加事件监听示例:

第一种方式:自定义外部监听器类继承WindowAdapter,

class MyWin extends WindowAdapter

{

       public voidwindowClosing(WindowEvent e)

       {

              System.out.println(e.toString());

              //java.awt.event.WindowEvent[WINDOW_CLOSING,opposite=null

              //,oldState=0,newState=0] on frame0

              System.exit(0);

 

       }

}

 

f.addWindowListener(new MyWin());  //外部监听类对象

 

第二种方式:创建WindowAdapter子类匿名对象,复写其方法

              f.addWindowListener(newWindowAdapter()   //匿名类监听器对象

              {

                     //关闭事件发生时调用

                     publicvoidwindowClosing(WindowEvent e)

                     {

                            System.exit(0);

}

         }

 

06-GUI(Action事件)

1、如果想要让按钮具备退出程序的功能:

   按钮就是事件源。那么选择哪个监听器呢?

通过关闭窗口示例了解到,想要知道那个组件具备什么样的特有监听器,需要查看该组件对象的功能。通过查阅Button的描述,发现按钮支持一个特有监听addActionListener。

but.addActionListener(new ActionListener()

              {

                     publicvoidactionPerformed(ActionEvent e)

                     {

                            System.out.println("退出,按钮干的");

                            System.exit(0);

                     }

  });

2、发现ActionListener接口没有适配器ActionAdapter,因为此接口中只有一个抽象方法。适配器的作用是方便创建监听器对象,所以实现接口复写方法。其实没有适配器的监         听器接口是很少的,一般有3个以上方法的监听器都有对应适配器。


07-GUI(鼠标事件)

几乎所有组件都可添加鼠标和键盘监听器,所以,这两个监听器的添加方法在Component中活动监听器

but.addActionListener(new ActionListener()

                     {

                            publicvoidactionPerformed(ActionEvent e)

                            {

                                   System.out.println("Actionok");

                            }

                     });

              鼠标监听器

                     but.addMouseListener(new MouseAdapter()

                     {

                            privateint count = 1;

                            privateint clickCount=1;

                            //鼠标进入到组件上时调用

                            publicvoidmouseEntered(MouseEvent e) 

                            {

                                   System.out.println("鼠标进入到该组件"+count++);

                            }

                            //鼠标按键在组件上单击(按下并释放)时调用

                            publicvoidmouseClicked(MouseEvent e)

                            {

                                   if(e.getClickCount()==2)   //点击事件对象的方法,获取点击次数

                                          System.out.println("双击"+clickCount++);

                            }

                     });

 

08-GUI(键盘事件)

1、按钮添加键盘监听器:

but.addKeyListener(new KeyAdapter()

{//键盘按下事件

       public voidkeyPressed(KeyEvent e)

       {

              if(e.isControlDown()&& e.getKeyCode()==KeyEvent.VK_ENTER)

                     System.out.println("Ctrl +enter is pressed");

              //静态方法getKeyTextint keyCode)获取一个键的文本

              //getKeyCode() 获取一个键关联的整数                       System.out.println(KeyEvent.getKeyText(e.getKeyCode())+""+e.getKeyCode());

       }

});

 

2、文本框添加键盘监听事件(屏蔽键)

   在KeyEvent事件类的父类InputEvent中有一个方法consume();

   调用此方法以便不会按照默认的方式处理此事件

    //文本框添加键盘监听器

       tf.addKeyListener(new KeyAdapter()

       {

              public voidkeyPressed(KeyEvent e)

              {

                     int code =e.getKeyCode();   //获取键关联的整数

                     //文本框中只能输入数字(屏蔽键)

                     if(!(code>=KeyEvent.VK_0 &&code<=KeyEvent.VK_9))

                     {

                            System.out.println(e.getKeyText(code)+code+"……非法");

                            //使用此事件,以便不会按照默认的方式由产生此事件的源代码来处理此事件。

                            e.consume();  //默认是将按下的键添加到文本框中。注意这里不是将监听器删掉

                     }

              }

});


09-GUI(练习-列出指定目录内容)           MyWindowDemo  

 需求:列出指定目录内容

 分析:1、文本框TextField    按钮Button   文本区TextArea

          2、当点击按钮时,获取文本框中路径封装成对象,

             然后用Field类list方法列出路径中所有文件名,遍历追加到文本区

but.addActionListener(new ActionListener()

              {

                     publicvoidactionPerformed(ActionEvent e)

                     {

                            StringdirPath = tf.getText();

                            Filedir = new File(dirPath);  //将路径封装成抽象路径对象

                            if(dir.exists()&& dir.isDirectory())  //路径存在而且是目录

                            {

                                   ta.setText("");  //如果存在且是目录,先清空文本区

                                   String[]names = dir.list();        //列出目录下所有文件名

                                   for(String name :names)

                                   {

                                          //将文本追加到文本区后面,而不是setText()

                                          ta.append(name+"\r\n");

                                   }

                            }                           }

                     }

});

 

10-GUI(对话框Dialog)

1、Dialog是Window的子类,modal - 指定在显示的时候是否阻止用户将内容输入到其他顶级窗口中(false , true)

他还有子类FileDialog(文件对话框)

2、FileDialog 类显示一个对话框窗口,用户可以从中选择文件;mode - 对话框的模式,FileDialog.LOADFileDialog.SAVE(打开和保存)

示例:  FileDialog openDia = newFileDialog(f,“打开”,FileDialog.LOAD);

 

//对话框(依照的窗体,对话框头名,模式),对话框也是窗体

           //模式设置为true后,不处理对话框不能操作窗体f

           d = new Dialog(f,"提示信息-self",true);   

           d.setBounds(400,200, 240, 150);

           d.setLayout(new FlowLayout());

           lab = new Label();

           okBut = new Button("确定");

           d.add(lab);

d.add(okBut);

 

//对话框添加事件监听

              d.addWindowListener(new WindowAdapter()

              {

                     publicvoidwindowClosing(WindowEvent e)

                     {

                            d.setVisible(false);

                     }                               

      });

在上面例子中,当输入路径不存在时,弹出对话框:

else

           {

                     lab.setText("输入的"+dirPath+"不存在,请重新输入");

                     d.setVisible(true);  //对话框可见

     }

 

11-GUI(菜单) MyMenuDemo

MenuComponent

|-- MenuBar  菜单栏  

|-- MenuItem  菜单项                            

        |-- Menu 菜单              

 

Menu是MenuItem子类,Menu中的add(MenuItem im)方法可以添加父类(菜单项)也可添加菜单,多态。可以理解:菜单项可以是个菜单(子菜单)

public void init()                                         

       {                                   

              f = new Frame("菜单");

              f.setBounds(300,100, 500, 600);

              f.setLayout(new FlowLayout());

             

              mb = new MenuBar();    //菜单栏                         

               m = new Menu("文件");   //菜单                        文件

              subMenu = new Menu("子菜单");                          子菜单> 子条目

              ssubItem = new MenuItem("子条目");                      条目

              subItem = new MenuItem("条目");                        退出

              closeItem = new MenuItem("退出");

                           

              f.setMenuBar(mb); //窗体设置菜单栏

              mb.add(m);            //菜单栏中添加菜单

              m.add(subMenu);  //菜单中添加子菜单

              subMenu.add(ssubItem); //子菜单中添加菜单项

              m.add(subItem);    //菜单中添加菜单项

              m.add(closeItem);  //菜单中添加菜单项

             

              myEvent();

              f.setVisible(true);  

}

点退出就结束程序:MenuItem可以添加ActionListener事件监听,Menu继承。让closeItem.addActionListener(new ActionListener(){  });            

 

 

12-GUI(练习-打开文件,,保存文件)          

需求:用TextArea  FileDialog  Menu组件等完成一个打开和保存文件的小程序

//点打开时弹出打开文件对话框,并实现对文本文件的打开

              openItem.addActionListener(new ActionListener()

              {

                     publicvoidactionPerformed(ActionEvent e)

                     {

                            openDia.setVisible(true);  //打开文件 对话框可视

                            //获取 获取此文件对话框的目录

                            StringdirPath = openDia.getDirectory();  

                            // 获取此文件对话框的选定文件。

                            StringfileName = openDia.getFile();

                     //     System.out.println(dirPath+"   "+fileName);

                            if(dirPath==null || fileName ==null)

                                   return;        //不写这句话,当点取消时会出异常,没有选文件

                           

                            ta.setText("");

                            Filefile = new File(dirPath, fileName);

                            try

                            {

                                   BufferedReaderbufr =new BufferedReader(new FileReader(file));

                                   Stringline = null;

                                   while((line=bufr.readLine())!=null)

                                   {

                                          ta.append(line+"\r\n");

                                   }

                                   bufr.close();

                            }

                            catch(IOException ex)

                            {

                                   thrownew RuntimeException("读取失败");

                            }

                     }

              });

             

              //点保存时当文件名不存在弹出保存文件对话框,并实现对文本文件的保存

              //文件名存在时直接保存,这里存在指的是第一次存储后没有关闭程序,再去存储,file全局变量

              saveItem.addActionListener(new ActionListener()

              {

                     publicvoidactionPerformed(ActionEvent e)

                     {

                            if(file==null)

                            {

                                   saveDia.setVisible(true);

                                   //获取要存储的文件对象

                                   StringdirPath = saveDia.getDirectory();    //获取存储文件目录

                                   StringfileName = saveDia.getFile();     //获取要存储的文件名

                                   //当叉掉对话框或点取消时,没有获取到,下面创建文件对象就会出异常

                                   if(dirPath==null || fileName ==null)

                                          return;         

                                   file =newFile(dirPath,fileName);

                            }

                            try

                            {

                                   BufferedWriterbufw = new BufferedWriter(new FileWriter(file));

                                   Stringtext = ta.getText();

                                   bufw.write(text);

                                   bufw.close();

                            }

                            catch(IOException ex)

                            {

                                   thrownew RuntimeException("存储文件失败");

                            }

                     }

                                                                      });


你可能感兴趣的:(java,编程,GUI,swing)