黑马程序员---GUI编程

来源:互联网 发布:营销活动数据库表设计 编辑:程序博客网 时间:2024/06/05 18:01

GUI


---------- android培训java培训、java学习型技术博客、期待与您交流! ------------

1.图形用户界面基本概念

1.1 GUI与CLI的比较

1.2 AWT和Swing

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

1.2.1 两者的比较

关于Component构件的详细关系如下图所示: 

 

Container:为容器,是一个特殊的组件,该组件中可以通过add方法添加其他组件进来而Container类有两个最重要的子类,分别是java.awt.Window 与java.awt.Frame,除了以往的AWT组件会继承这两个类外,现在的Swing组件同样也扩展了这两个类。

1.2.2 Swing的常用组件

2.常用布局管理器

Swing提供的常用布局管理器包括流布局管理器、边界布局管理器和网格布局管理器。

除了使用布局管理器之处也可以使用。

2.1 绝对布局管理器

绝对布局 就是 硬性规定组件在容器中的位置和大小,可以使用绝对坐标来指定组件的位置。

使用绝对布局的步骤如下:

1)使用Container.setLayout(null) 方法取消布局管理器。

2)使用Component.setBounds()方法设置每个组件的大小与位置。

如下代码:

package com.ping.JFrame;import java.awt.*;import javax.swing.*;public class AbsolutePosition extends JFrame {    public AbsolutePosition() {        setTitle("本窗体使用绝对布局"); // 设置该窗体的标题        setLayout(null); // 使该窗体取消布局管理器设置        setBounds(0, 0, 200, 150); // 绝对定位窗体的位置与大小        Container c = getContentPane(); // 创建容器对象        JButton b1 = new JButton("按钮1"); // 创建按钮        JButton b2 = new JButton("按钮2"); // 创建按钮        b1.setBounds(10, 30, 80, 30); // 设置按钮的位置与大小        b2.setBounds(60, 70, 100, 20);        c.add(b1); // 将按钮添加到容器中        c.add(b2);        setVisible(true); // 使窗体可见        // 设置窗体关闭方式        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);    }    public static void main(String[] args) {        new AbsolutePosition();    }}

效果图:


绝对布局使用了SetBounds(intx , int y , int width , int height)方法进行设置,其中x、y分别代表这个窗体在整个屏幕上出现的位置,width与height则代表了这个窗体的的宽与长,如果是组件使用这个方法的话,参数x、y代表了这个组件在整个窗体摆放的位置,而width与height则代表这个组件的大小。而setLayout(null)则是告诉编译这里不同使用布局管理器了。

2.2 常用布局管理器

如果没有为容器指定布局管理器,则该容器使用默认的布局管理器。为容器指定布局管理器可以调用容器对象的setLayout(LayoutManager mgr)方法来完成,其中参数mgr为指定的布局管理器。

        一共有五种布局管理器,

下面分别用代码看看其有什么差别:

2.2.1 流式布局管理器

定义:像“流”一样从左到右摆放组件,直到占据这一行的所有空间,然后再向下移动。

import java.awt.*;import javax.swing.*;public class FlowLayoutPosition extends JFrame {    public FlowLayoutPosition() {        setTitle("本窗体使用流布局管理器"); // 设置窗体标题        Container c = getContentPane();        // 设置窗体使用流布局管理器,使组件右对齐,并且设置组件之间的水平间隔与垂直间隔        setLayout(new FlowLayout(2, 10, 10));        for (int i = 0; i < 10; i++) { // 在容器中循环添加10个按钮            c.add(new JButton("button" + i));        }        setSize(300, 200); // 设置窗体大小        setVisible(true); // 设置窗体可见        // 设置窗体关闭方式        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);    }    public static void main(String[] args) {        new FlowLayoutPosition();    }}
效果图:


2.2.2 边界布局管理器

定义:可将容器分为东、南、西、北、中5个区域,可以将组件加入这5个区域。用BorderLayout类中的成员变量来决定。

如下图:

具体设置如下代码

package com.ping.JFrame;import java.awt.BorderLayout;import java.awt.Container;import javax.swing.*;public class BorderLayoutPosition extends JFrame {    // 定义组件摆放位置的数组    String[] border = { BorderLayout.CENTER, BorderLayout.NORTH,            BorderLayout.SOUTH, BorderLayout.WEST, BorderLayout.EAST };    String[] buttonName = { "center button", "north button",            "south button", "west button", "east button" };    public BorderLayoutPosition() {        setTitle("这个窗体使用边界布局管理器");        Container c = getContentPane(); // 定义一个容器        setLayout(new BorderLayout()); // 设置容器为边界布局管理器        for (int i = 0; i < border.length; i++) {            // 在容器中添加按钮,并设置按钮布局            c.add(border[i], new JButton(buttonName[i]));        }        setSize(350, 200); // 设置窗体大小        setVisible(true); // 使窗体可视        // 设置窗体关闭方式        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);    }    public static void main(String[] args) {        new BorderLayoutPosition();    }}
效果图:


2.2.3 网格布局管理器

定义:将容器划分为网络,组件从网络的左上角开始,按照从左到右的、从上到下的顺序加入网格。

网格布局管理器主要用两种方式设置其网格分布。


示例代码:

import java.awt.*;import javax.swing.*;public class GridLayoutPosition extends JFrame {    public GridLayoutPosition() {        Container c = getContentPane();        // 设置容器使用网格布局管理器,设置7行3列的网格        setLayout(new GridLayout(7, 3, 5, 5));        for (int i = 0; i < 20; i++) {            c.add(new JButton("button" + i)); // 循环添加按钮        }        setSize(300, 300);        setTitle("这是一个使用网格布局管理器的窗体");        setVisible(true);        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);    }    public static void main(String[] args) {        new GridLayoutPosition();    }}
效果图:


剩下的两种布局就不再具体赘述了。

3.常用窗体

   窗体作为Swing应用程序中组件的承载体,处于非常重要的位置。 Swing常用的窗体包括JFrame和JDialog。

3.1 JFrame窗体

   JFramep窗体是一个容器,它是Swing程序中各个组件的载体,是Swing各个组件的容器。可以通过继承java.swing.JFrame类创建一个窗体,在这些窗体中添加组件,并设置事件。因为这些窗体继承了JFrame类,所以它拥有最大化,最小化、关闭等功能。

   JFrame在程序中的实现格式如下:

   JFrame jf = new JFrame(title);

   Container container = jf.getContentPane();  

由上构建方法可知,Swing组件通常与组件和容器有关,所以在JFrame对象创建后,需要调用getContentPane()方法将窗体转换为容器,然后在容器中添加组件或设置布局管理器。若想将组件加至容器,可用Container类的add()方法进行设置。

新建一个窗体:如下代码

import java.awt.*;import javax.swing.*;     // 自定义一个类继承JFrame类public class MyJFrame extends JFrame {       // 定义一个CreateJFrame()方法    public void CreateJFrame(String title) {         // 实例化一个JFrame对象        JFrame jf = new JFrame(title);         // 获取一个容器        Container container = jf.getContentPane();         // 创建一个JLabel标签        JLabel jl = new JLabel("这是一个JFrame窗体");         // 使标签上的文字居中        jl.setHorizontalAlignment(SwingConstants.CENTER);         // 将标签添加到容器中        container.add(jl);         //设置容器的背景颜色        container.setBackground(Color.white);       // 使窗体可视        jf.setVisible(true);          // 设置窗体大小        jf.setSize(200, 150);        // 设置窗体关闭方式        jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);    }    public static void main(String args[]){        //在主方法中调用createJFrame()方法        new MyJFrame().CreateJFrame("创建一个JFrame窗体");    }}
效果图:


3.2 JDialog窗体

定义:JDialog窗体是Swing组件中的对话框,它继承了AWT组件中java.awt.Dialog类。

特点

1)JDialog窗体的功能是从一个窗体中弹出另一个窗体,就像是在使用IE浏览器时弹出的确定对话框一样。

2)JDialog窗体实质就是另一种类型的窗体。

3)创建JDialog窗体时,也需要调用ContentPane()方法将窗体转换为容器。

构造方法

练习:在项目中创建MyJDialog类,该类继承JDialog窗体,并在窗体中添加按钮,当用户单击按钮时,将弹出一个对话框。 

import java.awt.*;import java.awt.event.*;import javax.swing.*;class MyJDialog extends JDialog {     // 创建新类继承JDialog类    public MyJDialog(MyFrame frame) {        // 实例化一个JDialog类对象,指定对话框的父窗体、窗体标题和类型        super(frame, "第一个JDialog窗体", true);         // 创建一个容器        Container container = getContentPane();          // 在容器中添加标签        container.add(new JLabel("这是一个对话框"));        // 设置对话框窗体大小         setBounds(120, 120, 100, 100);    }}public class MyFrame extends JFrame {      // 创建新类    public static void main(String args[]) {      // 实例化MyJDialog类对象        new MyFrame();    }    public MyFrame() {          // 创建一个容器        Container container = getContentPane();         container.setLayout(null);       // 在窗体中设置标签        JLabel jl = new JLabel("这是一个JFrame窗体");         // 将标签的文字置于标签中间位置        jl.setHorizontalAlignment(SwingConstants.CENTER);        container.add(jl);        // 定义一个按钮        JButton bl = new JButton("弹出对话框");         bl.setBounds(10, 10, 100, 21);         // 为按钮添加鼠标单击事件        bl.addActionListener(new ActionListener() {                     public void actionPerformed(ActionEvent e) {                        // 使MyJDialog窗体可见                        new MyJDialog(MyFrame.this).setVisible(true);                    }                });        // 将按钮添加到容器中        container.add(bl);         container.add(bl);        container.setBackground(Color.white);        setSize(200, 200);        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);        setVisible(true);    }}
效果图:


4.事件处理

4.1事件监听机制

事件监听机制的组成由:

1)事件 ---用户对组件的一个操作

2)事件源 ---发生事件的组件

3)监听器 ---需要处理的某个事件,在发生事件的组件上添加监听器

4)事件处理器---监听器中的方法,监听器被添加在组件上之后,组件上发生了对应时间就会执行指定的方法

4.2 事件监听流程

4.2.1 事件监听器流程图

4.2.2 事件监听机制实现的步骤

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

(2)通过事件源对戏那个的addXXXListener()方法将侦听器注册到该事件源上;

(3)该方法中接收XXXListener的子类对象,或者XXXListener的子类XXXAdapter的子类对象;

(4)一般使用匿名内部类来表示;

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

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

4.3 常用的事件监听器

上图中重要事件的说明如下表所示:

4.4 动作事件监听器

动作事件(ActionEvent)监听器是Swing中比较常见的事件监听器,常用于点击按钮等操作。

 下面将使用按钮事件来说明动作事件监听器,当用户点击按钮时,将触发事件

import java.awt.*;import java.awt.event.*;import javax.swing.*;public class SimpleEvent extends JFrame{    private JButton jb=new JButton("我是按钮,单击我");    public SimpleEvent(){        setLayout(null);        setSize(200,100);        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);        Container cp=getContentPane();        cp.add(jb);        jb.setBounds(10, 10,100,30);        jb.addActionListener(new jbAction());        setVisible(true);    }    class jbAction implements ActionListener{        public void actionPerformed(ActionEvent arg0) {            jb.setText("我被单击了");        }    }    public static void main(String[] args) {        new SimpleEvent();    }}
效果图:

 

 ----------- android培训java培训、java学习型技术博客期待与您交流! ------------