黑马程序员---GUI编程

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学习型技术博客期待与您交流! ------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值