『黑马程序员』第八话<GUI>

来源:互联网 发布:dns 端口 编辑:程序博客网 时间:2024/05/16 08:33


1、GUI概述

GUI(图形用户界面)

Graphical User Interface(图形用户接口)。用图形的方式,来显示计算机操作的界面,这样更方便更直观。

CLI:Command Line User Interface(命令行用户接口),就是常见的dos命令行操作。需要记忆一些常用的命令,操作不直观。

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

Awt与Swing

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

       javax.Swing:在AWT的基础上,简历的一套图形界面系统,其中提供了更多的组件,而且完全有Java实现。增强了移植性,属轻量级控件。

轻量级与重量级的区别?

主要是与系统组件的关联大不大,需要调用本地系统方法去实现功能的属于重量级控件;直接调用自身功能的组件属于轻量级控件,与系统平台依耐性不大,增强了可移植性。

继承关系图

Component:构件、组件

       --|Button:按钮

       --|Label:标签

       --|Checkbox:复选框

       --|TextComponent:文本组件

              --|TextArea:单行文本

              --|TextField:多行文本

 

       --|Container:容器

              --|Window:窗口

                     --|Frame:框架

                     --|Dialog:对话框

                            --|FileDialog:文件对话框

              --|Panel:面板

 

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


2、GUI-布局

布局管理器

       容器中组件的排放方式,就是布局。

常见的布局管理器:

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

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

       GridLayout(网格布局管理器):规则的

       CardLayout(卡片布局管理器):选项

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


3、GUI-Frame

事件监听机制组成

事件源(组件)、时间(Event)、监听器(Listener)、时间处理(引发事件后处理方式)

WindowAdapter:接收窗口事件的抽象适配器类,此类中的方法为空,此类存在的目的是方便创建监听器对象。

创建图形化界面:

1.创建frame窗体。

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

3.定义组件。

4.将组件通过窗体的add方法添加到窗体中。

5.让窗体显示,通过setVisible(true)实现

 

4、GUI-事件监听机制

事件监听机制的特点:

1.事件源;

2.事件;

3.监听器;

4.事件处理。

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

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

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

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

 

WindowAdapter 接收窗口事件的抽象适配器类,此类中的方法为空,此类存在的目的是方便创建监听器对象。

5、GUI—Action事件

将事件与图形化界面分离出来

void setBounds(int x, int y, int width, intheight) 移动组件并调整其大小

6、GUI—鼠标键盘事件

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

boolean isControlDown() :返回Control修饰符在此事件上时为down,即ctrl+组合键,判断 ctrl键是否被按下

7、练习:列出制定目录内容

void append(String str) :将给定文本追加到文本区的当前文本。

Dialog(Dialog owner, String title, booleanmodal): 构造一个最初不可见的Dialog,它带有指定       的所有者Dialog、标题和模式。

import java.awt.*;
import java.awt.event.*;
import java.io.*;
class MyWindowDemo
{
       private Frame f;
       private TextField tf;
       private Button but;
       private TextArea ta;//文本区域rows:行,columns:列
 
       private Dialog d;
       private Label lab;//对话框里面不能直接创建文本
       private Button okBut;
 
       MyWindowDemo()
       {
              init();
       }
       public void init()
       {
              f = new Frame("my window");
              f.setBounds(300,100,600,500);
              f.setLayout(new FlowLayout());
 
              tf = new TextField(60);
 
              but = new Button("转到");
              ta = new TextArea(25,70);
              d = new Dialog(f,"提示信息-self",true);//如果模式为true,则只能操作当前窗口;反之则均可操作。
              d.setBounds(400,200,300,150);
              d.setLayout(new FlowLayout());
 
              lab = new Label();
              okBut = new Button("确定");
 
              d.add(lab);
              d.add(okBut);
 
              f.add(tf);
              f.add(but);
              f.add(ta);
 
              myEvent();//添加事件
              f.setVisible(true);
       }
       private void myEvent()
       {
              okBut.addActionListener(new ActionListener()
              {
                     public void actionPerformed(ActionEvent e)
                     {
                            d.setVisible(false);
                     }
              });
              d.addWindowListener(new WindowAdapter()
              {
                     public void windowClosing(WindowEvent e)
                     {
                            d.setVisible(false);
                     }
              });
<SPAN style="WHITE-SPACE: pre"> </SPAN>      //发现一点不足的是,在弹出的对话框中可以再次使用键盘监听机制使其直接利用键盘让对话框消失。
<SPAN style="WHITE-SPACE: pre"> </SPAN>      okBut.addKeyListener(new KeyAdapter()
              {
                     public void keyPressed(KeyEvent e)
                     {
                            if(e.getKeyCode()==KeyEvent.VK_ENTER)
                                   d.setVisible(false);
                     }
              });
              tf.addKeyListener(new KeyAdapter()
              {
                     public void keyPressed(KeyEvent e)
                     {
                            if(e.getKeyCode()==KeyEvent.VK_ENTER)
                                   showDir();
                     }
              });
              but.addActionListener(new ActionListener()
              {
                     public void actionPerformed(ActionEvent e)
                     {
                            /*
                            String text = tf.getText();
                            ta.setText(text);//将输入框中(TextField)的文字添加到输入文本框中(TextArea)
                            //System.out.println(text);
                            tf.setText("");//清空输入框中(TextField)的内容
                            */
                            showDir();
                           
                     }
              });
              f.addWindowListener(new WindowAdapter()
              {
                     public void windowClosing(WindowEvent e)
                     {
                            System.exit(0);
                     }
              });
       }
       private void showDir()
       {
              String dirPath =  tf.getText();
              File dir = new File(dirPath);
 
              if(dir.exists() &&dir.isDirectory())
              {
                     ta.setText("");//将之前内容清空
                     String[]names = dir.list();
                     for(Stringname: names)
                     {
                            ta.append(name+"\r\n");//追加文本
                     }
              }
              else
              {
                     Stringinfo = "您输入的信息:"+dirPath+"有误,请重新输入";
//将文本添加到对话框中
                     lab.setText(info);
                     d.setVisible(true);
              }
       }
 
       public static void main(String[] args)
       {
              new MyWindowDemo();
       }
}

8、GUI—菜单

public class FileDailog extends Dialog:FileDialog类显示一个对话框窗口,用户可以从中选择文件。由于它是一个模式对话框,当应用程序调用其show方法来显示对话框时,它将阻塞其余应用程序,知道用户选择一个文件。

public FileDialog(Frame parent,Stringtitle,int node)  :创建一个具有指定标题的文件对话框窗口,用于加载或保存文件。如果node的值为LOAD,那么文件对话框将查找药读取的文件,所显示的文件时当前目录中的文件。如果node的值为SAVE,则文件对话框将查找药写入文件的位置。


0 0