黑马程序员---GUI编程

原创 2013年12月04日 22:54:58

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

黑马程序员----GUI、网络编程

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------       图形界面GUI:   GUI Graphical User Interface(图形...

黑马程序员——GUI与网络编程

GUI部分毕老师并没有

黑马程序员——基础学习(十四)多线程(Thread)和图形界面编程(GUI)

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- Thread(多线程) 同步方法及其锁对象 this 静态同步方法其锁对象 类名.class ...

黑马程序员 java基础24天 GUI编程学习总结

---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ---------------------- ...

黑马程序员_GUI编程的一些总结

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 一、GUI概述 GUI(Graphical User Interface)就是图形用户接口,...

黑马程序员—Java编程知识GUI知识总结

------- android培训、java培训、期待与您交流! ---------- JavaGUI技术总结。 一.GUI(图形化用户界面) 1.用来将文件或文件夹封装为对象。 2.方便对...

黑马程序员------GUI编程复习

以鼠标在窗口按下时作为起点,鼠标释放时为终点,划出一条直线,并在2个点处打印坐标。 package GUI; import java.awt.Color; import java.awt.Grap...

黑马程序员-GUI编程总结

代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。  代理模式一般涉及到的角色...

黑马程序员——网络编程、GUI、反射 笔记第十四篇

网络编程 1 基本知识 网络编程解决的问题:计算机与计算机之间的通讯问题。 计算机网络:将分布在不同地域的计算机通过外置设备链接起来,计算机之间达到了消息交互、文件传输的功能。   计算机网...

黑马程序员——GUI 编程学习

Java是跨平台运行的,但是不同的平台对于点及坐标的定义不完全相同。而且屏幕的解析度分辨率不同也会造成位置的变化,为了确保每个组件的相对位置和大小以及外观,java就设计了布局管理器。 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)