Component类
Java 的图形用户界面的最基本组成部分是组件,组件是一个可以以图形化的方式显示在屏幕上并能与用户进行交互的对象,例如一个按钮,一个标签等。抽象类Component 是所有JavaGUI组件的共同父类。Component类规定了所有GUI组件的基本特性,该类中定义的方法实现了作为一个 GUI组件所应具备的基本功能。Java 程序要显示的 GUI组件必须是抽象类Component或MenuComponent的子类
Canvas
Canvas 代表屏幕上的一块空白的矩形区域,程序能够在这个部件表面绘图,也能够捕获用户的操作,产生相应的事件,Canvas 可以说是具有最基本的和最简单的GUI功能的部件。当我们要设计一种自己定制的具有 GUI功能的部件类,这个类就可以继承 Canvas,这样,这个部件类就已经完成了GUI的基本功能,我们只需要在这个基础上增加子类部件所专有的外观和功能的相关代码就行了,我们要想绘制子类部件的外观,我们必须覆盖 Canvas的paint 方法
import java.awt.AWTEvent;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.text.SimpleDateFormat;
import java.util.Date;
public class TestStopWatch {
public static void main(String[] args) {
Frame f = new Frame("StopWatch");
f.add(new StopWatch());
f.setSize(200, 200);
f.setVisible(true);
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
}
}
class StopWatch extends Canvas implements Runnable{
private long startTime = 0;
private long endTime = 0;
private boolean bStart = false;
public StopWatch(){
enableEvents(AWTEvent.MOUSE_EVENT_MASK);
setSize(80,30);
}
protected void processMouseEvent(MouseEvent e){
if(e.getID()==MouseEvent.MOUSE_PRESSED){
bStart=true;
startTime = endTime = System.currentTimeMillis();
repaint();
new Thread(this).start();
}else if(e.getID()==MouseEvent.MOUSE_RELEASED){
bStart=false;
repaint();
}
super.processMouseEvent(e);
}
public void paint(Graphics g){
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
Date elapsedTime=null;
try{
elapsedTime=sdf.parse("00:00:00");
}catch(Exception e){
}
elapsedTime.setTime(endTime-startTime+elapsedTime.getTime());
String display = sdf.format(elapsedTime);
g.drawRect(0, 0, 78, 28);
g.fill3DRect(2, 2, 75, 25, true);
g.setColor(Color.RED);
g.drawString(display, 10, 20);
}
public void run() {
while(bStart){
try{
Thread.sleep(500);
}catch(Exception e){
e.printStackTrace();
}
endTime=System.currentTimeMillis();
repaint();
}
}
}
Checkbox
Java 里提供的这个Checkbox 类来建立单选按钮和多选按钮,Checkbox 的使用很容易如果要创建多选按钮,我们只要使用 public Checkbox(String label,boolean state)这个构造函数来创建 Checkbox 对象就行了,创建多选按要用到两个参数,前一个是选框旁边的说明文字,后一个参数决定选框是否默认被选中。因为创建单选按钮需要一组按钮,所以在创建单选按钮时,还需要指定这个按钮所属的组,使用
public Checkbox(String label,boolean state,CheckboxGroup group)
这个构造函数创建的就是单选按钮。其中,CheckboxGroup 类对象指定了这个单选按钮所属于的组
对一般的程序来说,需要处理单选按钮和多选按钮的 ItemEvent 事件,从而获得用户选择的结果。处理 ItemEvent 事件的监听器接口为 ItemListener,其中只有一个itemStateChanged 方法,显然,ItemEvent 是一种语义事件
import java.awt.*;
import java.awt.event.*;
public class TestCheckbox {
Checkbox cb1=new Checkbox("你喜欢我吗?",true);
CheckboxGroup cbg =new CheckboxGroup();
Checkbox cb2=new Checkbox("喜欢",cbg,true);
Checkbox cb3=new Checkbox("不喜欢",cbg,false);
public void init(){
Frame f = new Frame("TestCheckABox");
FlowLayout f1 = new FlowLayout();
f.setLayout(f1);
f.add(cb1);
f.add(cb2);
f.add(cb3);
cb1.addItemListener(new CbItemListener());
cb2.addItemListener(new CbItemListener());
cb3.addItemListener(new CbItemListener());
f.setBounds(0, 0, 300, 100);
f.setVisible(true);
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
}
class CbItemListener implements ItemListener{
public void itemStateChanged(ItemEvent e) {
// TODO Auto-generated method stub
Checkbox cb = (Checkbox)e.getItemSelectable();
if(cb.getLabel().equals("你喜欢我吗?")){
if(cb.getState()==true)
System.out.println("我很高兴");
else
System.out.println("我很伤心");
}else{
Checkbox cbx = cbg.getSelectedCheckbox();
if(cbx !=null)
System.out.println(cbx.getLabel());
}
}
}
public static void main(String[] args) {
new TestCheckbox().init();
}
}
import java.awt.Choice;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class TestChoice {
Choice ch=new Choice();
TestChoice(){
ch.add("choice1");
ch.add("choice2");
ch.add("choice3");
FlowLayout f1 = new FlowLayout();
Frame f = new Frame("TestChoice");
f.setLayout(f1);
f.add(ch);
f.setBounds(0,0,200,100);
f.setVisible(true);
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
}
public static void main(String[] args) {
new TestChoice();
}
}
import java.awt.CheckboxMenuItem;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class TestMenuBar {
MenuBar menubar=new MenuBar();
Menu fileM=new Menu("File");
Menu editM=new Menu("Edit");
Menu toolsM=new Menu("Tools");
Menu helpM=new Menu("Help");
MenuItem fileMIl=new MenuItem("New");
MenuItem fileMI2=new MenuItem("Open");
MenuItem fileMI3=new MenuItem("Save");
CheckboxMenuItem fileMI5=new CheckboxMenuItem("Quit",true);
Menu filePrint = new Menu("print");
MenuItem printM1 = new MenuItem("preview");
MenuItem printM2 = new MenuItem("setting");
TestMenuBar(){
FlowLayout f1=new FlowLayout();
Frame f=new Frame("TestMenuBar");
f.setLayout(f1);
menubar.add(fileM);
menubar.add(editM);
menubar.add(toolsM);
menubar.add(helpM);
fileM.add(fileMIl);
fileM.add(fileMI2);
fileM.add(fileMI3);
filePrint.add(printM1);
filePrint.add(printM2);
fileM.add(filePrint);
fileM.addSeparator();
fileM.add(fileMI5);
f.setMenuBar(menubar);
f.setBounds(0,0,250,200);
f.setVisible(true);
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
}
public static void main(String[] args) {
new TestMenuBar();
}
}
Container
组件不能独立地显示出来,必须将组件放在一定的容器中才可以显示出来。像上面见到的窗口就是一个容器,类 Container 是所有容器的父类,容器(Container)实际上是Component 的子类,因此容器类对象本身也是一个组件,具有组件的所有性质,另外还具有容纳其他组件和容器的功能。容器类对象可以使用方法 add0添加组件
Window
Window类是可自由停泊的顶级窗口,它没有边框和菜单条,我们很少直接使用Window类,而是使用它的两个子类: Frame 类和 Dialog 类。Frame 对象显示效果是一个“窗口”带有标题和尺寸重置角标,默认初始化为不可见的,可以使用 setVisible(true)方法使之变为可见,在前面我们已经多次用到了 Frame 类
Dialog
Dialog(对话框)一般是一个临时的窗口,用于显示提示信息或接收用户输入。在对话框中一般不需要菜单条,也不需要改变窗口大小。有两种模式的对话框,模态对话框和非模态对话框。模态对话框显示时,用户不能操作其他窗口,直到这个对话框被关闭。非模态对话框显示时,用户还可以操作其他窗口。Dialog 类用来创建用户对话框,对话框和框架 (Frame)比较相似,同样可以在对话框上添加其他的组件
对话框不能独立存在,它必须有一个上级窗口,这个上级窗口就是对话框的拥有者。这两个构造方法的第一个参数代表对话框的拥有者,第二个参数是对话框标题,第二个参数设置对话框的模式,如果是 true,则为模态对话框,如果是 false,则为非模态对话框
import java.awt.Button;
import java.awt.Dialog;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class TestDialog {
TextField tf = new TextField(10);
Button b1=new Button("模态显示");
Button b2=new Button("非模拟显示");
Frame f=new Frame("TestDialog");
Button b3=new Button("确定");
Dialog dlg = new Dialog(f,"Dialog Title", true);
FlowLayout f1=new FlowLayout();
TestDialog(){
f.setLayout(f1);
f.add(tf);
f.add(b1);
f.add(b2);
b1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
dlg.setModal(false);
dlg.setVisible(true);
tf.setText("www.it315.org");
}
});
f.setBounds(0, 0, 400, 200);
f.setVisible(true);
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
dlg.setLayout(f1);
dlg.add(b3);
b3.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
dlg.dispose();
}
});
dlg.setBounds(0, 0, 200, 150);
}
public static void main(String[] args) {
new TestDialog();
}
}
Panel
Panel 可作为容器容纳其他组件,但不能独立存在,必须被添加到其他容器中(如Window 或Applet)。Panel是一个空白容器类,提供容纳组件的空间,通常用于集成其他的若干组件,使这些组件形成一个有机的整体,再增加到别的容器上
ScrollPane
我们有时候需要在一个较小的容器窗口中,显示较大的子部件,这时就需要用到ScrollPane类。ScrollPane 也是一种容器,不能单独使用,通过滚动窗日可以利用滚动条查看大面积区域。ScrollPane 中只能放置一个组件,无布局管理器。我们要将多个组件添加到ScrollPane 上,只能先将多个组件嵌套在一个 Panel 容器中,然后将这个 Panel作为-·个组件放置到 ScrolIPane 上
import java.awt.Frame;
import java.awt.ScrollPane;
import java.awt.TextArea;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class TestPane {
TestPane(){
Frame f=new Frame("TestDialog");
ScrollPane sp = new ScrollPane();
TextArea ta = new TextArea("",10,50,TextArea.SCROLLBARS_NONE);
sp.add(ta);
f.add(sp);
f.setSize(200,200);
f.setVisible(true);
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
}
public static void main(String[] args) {
new TestPane();
}
}
BorderLayout
我们将组件添加到容器时,需要指定组件放置的区域。当改变容器大小时,北方和南方的组件只改变宽度,东方和西方的组件只改变高度,而中间组件宽度和高度都会改变。在BorderLayout布局管理下,这个管理器允最多放置5个组件,如果我们想在窗口上放置更多的组件,可以将若于组件添加到一个 Panel上,然后将这个 Panel作为一个组件放置到窗口上。当容器上放置的组件少于五个,没有放置组件的区域将被相邻的区域占用。对Frame和 Dialog来说,默认的布局管理器就是 BorderLayout 布局管理器。在上面的程序里没有指定布局管理器,默认的BorderLayout布局管理器就把两个组件都放在中间了,所以实际上我们看到的是第二个按覆盖在第一个按钮上的效果。我们要想将上面例子中的第一个按钮放置在窗口上的北面,而第二个按钮放置在窗口的中间
import java.awt.Button;
import java.awt.Frame;
public class TestBorderLayout {
public static void main(String[] args) {
Frame f = new Frame("布局管理器");
f.add(new Button("第一个按钮"),"North");
f.add(new Button("第二个按钮"));
f.setSize(300,300);
f.setVisible(true);
}
}
可见,如果我们在使用Container.add 方法,没有指定位置参数时,AWT会用“Center作为这个组件的放置位置。注意,位置参数的字符串的书写是非常严格的,不能有任何大小写问题,必须是大写。对于这个问题,作者又要发一些牢骚了,真不明白Java 的设计人员当初怎么想的,在这些鸡毛蒜皮的小问题上都不让我们轻松,非要我们浪费一些时间去处理这些死板的细节。我们要是将“North”随手写成了“north”,也完全能够表达我们的意图啊,这对 SUN公司的 Java 设计人员并未增加什么处理难度!读者以后在编写软件时应多向 Microsoft 公司学习,在不增加自己多大的编程难度的情况下,尽量为用户提供方便和宽容,这反过来也为自己增加了用户的好感和信赖
FlowLayout
FlowLayout 是一个简单的布局风格,组件从左到右,从上到下依次排列。如果一个组件在本行放不下,就自动换到下一行的开始。FlowLayout 是 Panel和applet 的默认布局管理器调用Container.setLayout方法就可以改变容器的布局管理器
import java.awt.Button;
import java.awt.Frame;
public class TestFlowLayout {
public static void main(String[] args) {
Frame f = new Frame("布局管理器");
f.add(new Button("第一个按钮"),"North");
f.add(new Button("第二个按钮"));
f.add(new Button("第三个按钮"),"South");
f.add(new Button("第四个按钮"));
f.setSize(300,300);
f.setVisible(true);
}
}
GridLayout
GridLayout将容器划分成若干行列的网格。在容器上添加组件时,它们会按从左到右从上到下的顺序在网格中排列。在GridLayout 的构造方法里,我们需要指定希望将容器划分成的网格的行、列数。GridLayout 布局管理器总是忽略组件的最佳大小,所有单元的宽度是相同的,是根据单元数对可用宽度进行平分而定的。同样地,所有单元的高度是相同的,是根据行数对可用高度进行平分而定的
CardLayout
只有一个布局管理器来实现上面组件布局是相当困难的,所以下面的例子联合了更多的布局类型。如果我们创建两个 Panel对象,每个Panel上都能拥有一个布局管理器,在左边的 Panel上使用GridLayout 放置3个按钮,在右边的 Panel 上使用CardLayout 来放置卡片,最后在窗口上使用 BorderLayout 放置这两个面板。CardLayout 容器中带有 5 张卡片(用5 个按钮模拟),按下prev 按钮,依次向前显示,按下next 按钮,依次向后显示,按下three按钮,显示第三张卡片
import java.awt.Button;
import java.awt.CardLayout;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TestCardLayout {
CardLayout c1 = new CardLayout();
Panel plCenter = new Panel();
public static void main(String[] args) {
new TestCardLayout().init();
}
public void init(){
Frame f=new Frame("布局管理器");
Panel plWest = new Panel();
f.add(plWest,"West");
f.add(plCenter);
plWest.setLayout (new GridLayout(3,1));
Button btnPrev = new Button("prev");
plWest.add(btnPrev);
Button btnNext = new Button("next");
plWest.add(btnNext);
Button btnThree = new Button("three");
plWest.add(btnThree);
plCenter.setLayout(c1);
plCenter.add(new Button("One"),"1");
plCenter.add(new Button("two"),"2");
plCenter.add(new Button("three"),"3");
plCenter.add(new Button("four"),"4");
plCenter.add(new Button("five"),"5");
class MyActionListener implements ActionListener{
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("prev"))
c1.previous(plCenter);
else if(e.getActionCommand().equals("next"))
c1.next(plCenter);
else if(e.getActionCommand().equals("three"))
c1.show(plCenter,"3");
}
}
MyActionListener ma = new MyActionListener();
btnPrev.addActionListener(ma);
btnNext.addActionListener(ma);
btnThree.addActionListener(ma);
f.setSize(300,300);
f.setVisible(true);
}
}
GridBagLayout
前面讲到的布局管理器的功能还是相当有限的,只能满足我们一些简单的需求。在复杂的布局要求下,我们需要使用GridBagLayout 布局管理器。GridBagLayout有布局管理器之王的说法,其功能非常强大,使用时也比较复杂,读者可以在JDK 文档中了解到其详细说明及例子程序,考虑到一般的读者很少会使用到这种布局管理器,并且在 Swing 中我们可以有更简单的办法来实现GridBagLayout 布局管理器的功能,就不在这作更多的介绍了如果真的要进行这种复杂的布局设计,建议使用JBuilder 这样的集成开发环境来帮你完成
取消布局管理器
import java.awt.Button;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class TestNullLayout extends WindowAdapter{
TestNullLayout(){
Button b1=new Button("第一个按钮");
Button b2=new Button("第二个按钮");
b1.setBounds(10,30,80,30);
b2.setBounds(60,70,100,20);
Frame f=new Frame("TestNullLayout");
f.addWindowListener(this);
f.setLayout(null);
f.add(b1);
f.add(b2);
f.setBounds(0,0,200,200);
f.setVisible(true);
}
public static void main(String[] args) {
new TestNullLayout();
}
public void windowClosing(WindowEvent e){
System.exit(0);
}
}
Swing
图形用户接口(GUI)库最初的设计目标是让程序员构建一个通用的 GUI,使其在所有平台上都能正常显示。但遗憾的是,AWT 产生的是在各系统看来都同样欠住的图形用户接口。Java1.2为老的Java 1.0AWT 添加了Java 基础类(AWT),这是一个被称为“Swing的GUI的一部分。Swing 是第二代 GUI开发工具集,AWT 采用了与特定平台相关的实现而绝大多数 Swing 组件却不是。Swing 是构筑在AWT上层的一组 GUI组件的集合,为保证可移植性,它完全用 Java 语言编写,和AWT 相比,Swing 提供了更完整的组件,引入了许多新的特性和能力。Swing 提供更多的组件库,如:JTable,JTree,JComboBox。Swing也增强了 AWT 中组件的功能,这些增强的组件在 Swing 中的名称通常都是在AWT 组名前增加了一个“J”字母,如awt 中的 Button 在 Swing中是JButton
JFrame
JFrame 与 Frame 的功能相当,但两者在使用上还是有很大的区别。我们不能直接在JFrame上增加子部件和设置布局管理器,而是必须先调用JFramegetContentPane0方法JFrame 中自带的JRootPane 对象,JRootPane 是 JFrame 惟一的子组件,我们只能在这个IRootPane对象上增加子组件和设置布局管理器。当用户点击JFrame 上的关闭窗口按钮时JFrame会自动隐藏这个框架窗口,但没有真正关闭这个窗口,这个窗口还在内存中,我们需要在 windowClosing 事件处理方法中,调用这个窗口对象的dispose 方法来真正地关闭这个窗口。我们还可以调用JFrame 的 setDefaultCloseOperation 方法,设置JFrame 对这个事件的处理方式为JFrame.EXIT_ON CLOSE,当用户点击JFrame 上的关闭窗口按钮时,直接关闭这个框架窗口并结束程序的运行
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class TestPane {
TestPane(){
JFrame f=new JFrame("TestDialog");
JScrollPane sp = new JScrollPane();
JTextArea ta = new JTextArea(10,50);
sp.getViewport().setView(ta);
f.getContentPane().add(sp);
f.setSize(200,200);
f.setVisible(true);
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
}
public static void main(String[] args) {
new TestPane();
}
}
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.WindowConstants;
public class TestJDialog {
public static void mian(String[] args){
JOptionPane.showMessageDialog(null, "程序开始启动");
final JFrame f = new JFrame();
f.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
int retval= JOptionPane.showConfirmDialog(f, "你真的要结束吗","结束程序",JOptionPane.YES_NO_OPTION);
if(retval == JOptionPane.YES_OPTION)
System.exit(0);
}
});
f.setSize(200, 200);
f.setVisible(true);
}
}
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class Calculator implements ActionListener{
JFrame jf=new JFrame("Calculator");
JTextField tf=new JTextField();
public void init(){
Container c = jf.getContentPane();
tf.setHorizontalAlignment(JTextField.RIGHT);
c.add(tf,"North");
JPanel pnl=new JPanel();
c.add(pnl,"Center");
pnl.setLayout(new GridLayout(4,4));
JButton b=new JButton("1");
b.addActionListener(this);
pnl.add(b);
b=new JButton("2");
b.addActionListener(this);
pnl.add(b);
b=new JButton("3");
b.addActionListener(this);
pnl.add(b);
b=new JButton("+");
b.addActionListener(this);
pnl.add(b);
b=new JButton("4");
b.addActionListener(this);
pnl.add(b);
b=new JButton("5");
b.addActionListener(this);
pnl.add(b);
b=new JButton("6");
b.addActionListener(this);
pnl.add(b);
b=new JButton("-");
b.addActionListener(this);
pnl.add(b);
b=new JButton("7");
b.addActionListener(this);
pnl.add(b);
b=new JButton("8");
b.addActionListener(this);
pnl.add(b);
b=new JButton("9");
b.addActionListener(this);
pnl.add(b);
b=new JButton("*");
b.addActionListener(this);
pnl.add(b);
b=new JButton("0");
b.addActionListener(this);
pnl.add(b);
b=new JButton(".");
b.addActionListener(this);
pnl.add(b);
b=new JButton("=");
b.addActionListener(this);
pnl.add(b);
b=new JButton("\\");
b.addActionListener(this);
pnl.add(b);
jf.setSize(200, 300);
jf.setVisible(true);
}
public static void main(String[] args) {
new Calculator().init();
}
public void actionPerformed(ActionEvent e) {
tf.setText(tf.getText()+e.getActionCommand());
}
}
BoxLayout布局管理器
BoxLayout 是在Swing 中新增加的一种布局管理器,它允许多个组件全部垂直摆放或嵌套组合多个使用 BoxLayout 布局管理器的 Panel,可以帮我们实现类似全部水平摆放。GridBagLayout 的功能,们却要比直接使用 GridBagLayout 简单许多。作者在本章的讲解都只是告诉了大家怎样开发 GUL的程序,重在向读者讲解一些基本的原理和开发技巧及思想,不可能将所有的组件都拿出来介绍。Swing 中的某些组件,在使用上与对应的 AWT 中的组件还有些区别,如果读者想从事专业的 GUI程序开发,应尽量使用 Swing 下的组件,放弃 Awt 组件,以达到统一的效果。建议先在JDK 文档中查阅Swing 包,通读一下其所有的组件,也许一个在 AWT 下实现起来有些费劲的功能,在Swing 早就有一个很简单的组件已经可以帮你轻松搞定了。如果要实现特殊的 GUI功能和效果,需要去临时掌握一些特殊的组件,关于如何使用这些特殊的组件,最好和最快的办法就是,能够找到很好地使用了这些组件的例子程序,这时候,读者可以读读 JDK 的一些DEMO程序,或是到SUN公司的网站上下载《Java指南》文档(The Java Tutorial),从中来了解那些组件的使用方法,参照别人成功的方式,这才是我们对 GUI组件甚至所有编程语言的学习之道