---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

黑马程序员-------------(八)GUI(图形用户界面)

目录

一 GUI概述

    1.基础知识

    2.布局管理器

    3.创建图形化界面

二 事件监听机制

    1.事件监听机制组成

    2.事件监听机制的特点

    3.菜单

####################################################################################
一 GUI概述
####################################################################################

1.基础知识
计算机与用户有两种交互模式:GUI和CLI。
GUI (Graphical User Interface)图形用户接口。用图形的方式,来显示计算机操作的界面,方便直观。
CLI (Command line User Interface)命令行用户接口。就是常见的Dos命令行操作。需要记忆一些常用的命令,操作不直观。

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


Awt与 Swing
java.Awt:Abstract Window ToolKit (抽象窗口工具包),需要调用本地系统方法实现功能。属重量级控件。
javax.Swing:在AWT的基础上,建立的一套图形界面系统,其中提供了更多的组件,而且完全由Java实现。增强了移植性,属轻量级控件。


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


2.布局管理器

容器中的组件的排放方式,就是布局。
常见的布局管理器:
FlowLayout
流式布局管理器,从左到右的顺序排列。Panel默认的布局管理器。
BorderLayout
边界布局管理器,东,南,西,北,中。Frame默认的布局管理器。
GridLayout
网格布局管理器,规则的矩阵。
CardLayout
卡片布局管理器,选项卡。
GridBagLayout
网格包布局管理器,非规则的矩阵。

3.创建图形化界面

(1)创建frame窗体。
(2)对窗体进行基本设置。    比如大小,位置,布局。
(3)定义组件。
(4)将组件通过窗体的add方法添加到窗体中。
(5)让窗体显示,通过setVisible(true)
如果存在多种布局方式,如何创建窗体界面呢?
步骤:
1)先将窗体Frame进行大区域的划分,设置其布局管理器,加入面板Panel
2)将组建加入Panel,设置面板的布局管理器
简单的窗体创建过程:
Frame  f = new Frame('my window');
f.setLayout(new FlowLayout());
f.setSize(500,400);//设置窗体大小
f.setLocation(300,200);//设置窗体出现在屏幕的位置
Button button=new Button("button");
f.add(button);
f.setVisible(true);

用图形化界面产生了一个窗口后,发现按钮不起作用,可以点击,但是没有效果,也无法关闭,如何让按钮点击后出现我们希望的效果呢?这就需要引入事件监听机制。

####################################################################################
二 事件监听机制
####################################################################################
要实现一个按钮的功能,我们要建立监听机制,要不然按钮就只是按钮,没任何作用。当一个按钮建立时,我们就要为他的某个行为实施监听,当鼠标指向它或者单击它,双击它。监听系统监听到了某个操作,就马上传递给事件处理机制,做出相应的处理方式,如双击的处理方式是打开文件。


1.事件监听机制组成

(1)事件源:就是awt包或者swing包中的那些图形界面组件。
(2)事件:每一个事件源都有自己特有的对应事件和共性事件。
(3)监听器:将可以触发某一个事件的动作(不只一个动作)都已经封装到了监听器中。

以上三者,在java中都已经定义好了。直接获取其对象来用就可以了。
(4)事件处理:引发事件后对产生的动作进行处理

2.事件监听机制的特点

用户对组件的操作,就是一个事件,那么产生事件的组件就是事件源。接收并处理事件,与用户进行交互的行为就是事件处理器。这些处理方式都封装在监听器中。就如同开密码锁,为了安全,密码锁上安装了报警装置,只要锁被砸就会把锁事件通知保安。那么保安就有相应的处理方式。如果锁没有被砸,而是密码输入错误,那么报警装置也会将锁事件通知保安,保安也会处理方式。那么锁就是事件源,报警装置就是监听器,可以用来监听引发事件的动作。但必须要注册到锁上,否则锁被砸保安是不知道的。对于每一种动作都有不同的处理方式。处理方式由程序员自己定义。

3.事件监听机制的步骤:
(1)确定事件源(容器或组件)
(2)通过事件源对象的addXXXListener()方法将侦听器注册到该事件源上。
(3)该方法中接收XXXListener的子类对象,或者XXXListener的子类XXXAdapter的子类对象。一般用匿名内部类来表示。
(4)覆盖XXXListener的方法。在覆盖方法的时候,方法的参数一般是XXXEvent类型的变量接收。事件触发后会把事件打包成对象传递给该变量。
注意:
对于事件处理机制,采用了匿名内部类的方法,可以使代码简单化。但是WindowListener里面有7个抽象方法,要重写他的7个方法才能使用它。因此WindowLister为我们提供了一个它的子类WindowAdapter,这个子类实现了他的所有方法,但是都没有写内容,他就是一个载体,让我们只需要重写自己用到的方法就行了,因此简化的代码。


通过按钮关闭窗体。

 1 import java.awt.*;
 2 import java.awt.event.*;
 3 
 4 
 5 class  FrameDemo
 6 {
 7 
 8     //定义该图形中所需的组件的引用。
 9     private Frame f;
10     private Button but;
11 
12     FrameDemo()
13     {
14         init();
15     }
16 
17     public void init()
18     {
19         f = new Frame("my frame");
20 
21         //对frame进行基本设置。
22         f.setBounds(300,100,600,500);
23         f.setLayout(new FlowLayout());
24 
25         but = new Button("my button");
26 
27         //将组件添加到frame中
28         f.add(but);
29 
30 
31         //加载一下窗体上事件。
32         myEvent();
33 
34         //显示窗体;
35         f.setVisible(true);
36 
37     }
38     private void myEvent()
39     {
40         f.addWindowListener(new WindowAdapter()
41         {
42             public void windowClosing(WindowEvent e)
43             {
44                 System.exit(0);
45             }
46         });
47 //让按钮具备退出程序的功能
48 //按钮就是事件源。那么选择哪个监听器?通过关闭窗体示例了解到,想要知道哪个组件具备什么样的特有监听器。需要查看该组件对象的功能。
49 //通过查阅button的描述。发现按钮支持一个特有监听addActionListener。
50 
51         but.addActionListener(new ActionListener()
52         {
53             public void actionPerformed(ActionEvent e)
54             {
55                 System.out.println("退出,按钮干的");
56                 System.exit(0);
57             }
58         });
59     }
60     public static void main(String[] args)
61     {
62         new FrameDemo();
63     }
64 }

 


4.Dialog:
Dialog 是一个带标题和边界的顶层窗口,边界一般用于从用户处获得某种形式的输入。也就是对话框,当用户操作不当等情况,系统需
要告诉用户时,就用这种形式。当然它也是窗体,所以需要设置大小,显示与否等。

简单目录程序

  1 import java.awt.*;
  2 import java.awt.event.*;
  3 import java.io.*;
  4 class  MyWindowDemo
  5 {
  6         //定义组件
  7     private Frame f;
  8     private TextField tf;
  9     private Button but;
 10     private TextArea ta;
 11     
 12     private Dialog d;
 13     private Label lab;
 14     private Button okBut;
 15 
 16 
 17     MyWindowDemo()
 18     {
 19         init();
 20     }
 21     public void init()
 22     {
 23                 //创建组件对象
 24         f = new Frame("my window");
 25         f.setBounds(300,100,600,500);
 26         f.setLayout(new FlowLayout());
 27 
 28         tf = new TextField(60);
 29 
 30         but = new Button("转到");
 31 
 32         ta = new TextArea(25,70);
 33 
 34 
 35         d = new Dialog(f,"提示信息-self",true);
 36         d.setBounds(400,200,240,150);
 37         d.setLayout(new FlowLayout());
 38         lab = new Label();
 39         okBut = new Button("确定");
 40 
 41         d.add(lab);
 42         d.add(okBut);
 43 
 44 
 45 
 46         f.add(tf);
 47         f.add(but);
 48         f.add(ta);
 49 
 50 
 51         myEvent();
 52         f.setVisible(true);
 53     }
 54         //添加事件
 55     private void  myEvent()
 56     {
 57                //确定按钮活动监听
 58         okBut.addActionListener(new ActionListener()
 59         {
 60             public void actionPerformed(ActionEvent e)
 61             {
 62                 d.setVisible(false);
 63             }
 64         });
 65                  //对话框窗口监听
 66         d.addWindowListener(new WindowAdapter()
 67         {
 68             public void windowClosing(WindowEvent e)
 69             {
 70                 d.setVisible(false);
 71             }
 72         });
 73                 //文本框键盘监听
 74         tf.addKeyListener(new KeyAdapter()
 75         {
 76             public void keyPressed(KeyEvent e)
 77             {
 78                 if(e.getKeyCode()==KeyEvent.VK_ENTER)
 79                     showDir();
 80             }
 81         });
 82 
 83                  //按钮活动监听
 84         but.addActionListener(new ActionListener()
 85         {
 86             public void actionPerformed(ActionEvent e)
 87             {
 88                 showDir();
 89                 
 90             }
 91         });
 92                
 93                  //窗口监听
 94         f.addWindowListener(new WindowAdapter()
 95         {
 96             public void windowClosing(WindowEvent e)
 97             {
 98                 System.exit(0);    
 99             }
100         });
101     }
102          //列出目录
103     private void showDir()
104     {
105         String dirPath = tf.getText();
106                 
107         File dir = new File(dirPath);
108 
109         if(dir.exists() && dir.isDirectory())
110         {
111             ta.setText("");
112             String[] names = dir.list();
113             for(String name : names)
114             {
115                 ta.append(name+"\r\n");
116             }
117         }
118         else
119         {
120             String info = "您输入的信息:"+dirPath+"是错误的。请重输";
121             lab.setText(info);
122             d.setVisible(true);
123         }
124     }
125 
126     public static void main(String[] args) 
127     {
128         new MyWindowDemo();
129     }
130 }        


5.菜单


MenuBar 菜单栏、菜单条
Menu 菜单,有个小三角标记
MenuItem 菜单项、条目
先创建菜单栏,再创建菜单,每一个菜单中建立菜单项。也可以菜单添加到菜单中,作为子菜单。通过setMenuBar()方法,将菜单添加到Frame中。

练习:完成一个简单的记事本程序。

 

  1 import java.awt.*;
  2 import java.awt.event.*;
  3 import java.io.*;
  4 
  5 public class MyMenuTest
  6 {
  7        //定义组件
  8     private Frame f;
  9     private MenuBar bar;
 10     private TextArea ta;
 11     private Menu fileMenu;
 12     private MenuItem openItem,saveItem,closeItem;
 13     private FileDialog openDia,saveDia;
 14     private File file;
 15     MyMenuTest()
 16     {
 17         init();
 18     }
 19     public void init()
 20     {
 21                 //穿件组建对象并进行基本设置
 22         f = new Frame("my window");
 23         f.setBounds(300,100,650,600);
 24 
 25         bar = new MenuBar();
 26         ta = new TextArea();
 27         fileMenu = new Menu("文件");
 28         openItem = new MenuItem("打开");
 29         saveItem = new MenuItem("保存");
 30         closeItem = new MenuItem("退出");
 31         
 32         fileMenu.add(openItem);
 33         fileMenu.add(saveItem);
 34         fileMenu.add(closeItem);
 35         bar.add(fileMenu);
 36 
 37         f.setMenuBar(bar);
 38         openDia = new FileDialog(f,"我要打开",FileDialog.LOAD);
 39         saveDia = new FileDialog(f,"我要保存",FileDialog.SAVE);
 40         f.add(ta);
 41         myEvent();
 42         f.setVisible(true);
 43     }
 44         //定义事件
 45     private void myEvent()
 46     {
 47                 //保存条目活动监听
 48         saveItem.addActionListener(new ActionListener()
 49         {
 50             public void actionPerformed(ActionEvent e)
 51             {
 52                 if(file==null)
 53                 {
 54                     saveDia.setVisible(true);
 55                     String dirPath = saveDia.getDirectory();
 56                     String fileName = saveDia.getFile();
 57                     if(dirPath==null || fileName==null)
 58                         return ;
 59                     file = new File(dirPath,fileName);
 60                 }
 61                 try
 62                 {
 63                     BufferedWriter bufw  = new BufferedWriter(new FileWriter(file));
 64                     String text = ta.getText();
 65                     bufw.write(text);
 66                     //bufw.flush();
 67                     bufw.close();
 68                 }
 69                 catch (IOException ex)
 70                 {
 71                     throw new RuntimeException();
 72                 }
 73             }
 74         });
 75               //打开条目活动监听
 76         openItem.addActionListener(new ActionListener()
 77         {
 78             public void actionPerformed(ActionEvent e)
 79             {
 80                 openDia.setVisible(true);
 81                 String dirPath = openDia.getDirectory();
 82                 String fileName = openDia.getFile();
 83 //                System.out.println(dirPath+"..."+fileName);
 84                 if(dirPath==null || fileName==null)
 85                     return ;
 86                 ta.setText("");
 87                 file = new File(dirPath,fileName);
 88                 try
 89                 {
 90                     BufferedReader bufr = new BufferedReader(new FileReader(file));
 91                     String line = null;
 92                     while((line=bufr.readLine())!=null)
 93                     {
 94                         ta.append(line+"\r\n");
 95                     }
 96                     bufr.close();
 97                 }
 98                 catch (IOException ex)
 99                 {
100                     throw new RuntimeException("读取失败");
101                 }
102             }
103         });
104                //关闭条目活动监听
105         closeItem.addActionListener(new ActionListener()
106         {
107             public void actionPerformed(ActionEvent e)
108             {
109                 System.exit(0);
110             }
111         });
112         f.addWindowListener(new WindowAdapter()
113         {
114             public void windowClosing(WindowEvent e)
115             {
116                 System.exit(0);    
117             }
118         });
119     }
120     public static void main(String[] args) 
121     {
122         new MyMenuTest();
123     }
124 }

 

 

posted @ 2013-10-13 22:48  赵晨光  阅读(354)  评论(0编辑  收藏  举报
---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ------- --------------- 详细请查看:http://edu.csdn.net