黑马程序员_java GUI学习总结

GUI是Java图形化用户接口,用图形的方式显示计算机操作界面与用户交互。使计算机使用操作简单直观。
与GUI相对的是CII命令行用户接口。就是常见的DOS命令。CII操作需要记住命令,十分不便,在普通用户市场已被GUI取代。

java GUI的对象都存在java.Awt与javax.Swing包中。
java.Awt   重量级组件,比较依靠平台,跨平台性较差。
javax.Swing 轻量级组件,跨平台性较强。

GUI 体系
            

Compent
      /     |______button
           /       ______Label
       Container   ______CheckBox
   /   \     ______TextComponet
     /     \              /\
     window   panet   TextArea TextFiled
       / \
      /   \
   Frame  Dialog
            |
         FileDialog

Container体系的组件可以添加右边Button,Label等组件。

组件布局
容器中的组件排放方式就是布局。
常见布局管理器:
FlowLayout:流式布局,水平方向的线性布局。
BorderLayout: 边界式布局。  上下左右中的布局。如果没有指明方向,组件就会填充整个屏幕。
GridLayout: 网格式布局
CardLayout: 卡片式布局

常用组件及其方法
Frame 窗体组件。
setVisble(boolean b)设置窗体是否为可见。
setBounds(int x,int y,int wid,int heigh)设置组件出现在屏幕的位置和组件的大小。
add(Componet comp)向组件里添加组件。
setLayout(Layout lay) 设置组件的布局管理器。
事件监听机制
当用户用鼠标或键盘操作屏幕上的图形界面时,就会得到计算机的反馈。
而以上事件就体现了图形化界面所使用的事件监听机制。
事件监听机制的流程:
   将监听器注册到事件源上(图形组件),事件源中封装了事件,监视器中封装了触发事件产生的动作(不止一个),及事件产生后的处理方式。当外部动作作用到了事件源上,监视器就会监听到该动作的发生并自动调用该事件产生后的处理方式。
如,用户用鼠标点击(外部动作)了确定按钮(事件源)。就产生了鼠标点击事件,注册在按钮上的监视器就会监听到该动作,并自动调用鼠标点击事件的处理方式对用户做出反馈。
以下代码将会演示GUI的一些常用组件的使用及事件监听机制的代码实现。

package com.ithei.GUI;
import java.awt.BorderLayout;
 import java.awt.FileDialog;
 import java.awt.Font;
 import java.awt.Frame;
 import java.awt.Menu;
 import java.awt.MenuBar;
 import java.awt.MenuItem;
 import java.awt.TextArea;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.awt.event.WindowAdapter;
 import java.awt.event.WindowEvent;
 import java.io.BufferedReader;
 import java.io.BufferedWriter;
 import java.io.File;
 import java.io.FileReader;
 import java.io.FileWriter;import javax.print.attribute.standard.Fidelity;
import IO.IOException;
/*
  * 本文件演示编写图形化界面做出类似记事本的软件,
  * 具有打开保存文件功能。
  */
 public class loadAndSaveFile {
  //定义Ui组件
  private Frame frame;
  private MenuBar mbar;
  private Menu menu;
  private MenuItem mitemLoad, mitemSave;
  private FileDialog fileDialog;
  private TextArea textA;
  private File file; public loadAndSaveFile() {
   init();
  }
 //初始化UI组件,并画好程序UI
  public void init() {
   frame = new Frame();
   frame.setLayout(new BorderLayout());
   frame.setBounds(300, 50, 700, 600);
   frame.setVisible(true);
   mbar = new MenuBar();
   menu = new Menu("文件");
   mitemLoad = new MenuItem("打开");
   mitemSave = new MenuItem("保存");
   menu.add(mitemLoad);
   menu.add(mitemSave);
   mbar.add(menu);
   frame.setMenuBar(mbar);
   textA = new TextArea();
   frame.add(textA);
   event(); }
 //完完成时间监听
  public void event() {
   // 给窗体添加活动监视器,主要监视关闭窗口事件。
   frame.addWindowListener(new WindowAdapter() {
    @Override
    public void windowClosing(WindowEvent e) {
     System.exit(0);
    }
   });
   // 给菜单条目添加活动监视器,以便监视用户是否要打开文件。
   //将用户选中要打开的文件写到文本域中
   mitemLoad.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
     // TODO Auto-generated method stub
     FileDialog fdialog_Load = new FileDialog(frame, "打开文件",
       FileDialog.LOAD);
     fdialog_Load.setVisible(true);
     String dectory = fdialog_Load.getDirectory();
     String fileName = fdialog_Load.getFile();
     if (dectory != null || fileName != null) {
      textA.setText("");
      BufferedReader br = null;
      file = new File(dectory, fileName);
      loadFile(br);
     }
    }
    //将文件的数据写到文本域
    private void loadFile(BufferedReader br) {
     try {
      br = new BufferedReader(new FileReader(file));
      String line = null;
      while ((line = br.readLine()) != null) {
       textA.append(line + "\r\n");
      }
      textA.setFont(new Font(Font.SERIF,15,25));
     } catch (Exception ex) {    } finally {
      if (br != null) {
       try {
        br.close();
       } catch (java.io.IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
       }
      }
     }
    }
   });
   // 给菜单条目添加活动监视器,以便监视用户是否要保存文件。
   //将文本域中的文件写到用户选中的目录中。
   mitemSave.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
     if (file != null) {
      BufferedWriter bw = null;
      saveFile(bw);
     } else {
      FileDialog fdialog_Save = new FileDialog(frame, "保存文件",
        FileDialog.SAVE);
      fdialog_Save.setVisible(true);
      String dectory = fdialog_Save.getDirectory();
      String fileName = fdialog_Save.getFile();
      if (dectory != null || fileName != null) {
       file = new File(dectory, fileName);
       BufferedWriter bw = null;
       saveFile(bw);
      }
     }
    }
    //将文本域的数据写到指定到文件里。
    private void saveFile(BufferedWriter bw) {
     try {
      bw = new BufferedWriter(new FileWriter(file));
      String text = textA.getText();
      bw.write(text);
     } catch (Exception ex1) {    } finally {
      if (bw != null) {
       try {
        bw.close();
       } catch (java.io.IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
       }
      }
     }
    }
   });
  } public static void main(String[] args) {
   loadAndSaveFile las = new loadAndSaveFile();
  }}

从上面代码可以总结几点
窗体事件及其事件监听处理方式
添加事件监听器的方法   addWindowLister(WindowLister w)
由于参数WindowLister接口中的抽象方法很多,实现起来很麻烦。可以实现其子类 WindowAdapter。

菜单的实现
菜单是一个常用的组件,实现方式如下
在MenuBar(菜单框架)中添加Menu(菜单)用add方法添加。
Menu中可以添加Menu和MenuItemt同样用add方法。
而向Container 组件添加MenuBar,则要用setMenuBar方法.

文件对话框
 该组件是用于帮助用户打开或保存文件时启用的对话框。其构造函数中的模式需注意
FileDialog(Frame parent,String title,int model)
当模式为:FileDialog.LOAD 为打开文件对话框。
当模式为:FileDialog.SAVE 为保存文件对话框。
重要方法:
String  getDirectory()  获取用户在文件对话框中选择的文件目录(文件夹)
String getFile()      获取用户在文件对话框中选择的文件名。