先给出一段代码,这是一个很简单的Swing程序,然后在对程序内容作详细讲述.
A simple Swing program
1 import javax.swing.*;
2 import java.awt.*;
3 public class SwingDemo{
4 public SwingDemo(){
5 JFrame jfrm=new JFrame("A Simple Swing Application");
6 jfrm.setSize(275,100);
7 jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
8 JLabel jlab=new JLabel("This is a text label.");
9 jfrm.add(jlab);
10 jfrm.setVisible(true);
11 }
12 public static void main(String[] args){
13 SwingUtilities.invokeLater(new Runnable(){
14 public void run(){
15 new SwingDemo();
16 }
17 });
18 }
19 }
Swing是用来弥补AWT的不足的,但是不能取代它,Swing GUI程序开头都是包含进来swing包和awt包.GUI程序不同于传统的控制台程序,它可是有个很形象的窗口呈现给用户的,实现出来显得很亲切,我们从实现出来的这个窗口来推理下代码应该包括什么内容.窗口是windows里最常见的了,一个窗口里有标题栏工具栏按钮等等一系列的组件,这些组件不是漂浮于空中的,而是生存在这个窗口里的,这个窗口对应着Swing程序里的容器这个概念.大体上就是这样的过程:先设计出容器,再设计出组件,然后把组件添加到容器中并合理的布局,布局完全是美观的需要,这样就写出来一个SwingGUI程序了.注意这里的容器和组件的关系看着很简单,就是容器为根,它可以容纳组件.然而实际的java类库里不是这么看待二者的,容器和组件浑然一体的,容器也是一种组件,容器内也可以再放容器,简单的说就是组件套组件,可以套组件的组件就叫容器了.这种包含层次的结构要求其顶部是一个顶级容器.Swing定义了4种顶级容器:JFrame,JApplet,JWindow,JDialog.这些容器继承自AWT类的Component和Container,说它们顶级是在Swing的框架内说的,放到AWT中还是小弟,当不了老大,不过在Swing组件库中确实一手遮天,表现在顶层容器不包含在任何其他的容器中并且每个包含层次从顶层容器开始,这4个容器称作重量级容器.除了这4个顶级容器,其它的Swing组件都是从JComponent类派生的.例如用于标签的类JLabel,用于按钮的类JButton,用于复选框的类JCheckBox.既然有重量级容器,同样就有轻量级容器,如JPanel,JScrollPane,JRootPane.这些当然也是派生自JComponent类了.它们经常用于组织和管理一组相关的组件.
关于Swing组件的基本体系搞懂了,接下来就考虑组件怎么加到容器里,代码第9行告诉了我们答案,看起来确实很简单,再考虑一个问题,如果我加了很多组件进来,那么这些组件怎么摆放呢,这段代码只加了一个,看不出来问题,如果加了一堆组件进来会不会窗口显得很凌乱呢.这就需要布局管理器来帮忙了.代码中看不到布局管理器对象,这是采用了默认的BorderLayout,注意这里的默认是针对JFrame而言的,不同的顶级容器的默认布局管理器可能不一样.布局管理器多数由AWT提供的,Swing也提供了自己的几种,它们都是实现了LayoutManager接口的实例(某些还会实现LayoutManager2接口).
现在组件放到容器里了,并且也合理的布局了,还遗漏了一些问题,比如说这些组件(包括容器)该起个名字吧,不过这个不用操心,生成这个组件对象的时候就往构造函数里传了参数用来起名字了.还有个问题是容器的大小,假如容器芝麻的大小你却往里放个西瓜大的组件,根本显示不出来嘛.容器是要定制大小的,setSize()可以满足需要,一般的组件是不需要这个函数来定制大小的,大小都是随容器变化的,芝麻大小的容器是不会塞一个西瓜大的组件的,但是却是个比芝麻还小的组件,和显示不出来区别不大.
到了这里感觉还缺点什么,对了,还缺事件的处理机制,比如说点关闭按钮窗口会怎么样.这里简单的调用一个方法,setDefaultCloseOperation(),传进的一个整型参数好比一个遥控器上的数字键,决定了这个操作的行为.事件的处理机制隐藏于这个方法的实现中.第10行的setVisible()作用是显示框架,初学者可能会忘记,不过这几乎是GUI代码的必备语句.的main方法看着有点不知所云,简单解释下,在所有情况下,Swing GUI通过使用invokeLater()在事件调度线程上创建.这行代码硬记住就行了.从语法上说用了一个匿名类。