黑马程序员 —— 图形用户接口GUI (第二十二天)

来源:互联网 发布:罗蒙诺索夫知乎 编辑:程序博客网 时间:2024/06/07 05:11
------- android培训、java培训、期待与您交流! ----------

一   概述


1.GUI

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

2、CLI

  • Command line User Interface(命令行用户接口)
  • 就是常见的Dos命令行操作
  • 需要记忆一些常用的命令,操作不直观

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

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

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


二   GUI布局


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

2.常见的布局管理器:

(1)Flow Layout(流式布局管理器)

  • 从左到右的顺序排列
  • Panel默认的布局管理器

(2)BorderLayout(边界布局管理器)

  • 东、南、西、北、中(上下左右中)
  • Frame默认的布局管理器

(3)GridLayout(网格布局管理器)

  • 规则的矩阵

(4)CardLayout(卡片布局管理器)

  • 选项卡

(5)GridBagLayout(网格包布局管理器)

  • 非规则的布局      


三   GUI_Frame


创建图形化界面步骤如下:

  1. 常见frame窗体
  2. 对窗体进行基本设置(比如大小、位置、布局等等)
  3. 定义组件
  4. 将组件通过窗体的add方法添加到窗体中
  5. 让窗体显示,通过setVisible(true)


示例代码:

import java.awt.*;public class Demo {public static void main(String[] args) throws Exception {// 默认是边界布局Frame f = new Frame("my awt");// 窗口的长宽f.setSize(500, 400);// 窗口距离显示器边距的距离f.setLocation(300, 200);// 默认是边界布局f.setLayout(new FlowLayout());Button b = new Button("我是一个按钮");f.add(b);// 设置可见f.setVisible(true);sop("my awt");}public static void sop(Object obj) {System.out.println(obj);}}

上面的代码只是弄了个窗体显示,不会有任何反应。



四   事件监听机制


1.Container常用子类:Window Panel(面边,不能单独存在)
2.Window常用子类:Frame Dialog
3.简单的窗体创建过程:

Frame f = new Frame("my window");f.setLayout(new FlowLayout());f.setSize(500,400);//设置窗体大小f.setLocation(300,200);//设置窗体出现在屏幕的位置f.setVisible(true);
4.事件监听机制组成
  • 事件源(组件)就是awt或者swing包中的那些图形界面组件
  • 事件(Event)每一个事件源,都有自己的特有的对应事件,和共性事件
  • 监听器(Listener)将可以触发某一个事件的动作(不止一个动作)都已经封装到了监听器中
  • 事件处理方式(引发事件后处理方式)

5.组件EventListener在Java中,都已经定义好了,直接获取其对象来用就可以了。我们要做的就是对产生的动作进行处理。




五   窗体事件


要使图形化窗口的按钮有反应,要了解下面这些方法:

void addWindowListener(WindowListener l):添加指定的窗口侦听器,以从此窗口接收窗口事件


1.WindowListener为接口,要想使用,必须先实现方法,很麻烦。他有一个实现类,子类,实现了接口,不过为空方法。

  public abstract class WindowAdapter extends Object implements WindowListener, WindowStateListener, WindowFocusListener

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


2.事件

void windowActivated(WindowEvent e): 激活窗口时调用

void windowClosed(WindowEvent e):当窗口已被关闭时调用

void windowClosing(WindowEvent e): 窗口正处在关闭过程中时调用 

void windowDeactivated(WindowEvent e):停用窗口时调用

void windowDeiconified(WindowEvent e):取消图标化窗口时调用

void windowGainedFocus(WindowEvent e)

该 Window 被设置为聚焦 Window 时调用,聚焦 Window 意味着该 Window 或其某个子组件将接收键盘事件。

void windowIconified(WindowEvent e):图标化窗口时调用

void windowLostFocus(WindowEvent e)

该 Window 不再为聚焦 Window 时调用,不再为聚焦 Window 意味着键盘事件不再传递到该 Window 或其任意子组件。

void windowOpened(WindowEvent e)

已打开窗口时调用。

void windowStateChanged(WindowEvent e)

窗口状态改变时调用。


示例代码:

/*创建图形化界面1、常见frame窗体2、对窗体进行基本设置    比如大小、位置、布局。3、定义组件4、将组件通过窗体的add方法添加到窗体中5、让窗体显示,通过setvisible(true)*/import java.awt.*;import java.awt.event.*;public class Demo{    public static void main(String[] args) throws Exception{        //默认是边界布局        Frame f = new Frame("my awt");        //窗口的长宽        f.setSize(500,400);        //窗口距离显示器边距的距离        f.setLocation(300,200);        //默认是边界布局        f.setLayout(new FlowLayout());        //添加指定的窗口侦听器,以从此窗口接收窗口事件。        f.addWindowListener(new MyWin());        Button b = new Button("我是一个按钮");        f.add(b);        //设置可见        f.setVisible(true);        sop("my awt");    }       public static void sop(Object obj){        System.out.println(obj);    }}//因为WindowListener的子类WindowAdapter已经实现了WindowListener接口。//并覆盖了其中的所有方法,那么我只要继承自WindowAdapter覆盖我需要的方法即可。class MyWin extends WindowAdapter{    public void windowClosing(WindowEvent e){        Demo.sop("将要关闭");        System.exit(0);    }    public void windowOpened(WindowEvent e){        Demo.sop("我被打开");    }       public void windowActivated(WindowEvent e){        Demo.sop("激活");    }}


六   Action事件


事件监听机制

  • 确定事件源(容器或组件)
  • 通过事件源对象的addXXXLIstener()方法将监听器注册到该事件源上
  • 该方法中接收XXXListener的子类对象,或者XXXListener的子类XXXAdaper的子类对象
  • 一般用匿名内部类来表示
  • 在覆盖方法的时候,方法的参数一般是XXXEvent类型的变量接收
  • 事件出发后会把事件打包成对象传递给该变量。(其中包括事件源对象。通过getSource()或者,getComponet()获取)
import java.awt.*;import java.awt.event.*;public class Demo{    //定义图形中所需的组件的引用    private Frame f;    private Button but;        Demo(){        init();    }        public static void main(String[] args) throws Exception{        new Demo();    }        public void init(){        f = new Frame("my frame");        //对frame进行基本设置        //f.setSize(500,400);        //void setBounds(int x, int y, int width, int height)  移动组件并调整其大小。        f.setBounds(300,400,600,500);        f.setLayout(new FlowLayout());        but = new Button("退出");        //将组件添加到frame中        f.add(but);        //加载一下窗体上的事件        myEvent();        //显示窗体        f.setVisible(true);    }        private void myEvent(){        f.addWindowListener(new WindowAdapter(){            public void windowClosing(WindowEvent e){                System.exit(0);            }        });/*让按钮具备退出程序的功能      按钮就是事件源      那么选择哪个监听器呢?      通过关闭窗体示例了解到,想要知道那个组件具备什么样的特有监听器。      需要产看该组件对象的功能。      通过查阅button的描述,发现按钮支持一个特有监听,addActionListener*/        but.addActionListener(new ActionListener(){            public void actionPerformed(ActionEvent e){            System.out.println("按钮退出");                System.exit(0);            }        });    }        public static void sop(Object obj){        System.out.println(obj);    }}

七   鼠标事件

import java.awt.*;import java.awt.event.*;public class Demo {// 定义图形中所需的组件的引用private Frame f;private Button but;Demo() {init();}public static void main(String[] args) throws Exception {new Demo();}public void init() {f = new Frame("my frame");// 对frame进行基本设置// f.setSize(500,400);// void setBounds(int x, int y, int width, int height) 移动组件并调整其大小。f.setBounds(300, 400, 600, 500);f.setLayout(new FlowLayout());but = new Button("退出");// 将组件添加到frame中f.add(but);// 加载一下窗体上的事件myEvent();// 显示窗体f.setVisible(true);}private void myEvent() {f.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e) {System.exit(0);}});/* * 让按钮具备退出程序的功能 按钮就是事件源 那么选择哪个监听器呢? 通过关闭窗体示例了解到,想要知道那个组件具备什么样的特有监听器。 * 需要产看该组件对象的功能。 通过查阅button的描述,发现按钮支持一个特有监听,addActionListener */but.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {sop("鼠标活动");}});but.addMouseListener(new MouseAdapter() {private int count = 1;private int clickCount = 1;public void mouseEntered(MouseEvent e) {sop("鼠标进入事件" + (count++));}public void mouseClicked(MouseEvent e) {if (e.getClickCount() == 2) {sop("鼠标双击事件");} else {sop("鼠标点击事件" + (clickCount++));}}});}public static void sop(Object obj) {System.out.println(obj);}}


八   键盘事件

import java.awt.*;import java.awt.event.*;public class Demo {// 定义图形中所需的组件的引用private Frame f;private Button but;private TextField tf;Demo() {init();}public static void main(String[] args) throws Exception {new Demo();}public void init() {f = new Frame("my frame");// 对frame进行基本设置// f.setSize(500,400);// void setBounds(int x, int y, int width, int height) 移动组件并调整其大小。f.setBounds(300, 400, 600, 500);f.setLayout(new FlowLayout());but = new Button("退出");// 文本框tf = new TextField(20);// 将组件添加到frame中f.add(tf);f.add(but);// 加载一下窗体上的事件myEvent();// 显示窗体f.setVisible(true);}private void myEvent() {but.addKeyListener(new KeyAdapter() {public void keyPressed(KeyEvent e) {if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {System.exit(0);}if (e.isControlDown() && e.getKeyCode() == KeyEvent.VK_ENTER) {sop("ctrl + enter");}sop(KeyEvent.getKeyText(e.getKeyChar()) + "...."+ e.getKeyCode());}});tf.addKeyListener(new KeyAdapter() {public void keyPressed(KeyEvent e) {int code = e.getKeyCode();if (!(code >= KeyEvent.VK_0 && code <= KeyEvent.VK_9)) {sop(code + "是非法的");// 屏蔽键e.consume();}}});}public static void sop(Object obj) {System.out.println(obj);}}


九   练习:列出指定目录内容

import java.io.*;import java.util.*;import java.awt.*;import java.awt.event.*;public class Demo {private Frame f;private TextField tf;private Button but;private TextArea ta;Demo() {init();}public static void main(String[] args) throws Exception {new Demo();}public void init() {f = new Frame("my window");f.setLayout(new FlowLayout());f.setBounds(300, 100, 600, 500);tf = new TextField(60);but = new Button("转到");ta = new TextArea(25, 70);f.add(tf);f.add(but);f.add(ta);myEvent();f.setVisible(true);}private void myEvent() {f.addWindowListener(new WindowAdapter() {public void windowCloseing(WindowEvent e) {System.exit(0);}});but.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {String dirPath = tf.getText();tf.setText("");File dir = new File(dirPath);if (dir.exists() && dir.isDirectory()) {ta.setText("");String[] names = dir.list();for (String name : names) {ta.append(name + "\r\n");}}}});}public static void sop(Object obj) {System.out.println(obj);}}


十   对话框Dialog

import java.io.*;import java.util.*;import java.awt.*;import java.awt.event.*;public class Demo {private Frame f;private TextField tf;private Button but;private TextArea ta;private Dialog dl;private Label lab;private Dialog d;private Button okBut;Demo() {init();}public static void main(String[] args) throws Exception {new Demo();}public void init() {f = new Frame("my window");f.setLayout(new FlowLayout());f.setBounds(300, 100, 600, 500);tf = new TextField(60);but = new Button("转到");ta = new TextArea(25, 70);f.add(tf);f.add(but);f.add(ta);lab = new Label();d = new Dialog(f, "提示信息-self", true);okBut = new Button("确定");d.setBounds(400, 200, 240, 150);d.setLayout(new FlowLayout());d.add(lab);d.add(okBut);myEvent();f.setVisible(true);}private void myEvent() {f.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e) {System.exit(0);}});but.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {showDir();}});d.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e) {d.setVisible(false);}});okBut.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {d.setVisible(false);}});tf.addKeyListener(new KeyAdapter() {public void keyPressed(KeyEvent e) {if (e.getKeyCode() == KeyEvent.VK_ENTER) {showDir();}}});}public void showDir() {String dirPath = tf.getText();tf.setText("");File dir = new File(dirPath);if (dir.exists() && dir.isDirectory()) {ta.setText("");String[] names = dir.list();for (String name : names) {ta.append(name + "\r\n");}} else {String info = "您输入的信息:" + dirPath + "是错误路径,请重新输入。";lab.setText(info);d.setVisible(true);}}public static void sop(Object obj) {System.out.println(obj);}}



十一   菜单

import java.io.*;import java.util.*;import java.awt.*;import java.awt.event.*;public class Demo {private Frame f;private MenuBar mb;private Menu m, subMenu;private MenuItem closeItem, subItem;Demo() {init();}public static void main(String[] args) throws Exception {new Demo();}public void init() {f = new Frame("my window");f.setLayout(new FlowLayout());f.setBounds(300, 100, 500, 600);mb = new MenuBar();subMenu = new Menu("子菜单");m = new Menu("文件");closeItem = new MenuItem("退出");subItem = new MenuItem("子条目");subMenu.add(subItem);m.add(subMenu);m.add(closeItem);mb.add(m);myEvent();f.setMenuBar(mb);f.setVisible(true);}private void myEvent() {f.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e) {System.exit(0);}});closeItem.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {System.exit(0);}});}public static void sop(Object obj) {System.out.println(obj);}}


十二、十三   练习-打开、保存文件

import java.io.*;import java.util.*;import java.awt.*;import java.awt.event.*;public class Demo{    private Frame f;    private TextArea ta;    private MenuBar bar;    private Menu fileMenu;    private MenuItem openItem,saveItem,closeItem;    private FileDialog openDia,saveDia;    private File file;    Demo(){        init();    }    public static void main(String[] args) throws Exception{        new Demo();    }    public void init(){        f = new Frame("my window");        //f.setLayout(new FlowLayout());        f.setBounds(300,100,500,600);        ta = new  TextArea();        bar = new  MenuBar();        fileMenu  = new  Menu("文件");               openItem  = new MenuItem("打开");        saveItem  = new MenuItem("保存");        closeItem  = new MenuItem("退出");               fileMenu.add(openItem);        fileMenu.add(saveItem);        fileMenu.add(closeItem);        bar.add(fileMenu);               myEvent();               f.add(ta);        f.setMenuBar(bar);               openDia = new FileDialog(f,"我要打开",FileDialog.LOAD);        saveDia = new FileDialog(f,"我要保存",FileDialog.SAVE);                      f.setVisible(true);    }    private void myEvent(){        f.addWindowListener(new WindowAdapter(){            public void windowClosing(WindowEvent e){                System.exit(0);            }        });           openItem.addActionListener(new ActionListener(){            public void actionPerformed(ActionEvent e){                openDia.setVisible(true);                String dirPath = openDia.getDirectory();                String fileName = openDia.getFile();                if(dirPath==null||fileName==null)                    return;                ta.setText("");                openFile(dirPath,fileName);                f.setTitle("文件:"+dirPath+fileName);            }        });               saveItem.addActionListener(new ActionListener(){            public void actionPerformed(ActionEvent e){                if(file == null){                    saveDia.setVisible(true);                    String dirPath = saveDia.getDirectory();                    String fileName = saveDia.getFile();                    if(dirPath==null||fileName==null)                        return;                    saveFile(dirPath,fileName);                    f.setTitle("文件:"+dirPath+fileName);                }else{                    saveFile();                }            }        });               closeItem.addActionListener(new ActionListener(){            public void actionPerformed(ActionEvent e){                System.exit(0);            }        });    }    public void openFile(String dirPath,String fileName){        file = new File(dirPath,fileName);        try{            BufferedReader bufr = new BufferedReader(new FileReader(file));            String line = null;            while((line = bufr.readLine())!=null){                ta.append(line+"\r\n");            }        }catch(IOException ioe){            throw new RuntimeException("读取失败");        }    }    public void saveFile(){        saveFile(null,null);    }    public void saveFile(String dirPath,String fileName){        if(file==null){            file = new File(dirPath,fileName);        }        try{            BufferedWriter bufw = new BufferedWriter(new FileWriter(file));            String text = ta.getText();            bufw.write(text);            bufw.close();        }catch(IOException ioe){            throw new RuntimeException("读取失败");        }    }    public static void sop(Object obj){        System.out.println(obj);    }}


十四   jar包双击执行  


 jar -cvfm my.jar 1.txt mymenu
 Main-class: mymenu.Demo //要有空格和回车

------- android培训、java培训、期待与您交流! ----------

0 0
原创粉丝点击