首页 > 代码库 > 黑马程序员——GUI篇

黑马程序员——GUI篇

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


GUI(图形用户界面)

1、基本概念:

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

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

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

2、Awt与Swing

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

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

3、继承关系图

wKioL1NvE6mRC84cAAJ78t-bfQQ900.jpg


4、布局管理器

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

常见的布局管理器:

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

   BorderLayout(边界布局管理器):东,南,西,北,中(未指定位置的话,将最大面积填充)。Frame默认的布局管理器。

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

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

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

最牛的就是坐标式布局,想放哪里就放哪里。


5、建立一个简单的窗体

Container常用子类:Window Panel(面板, 不能单独存在。)

Window常用子类:Frame Dialog

创建图形化界面:

1,创建frame窗体。

2,对窗体进行基本设置。

比如大小,位置,布局。

3,定义组件。

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

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

import java.awt.*;
import java.awt.event.*;
class  AwtDemo
{
    public static void main(String[] args)
    {
        Frame f = new Frame("my awt");
        f.setSize(500,400);//设置窗体横、纵尺寸。
        f.setLocation(400,200);//设置窗体位置:距离左边400,上边200。
        f.setLayout(new FlowLayout());//流式布局。
        f.setVisible(true);//显示窗体。
    }
}

6、事件监听机制

组成:

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

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

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

   事件处理(引发事件后处理方式)


wKioL1NvF5TAUq2OAAEgpW7gn0g361.jpg

确定事件源(容器或组件)

通过事件源对象的addXXXListener()方法将侦听器注册到该事件源上。

该方法中接收XXXListener的子类对象,或者XXXListener的子类XXXAdapter的子类对象。

一般用匿名内部类来表示。

在覆盖方法的时候,方法的参数一般是XXXEvent类型的变量接收。

事件触发后会把事件打包成对象传递给该变量。(其中包括 事件源对象。通过getSource()或者,getComponent()获取。)

活动监听部分代码:

f.addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent e)
            {
                System.out.println("我关!");
                System.exit(0);
            }
            public void windowActivated(WindowEvent e)
            {
                System.out.println("我活了!!");
            }
            public void windowOpened(WindowEvent e)
            {
                System.out.println("我被打开了,哈哈哈");
            }
                                   
        });

-------------------------------------------------

实例代码:

通过按钮关闭窗体。在窗体中通过按钮创建按钮。

import java.awt.*;
import java.awt.event.*;
class FrameDemo
{
    //定义该图形中所需的组件的引用。
    private Frame f;
    private Button but;
    FrameDemo()
    {
        init();
    }
    public void init()
    {
        f = new Frame("my frame");
                             
        //对frame进行基本设置。
        f.setBounds(300,100,500,400);//设置frame的 x 和 y 指定左上角的新位置,由 width 和 height 指定新的大小。
        f.setLayout(new FlowLayout());
        but = new Button("my 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(ActionListener l)
        */
        but.addActionListener(new ActionListener()//不需要适配器,Adapter。监听器中方法超过三个的一般都有适配器。
        {
            public void actionPerformed(ActionEvent e)
            {
                System.out.println("退出,按钮干的");
                System.exit(0);
            }
        });
    }
    public static void main(String[] args)
    {
        new FrameDemo();
    }
}


熟悉键盘事件与鼠标事件

import java.awt.*;
import java.awt.event.*;
class MouseAndKeyEvent
{
    private Frame f;
    private Button but;
    private TextField tf;
    MouseAndKeyEvent()
    {
        init();
    }
    public void init()
    {
        f = new Frame("my frame");
                           
        f.setBounds(300,100,500,400);
        f.setLayout(new FlowLayout());
        tf = new TextField(20);//设定列数。
        but = new Button("my 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);
            }
        });
        tf.addKeyListener(new KeyAdapter()
        {
            public void keyPressed(KeyEvent e)
            {
                int code = e.getKeyCode();
                if(!(code>=KeyEvent.VK_0 && code<=KeyEvent.VK_9))
                {
                    System.out.println(code+"非法");
                    e.consume();
                }
            }
        });
        //给but添加一个键盘监听。
        but.addKeyListener(new KeyAdapter()
        {
            public void keyPressed(KeyEvent e)
            {
                //组合键
                if(e.isControlDown() && e.getKeyCode()==KeyEvent.VK_ENTER)
                    System.exit(0);
                                    //获取对应的键盘字符串。
                System.out.println(KeyEvent.getKeyText(e.getKeyCode())+"---"+e.getKeyCode());
            }
                           
        });
        //活动监听。
        but.addActionListener(new ActionListener()//键盘能操作,空格。
        {
            public void actionPerformed(ActionEvent e)
            {
                System.out.println("action ok");
            }
        });
        /*
        //鼠标监听。
        but.addMouseListener(new MouseAdapter()
        {
            private int count = 1;
            private int count1 = 1;
            public void mouseEntered(MouseEvent e)
            {
                System.out.println("鼠标进入到该组件"+count++);
            }
            public void mouseClicked(MouseEvent e)
            {
                if (e.getClickCount()==2)
                    System.out.println("双击动作"+count1++);
            }
        });
        */
    }
    public static void main(String[] args)
    {
        new MouseAndKeyEvent();
    }
}

菜单

wKioL1NvG1KSY3DmAADDCPOjfRA539.jpg

MenuBar,Menu,MenuItem

先创建菜单条,再创建菜单,每一个菜单 中建立菜单项。

也可以菜单添加到菜单中,作为子菜单。

通过setMenuBar()方法,将菜单添加到Frame中。

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

package mymenu;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
public class MyMenuTest
{
    private Frame f;
    private MenuBar bar;
    private TextArea ta;
    private Menu fileMenu;
    private MenuItem closeItem,openItem,saveItem;
    private FileDialog openDia,saveDia;
    private File file;
    MyMenuTest()
    {
        init();
    }
    public void init()
    {
        f = new Frame("my window");
        f.setBounds(300,100,700,500);
             
        bar = new MenuBar();//菜单栏
        ta = new TextArea();
        fileMenu = new Menu("文件");//菜单。
        closeItem = new MenuItem("退出");//菜单项。
        openItem = new MenuItem("打开");
        saveItem = new MenuItem("保存");
             
        //subMenu = new Menu("子菜单");
             
        fileMenu.add(openItem);    
        fileMenu.add(saveItem);    
        fileMenu.add(closeItem);       
        bar.add(fileMenu);
        f.setMenuBar(bar);
        f.add(ta);
        openDia = new FileDialog(f,"我要打开",FileDialog.LOAD);//模式默认为打开。
        saveDia = new FileDialog(f,"我要保存",FileDialog.SAVE);
             
        myEvent();
        f.setVisible(true);
    }
    public void myEvent()
    {
        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);
                try
                {
                    BufferedReader bufr = new BufferedReader(new FileReader(file));
                    String line = null;
                    while ((line=bufr.readLine())!=null)
                    {
                        ta.append(line+"\t\n");
                    }
                    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);
                }
                try
                {
                    BufferedWriter bufw = new BufferedWriter(new FileWriter(file));
                    String text = ta.getText();
                    bufw.write(text);
                    bufw.close();
                }
                catch (IOException ex)
                {
                    throw new RuntimeException("保存失败");
                }
            }
        });
        closeItem.addActionListener(new ActionListener()
        {
            public void  actionPerformed(ActionEvent e)
            {
                System.exit(0);
            }
        });
        f.addWindowListener(new WindowAdapter()
        {
            public void windowClosing(WindowEvent e)
            {
                System.exit(0);
            }
        });
             
    }
    public static void main(String[] args)
    {
        new MyMenuTest();
    }
}


本文出自 “离歌丶D” 博客,转载请与作者联系!