您的位置:首页 > 产品设计 > UI/UE

黑马程序员---GUI编程

2013-12-04 22:54 531 查看

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学习型技术博客期待与您交流! ------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: