黑马程序员-关于GUI图形用户界面的总结

------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------


概述:

GUI
   Graphical User Interface(图形用户接口)。
   用图形的方式,来显示计算机操作的界面,这样更方   便更直观。
*CLI
   Command line User Interface(命令行用户接口)。
   就是常见的Dos命令行操作。
   需要记忆一些常用的命令,操作不直观。
*举例:
   比如:创建文件夹,或者删除文件夹等。

java也将这种界面封装为对象,其中的对象都放在了两个包中:java.Awt包和javax.Swing包。
java.Awt包:Abstract Window Toolkit,即抽象窗口工具箱。要调用本地系统方法实现功能,属重量级控件。
javax.Swing包:在AWT的基础上建立的一套图形界面系统,其中提供了更多的组件,且完全有java实现,增强了移植性,属轻量级控件。

继承关系
Component
   |--Container
      |--Window
         |--Frame
         |--Dialog
            |--FileDialog
      |--Panel
   |--Button
   |--Lable
   |--Checkbox
   |--TextComponent
      |--TextArea
      |--TextField
Container:为容器,是一个特殊的组件,该组件中可以通过add方法添加其他组件进来。

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


一: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);  

    }  

}  


二、事件监听机制
    1Container常用子类:Window Panel(面边,不能单独存在)
    2Window常用子类:Frame Dialog
    3、简单的窗体创建过程:
        (1)Frame f = new Frame("my window");
        (2)f.setLayout(new FlowLayout());
        (3)f.setSize(500,400);//设置窗体大小
        (4)f.setLocation(300,200);//设置窗体出现在屏幕的位置
        (5)f.setVisible(true);
    4、事件监听机制组成
        (1)、事件源(组件)
            就是awt或者swing包中的那些图形界面组件
        (2)、事件(Event
            每一个事件源,都有自己的特有的对应事件,和共性事件
        (3)、监听器(Listener
            将可以触发某一个事件的动作(不止一个动作)都已经封装到了监听器中
        (4)、事件处理方式(引发事件后处理方式)
    5(1)~(3)java中,都已经定义好了,直接获取其对象来用就可以了,我们亚欧走的事情就是,对产生的动作进行处理。

    窗体事件:
     void addWindowListener(WindowListener l) 
          添加指定的窗口侦听器,以从此窗口接收窗口事件。 
    1WindowListener为接口,要想使用,必须先实现方法,很麻烦。他有一个实现类,子类,实现了接口,不过为空方法。
        public abstractclass WindowAdapter extends Object implements WindowListener,WindowStateListener, WindowFocusListener接收窗口事件的抽象适配器类。此类中的方法为空。此类存在的目的是方便创建侦听器对象。
    2、事件
    void windowActivated(WindowEvente) 
          激活窗口时调用。 
 void windowClosed(WindowEvent e) 
          当窗口已被关闭时调用。 
 void windowClosing(WindowEvent e) 
          窗口正处在关闭过程中时调用。 
 void windowDeactivated(WindowEvente) 
          停用窗口时调用。 
 void windowDeiconified(WindowEvent e) 
          取消图标化窗口时调用。 
 void windowGainedFocus(WindowEvente) 
          Window 被设置为聚焦 Window 时调用,聚焦 Window意味着该 Window 或其某个子组件将接收键盘事件。 
 void windowIconified(WindowEvent e) 
          图标化窗口时调用。 
 void windowLostFocus(WindowEvent e) 
          Window 不再为聚焦 Window 时调用,不再为聚焦 Window意味着键盘事件不再传递到该 Window 或其任意子组件。 
 void windowOpened(WindowEvent e) 
          已打开窗口时调用。 
 void windowStateChanged(WindowEvente) 
          窗口状态改变时调用。 

代码示例:

/* 

创建图形化界面 

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);  

    }  

}  

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事件
    1、事件监听机制
        (1)、确定事件源(容器或组件)
        (2)、通过事件源对象的addXXXLIstener()方法将监听器注册到该事件源上
        (3)、该方法中接收XXXListener的子类对象,或者XXXListener的子类XXXAdaper的子类对象
        (4)、一般用匿名内部类来表示
        (5)、再覆盖方法的时候,方法的参数一般是XXXEvent类型的变量接收
        (6)、事件出发后会把事件打包成对象传递给该变量。(其中包括事件源对象。通过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.*;  

class MouseAndKeyEvent  

{  

    //创建全局变量   

    private Frame f = null;  

    private Button but = null;  

    private TextField tf;  

    //初始化窗体   

    MouseAndKeyEvent(){  

        init();  

    }  

    //创建窗体   

    public void init(){  

        f = new Frame("my frame");  

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

        f.setLayout(new FlowLayout());  

        tf = new TextField(20);  

        but = new Button("button");  

        f.add(tf);  

        f.add(but);  

        myEvent();  

        f.setVisible(true);  

    }  

    //注册事件   

    private void myEvent(){  

        //添加监听器,引发退出事件   

        f.addWindowListener(new WindowAdapter(){  

            public void windowClosing(WindowEvent e){  

                System.exit(0);  

        }});  

        //给but添加一个活动监听器   

        but.addActionListener(new ActionListener(){  

            public void actionPerformed(ActionEvent e){  

                System.out.println("action ok");  

        }});  

        //给文本框添加一个监听器,引发键盘事件   

        tf.addKeyListener(new KeyAdapter(){  

            public void keyPressed(KeyEvent e){  

                int code = e.getKeyCode();  

                System.out.println(e.getKeyChar() + "..." + e.getKeyChar());  

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

                    e.consume();  

                    System.out.println(code + "是非法的");  

        }});  

  

        //鼠标事件   

        //myMouseEvent();  

        //键盘事件   

        myKeyEvent();  

    }  

    //鼠标事件   

    public void myMouseEvent(){  

        //给but添加一个鼠标监听器   

        but.addMouseListener(new MouseAdapter(){  

            private int count = 1;  

            private int clickCount = 1;  

            private int clickCount2 = 1;  

            public void mouseEntered(MouseEvent e){  

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

            }  

            public void mouseClicked(MouseEvent e){  

                if(e.getClickCount()==2)  

                    System.out.println("双击动作"  + clickCount2++);  

                    //System.out.println("点击动作" + clickCount++);   

        }});  

    }  

    //键盘事件   

    public void myKeyEvent(){  

        //给but添加一个键盘监听器   

        but.addKeyListener(new KeyAdapter(){  

            public void keyPressed(KeyEvent e)  

            {  

                //组合键ctrl键和回车键同时触发   

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

                    System.out.println("ctrl+enter is runing");  

                //System.out.println(e.getKeyChar() + "..." + e.getKeyCode());  

                //System.out.println(KeyEvent.getKeyText(e.getKeyCode()) + "..." + e.getKeyChar());  

            }  

        });  

    }  

  

    public static void main(String[] args)   

    {  

        new MouseAndKeyEvent();  

    }  

}  

五:对话框:Dialog

何时需要产生对话框:此对象时需要在调用时,才创建对象的,如:当在误操作的时候,就会出现提示错误信息的对话框,此时才创建的这个对象。


示例:

打开指定目录下的目录条目


import java.awt.*;  

import java.awt.event.*;  

import java.io.*;  

  

class  MyWindowDemo  

{  

    //创建全局变量   

    private Frame f;  

    private Button but;  

    private TextField tf;  

    private TextArea ta;  

  

    private Dialog d;  

    private Label lab;  

    private Button okBut;  

  

    //构造函数,初始化窗体   

    MyWindowDemo()  

    {  

        init();  

    }  

    //创建窗体和组件,并将事件添加进来   

    public void init()  

    {  

        //设置窗体   

        f = new Frame("my window");  

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

        f.setLayout(new FlowLayout());  

        //创建组件   

        but = new Button("转到");  

        tf = new TextField(60);  

        ta = new TextArea(25,75);  

  

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

        d.setBounds(300,100,300,150);  

        d.setLayout(new FlowLayout());  

        lab = new Label();  

        okBut = new Button("确定");  

  

        //将组件添加到窗体   

        f.add(tf);  

        f.add(but);  

        f.add(ta);  

          

        d.add(lab);  

        d.add(okBut);  

  

        //添加事件   

        myEvent();  

        //设置窗体可见   

        f.setVisible(true);  

    }  

    //常见引发的时间   

    private void myEvent()  

    {  

        //给but添加一个活动监听器   

        but.addActionListener(new ActionListener()  

        {  

            public void actionPerformed(ActionEvent e)  

            {  

                showInfo();  

            }  

        });  

        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)  

                    showInfo();  

            }  

        });  

        //关闭窗体事件   

        f.addWindowListener(new WindowAdapter()  

        {  

            public void windowClosing(WindowEvent e)  

            {  

                System.exit(0);  

            }  

        });  

        //给对话框添加一个监听器,关闭对话框事件   

        d.addWindowListener(new WindowAdapter()  

        {  

            public void windowClosing(WindowEvent e)  

            {  

                d.setVisible(false);  

            }  

        });  

    }  

    //操作文件,对文件夹的内容读取   

    private void showInfo()  

    {  

        String dirPath = tf.getText();  

        File file = new File(dirPath);  

        if(file.exists()&&file.isDirectory())  

        {  

            ta.setText("");  

            String[] names = file.list();  

            for(String name : names)  

            {  

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

            }  

        }  

        else  

        {  

            String info = "您输入的:“"+dirPath+"”是错误的路径,请重输";  

            lab.setText(info);  

            d.setVisible(true);  

        }  

    }  

  

    public static void main(String[] args)   

    {  

        new MyWindowDemo();  

    }  

}  


六:菜单Menu

Menu:菜单,Menu extends MenuItem;有右三角的图标存在,可添加Menu和MenuItem

MenuBar:菜单栏,可添加菜单和条目

MenuItem:条目,及菜单项目,无右三角的图标存在,是最终的菜单项。

菜单的事件处理和组件一样,可以对类型为MenuItem和Menu的对象这个事件源添加活动监听ActionListener,并进行相关的事件处理。

代码示例:

打开文件,将内容显示在文本框中,并将写入文本框中的内容保存


/* 

菜单练习 

 

*/  

import java.awt.*;  

import java.awt.event.*;  

import java.io.*;  

public class MenuDemo   

{  

    //设置全局变量   

    private Frame f;  

    private MenuBar bar;  

    private TextArea ta;  

    private Menu fileMenu;  

    private MenuItem closeMT,submu,openItem,saveItem;  

  

    private FileDialog openDia,saveDia;  

  

    private File file;  

      

    //初始化菜单项   

    MenuDemo()  

    {  

        init();  

    }  

    //初始化窗体和组件   

    public void init()  

    {  

        //初始化窗体frame   

        f = new Frame("my Menu");  

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

          

        //初始化菜单项   

        bar = new MenuBar();  

        ta = new TextArea();  

        fileMenu = new Menu("文件");  

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

        openItem = new MenuItem("打开");  

        saveItem = new MenuItem("保存");  

        closeMT = new MenuItem("退出");  

          

        //将组件加入到文件菜单这个容器组件中   

        fileMenu.add(submu);  

        fileMenu.add(openItem);  

        fileMenu.add(saveItem);  

        bar.add(fileMenu);  

        f.setMenuBar(bar);  

        fileMenu.add(closeMT);  

  

        openDia = new FileDialog(f,"我要打开",FileDialog.LOAD);  

        saveDia = new FileDialog(f,"我要保存",FileDialog.SAVE);  

          

        f.add(ta);  

        //添加事件   

        myEvent();  

        //设置窗体可见性   

        f.setVisible(true);  

    }  

      

    //添加事件   

    private void myEvent()  

    {  

        //添加窗体监听,关闭按钮   

        f.addWindowListener(new WindowAdapter()  

        {  

            public void windowClosing(WindowEvent e)  

            {  

                System.exit(0);  

            }  

        });  

        //添加退出菜单项目的监听,退出程序   

        closeMT.addActionListener(new ActionListener()  

        {  

            public void actionPerformed(ActionEvent 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("");  

                file = new File(dirPath,fileName);  

                BufferedReader bufr = null;  

                try  

                {  

                    //读取文件中的内容   

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

                    String line = null;  

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

                    {  

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

                    }  

                }  

                catch (IOException ex)  

                {  

                    throw new RuntimeException("读取失败");  

                }  

                finally  

                {  

                    try  

                    {  

                        if(bufr!=null)  

                            bufr.close();  

                    }  

                    catch (IOException ex)  

                    {  

                        throw new RuntimeException("关闭流失败");  

                    }  

                }  

            }  

        });  

  

        //保存事件   

        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 ;  

                    file = new File(dirPath,fileName);  

                    BufferedWriter bufw = null;  

                    try  

                    {  

                        //写入文本框中的内容   

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

                        String text = ta.getText();  

                        bufw.write(text);  

                        bufw.flush();                             

                    }  

                    catch (IOException ex)  

                    {  

                        throw new RuntimeException("写入失败");  

                    }  

                    finally  

                    {  

                        try  

                        {  

                            if(bufw!=null)  

                                bufw.close();  

                        }  

                        catch (IOException ex)  

                        {  

                            throw new RuntimeException("关闭流失败");  

                        }  

                    }  

                }  

            }  

        });  

  

    }  

    public static void main(String[] args)   

    {  

        new MenuDemo();  

    }  



七、jar包双击执行

既然是图形化界面,就需要通过图形化界面的形式运行程序,而不是是用Dos命令行执行,那么如何通过双击程序就执行程序呢?这就需要将程序的class文件打包,步骤如下:

首先要在java文件中导入一个包,没有则需创建一个包,如package mymenu;

生成包:通过编译javac -d c:\myclass MyMenu.java,此时则在c盘下的myclass文件夹下生成了所有的.class文件

在此目录下新建一个文件,如1.txt或者其他任意名称任意扩展名的文件都可,然后在其中编辑固定的格式:“Main-Class:mymenu.MenuDemo”,只写引号中的内容。需要需要在冒号后有一个空格,在文件末尾要回车。

编译:jar -cvfm my.jar 1.txt mymenu即可。如果想添加其他信息,则直接编译jar即可得出相应的命令

此时双击即可执行。

说明:

在固定格式中:

如果无空格:在编译的时候,就会报IO异常,提示无效的头字段,即invalid header field。这说明1.txt在被IO流读取。

如果无回车:在列表清单.MF中不会加入相应的加载主类的信息,也就是说配置清单的属性主类名称不会加载进清单中,也就不会执行。

jar文件必须在系统中注册,才能运行。注册方法如下:

对于XP系统:

打开任意对话框,在菜单栏点击工具按钮,选择文件夹选项

选择新建--->扩展名,将扩展名设置为jar,确定

选择高级,可更改图标,然后点击新建,命名为open,

在用于可执行应用程序中,点浏览,将jdk下的bin的整个文件路径添加进来,并在路径后添加-jar即可。

对于win7系统:

改变打开方式:右击.jar文件,点击打开方式,选择默认程序为jdk下bin中的javaw.exe应用程序。

修改关联程序的注册表:打开注册表(win+r),找到注册表路径\HKEY_CLASSES_ROOT\Aplications\javaw.exe\shell\open\command下的字符串值,右击点修改,将值改为:"C:\ProgramFiles\Java\jre6\bin\javaw.exe" -jar "%1"其中-jar前的路径就是javaw.exe的路径。保存

双击即可执行jar程序,如果仍不能执行,则需下载最新版的jdk。


------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值