您的位置:首页 > 编程语言 > Java开发

JavaSE第八十三讲:Swing详细及JDK对观察者模式的支持

2013-01-15 10:33 423 查看
1. 构建图形用户界面(Swing)

学习目标:

1) 关于Swing

2) Swing组件和容器

2. 关于Swing

1) Swing:是第二代GUI开发工具,它建立在AWT之上,但用新版本的组件替代了旧版本的组件。它提供了许多新的组件和相关的API

2) The Swing API 发布在:

JDK1.2

JFC1.1 (for use with JDK1.1)

3) The Swing API 功能是强大的,灵活的和广泛的。例如JFC 1.1 有 15 public packages。

我们经常用的有两个包:

(1) javax.swing  [注意我们以前的包是java.开头的,这边是javax.开头,这个x表示的是扩展包,相当于对原有的包进行扩展]

(2) javax.swing.event

注:AWT components 在java.awtpackage 中

3. Swing组件和容器

1) 概览



SwingApplication 创建了四个常用的Swing components:

a frame, or main window (JFrame)

a panel (JPanel)

a button (JButton)

a label (JLabel)

2) 容器与组件包含继承关系图表:



3) Swing架构:



4) Comonent Hierarchy —— AWT Similar



5) Comonent Hierarchy —— New and Expanded Components



6) Swing Components 分类:

(1) 顶层容器

    java 提供了三个顶层容器:JFrame, JDialog,和 JApplet[不常用,了解一下即可]。



特点:

(1) 显示在屏幕上的每个组件都必须在一个包含继承中。每一个包含继承都有一个顶层容器作为它的根。

(2) 每一个顶层容器都有一个content pane,它包含了顶层容器中的所有组件

(3) 菜单在顶层容器中,但在content pane 之外



(1) 在Content Pane 中添加组件,有两种方式:

    topLevelContainer.getContentPane().add(yellowLabel, BorderLayout.CENTER);

或:

    JPanel contentPane = new JPanel();

    ……

   topLevelContainer.setContentPane(contentPane);

(2) 添加菜单条

    JMenuBar cyanMenuBar = new JMenuBar();

    frame.setJMenuBar(cyanMenuBar);

(2)JFrame

    是一个带有标题和可变大小边框的窗口。任何一个图形界面应用程序都必须至少有一个JFrame.

程序demo如下:

package com.ahuier.awt;

import java.awt.BorderLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class FrameDemo {
public static void main(String[] args) {
JFrame frame = new JFrame("Frame Demo");
JLabel label = new JLabel("hello world");

/*
* 对于Swing来说,必须是要调用getContentPane()方法得到 Container 对象后再调用add()方法
* 也就是先放到Container上,再一起放到frame上
*/
frame.addWindowListener(new MyHandler());
frame.getContentPane().add(label, BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);

}
}

class MyHandler extends WindowAdapter{
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}

}
编译执行结果就不截图了,请自行编译

package com.ahuier.awt;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenuBar;

public class TopLevelDemo {
public static void main(String[] args) {
JFrame frame = new JFrame("TopLevelDemo");
frame.addWindowListener(new MyHandler());

JLabel label = new JLabel("hello");
label.setBackground(Color.YELLOW);
label.setPreferredSize(new Dimension(200, 180)); //设置窗口大小

/*
* MenuBar 表示菜单栏,里面包含了多个Menu,每个Menu上面包含了多个MenuItem
*/
JMenuBar menubar = new JMenuBar();
menubar.setBackground(Color.cyan);
menubar.setPreferredSize(new Dimension(200, 20));

frame.setJMenuBar(menubar);
frame.getContentPane().add(label, BorderLayout.CENTER);

frame.pack();
frame.setVisible(true);
}
}
编译执行结果就不截图了,请自行编译

(3)panel

    为其它组件提供一个容器。便于组织和显示组件。还可以包含子panel

(4)创建菜单

步骤:

(1) 创建一个MenuBar 对象, 将其加入一个菜单容器,例如:Frame .

(2) 创建一个或多个Menu 对象,将其加入menu bar 对象.

(3) 创建一个或多个MenuItem objects,对象,将其加入相应的menu object.

程序Demo如下:

package com.ahuier.awt;

import java.awt.Dimension;
import java.util.Observable;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

public class MenuTest
{
public static void main(String[] args)
{
JFrame frame = new JFrame("Menu");

JMenuBar mb = new JMenuBar();

JMenu m1 = new JMenu(" File");
JMenu m2 = new JMenu(" Save");
JMenu m3 = new JMenu(" Load");
JMenu m4 = new JMenu(" Quite");

JMenuItem item1 = new JMenuItem("New");
JMenuItem item2 = new JMenuItem("hello");
JMenuItem item3 = new JMenuItem("world");
JMenuItem item4 = new JMenuItem("zhangsan");

frame.setJMenuBar(mb);

mb.add(m1);
mb.add(m2);
mb.add(m3);
mb.add(m4);

m1.add(item1);
m1.add(item2);
m1.add(item3);
m1.add(item4);

//点击关闭按钮就退出,不用写监听器了,提供便携操作而已
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setSize(new Dimension(200, 300));
frame.setVisible(true);

}
}
编译执行结果如下图所示:



(5)JComponent Class

    除了顶层容器,Swing中所有组件(中间容器和原子组件)都从JComponent类中继承。



JComponent Class API:

它从Componentand Container继承了许多方法,同时也提供了一些新的方法。它为它的继承者提供了如下常用功能:

Customizing Component Appearance

Setting Component State

Handling Events

Painting Components

Dealing with the Containment Hierarchy

Laying Out Components

Getting Size and Position Information

Specifying Absolute Size and Position

4. 控制显示效果

Color类

1) Color类将颜色按照sRGB标准格式进行封装,该格式中红、绿、蓝三原色的取值范围都是0~255。

2) Color类定义了多个构造方法,常用的有:

publi c Color(int r,int g,int b)

publi c Color(int r,int g,int b,int a) //a--透明度参数

Color c = new Color(200,170,90);

Color d = new Color(200,170,90,120);

3) 在GUI设计中使用Color类

Button b = new Button(“Test”);

Color c = new Color(200,170,90);

b.setBackground(c)

5. 作业: 

1) 阅读Observable类的源代码,理解Observable类与Observer接口之间的调用关系。 

2) 编写一个程序,声明一个类,该类继承自Observable(因此该类是个主题角色),有一个int类型的变量,初始值为10,编写一个for循环,将该数字每次递减1,一直到0为止,每次变化时,都将该数字传递给它的观察者,观察者会打印出该数字;第二个观察者在该数字变为5之后开始打印该数字。 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: