转自:http://www.blogjava.net/haizhige/archive/2008/08/08/220808.html

1、描述:图形用户界面是用户与计算机交互的接口,是图形界面成分和界面元素的有机会组合。这些成分和元素之间不但外观上有着包含、相邻、相交等物理关系,内在也有包含、调用等逻辑关系。它们相互作用,传递信息,共同组成一个能响应特定事件,具有一定功能的图形界面系统。
2、设计和实现图形用户界面的工作主要有两个:
            (1)外观设计:创建组成界面的成分和元素,指定其属性和位置关系,并根据具体需要对它们进行排列,从而构成完整的图形用户界面的物理外观。
            (2)与用户的交互处理:定义图形用户界面的事件和各界面元素对不同事件的响应,从而实现图形用户界面的用户交互功能。
3、Java构成图形用户界面的各种元素和成分大致分成三类:容器、基本组件、用户自定义成分
            (1)容器:容器是用来组织其他界面成分和元素的单元,其引入有利于分解图形用户界面的复杂性,当界面的功能较多时,使用层层相套的容器是非常必要的。容器的主要作用和特点:容器有一定的范围(高和宽决定)、容器有一定的位置(绝对位置和相对位置)、容器通常都有一个背景、同一容器中的成分将同时被显示或隐藏(这是安排容器元素的重要依据)、容器可以按一定的规则来物理地安排其所包含的元素、容器可以用来完成某种交互功能、容器也可被包含在其他容器之中。
            (2)基本组件:完成与用户的一次交互,包括接收用户的命令,接收用户的文本或选择输入,向用户显示文本或图形等。目前常用组件:标签(显示信息)、命令按钮(对应特定功能)、文本编辑区(接受用户输入并具有一定的编辑功能)、单选按钮(多选一)、复选框(二选一)、组合框(多选一或多选多)、菜单。
            (3)用户自定义的成分:编程人员根据需要而设计,但不能像标准界面元素一样被系统识别和承认,因此通常只能起到装饰和美化等作用,而不能响应用户的动作,不具有交互功能。
4、JavaGUI的组成:
            (1)java.awt包:AWT是一个抽象的工具集,因为Java程序的图形用户界面在不同的平台上可能出现不同的运行效果,其外观取决于具体的平台。
        AWT中的类按其功能分为五类:
                    §基本GUI组件类:Label(标签)、TestField(单行文本框)、TextArea(多行文本域)、Button(按钮)、Checkbox(复选框)、List(列表)、Canvas(画布)、Menu(菜单)和Scrollbar(滚动条)等。类java.awt.Component是许多组件类的父类,封装了组件通用的方法和属性,用于外观控制等。
                    §容器类(Container):常用的三个主要类型有窗口(Window)、面板(Panel)和Applet。Window是java.awt.Window的对象,显示屏上独立的本机窗口,主要包括框架(Frame)和对话框(Dialog)。
                    §布局管理类:流布局管理器(FlowLayout是Panel和Applet默认布局管理器)、边界布局管理器(BorderLayout)、网格布局管理器(GridLayout)、卡片布局管理器(CardLayout)、网格袋布局管理器(GridBagLayout)、盒式布局管理器(BoxLayout)、空布局管理器(null)。容器里组件的位置和大小是由布局管理器决定的,每个容器都有一个布局管理器,当容器需要对某个组件进行定位或判断其大小尺寸时,就会调用其对应的布局管理器。
                    §事件处理类:JDK1.1及其以后的版本中,AWT采用委托事件模型进行事件处理,委托事件模型包括事件源、事件和事件监听器。
                    §基本图形类:字体类(Font)、绘图类(Graphics)、图像类(Image)、颜色类(Color)等。用以构造图形界面的类。
            (2)java.swing包:Swing在AWT基础上构建,功能更强大和灵活,与AWT不同的是,Swing组件不是由特定的平台代码实现,而是纯粹的java代码实现的,因此能够实现与平台的无关(此类组件一般称为轻量级组件)。Swing采用MVC(模型—视图—控制)的设计范式,使java程序在一平台上运行时能够有不同外观以供用户选择。 
        Swing中的类按其功能分为六类:
                §顶层容器:JFrame、JApplet、JDialog和JWindow;
                §中间容器:JPanel、JScrollPane、JSplitPane和JToolBar;
                §特殊容器:JInternalFrame、JLayerPane和JRootPane;
                §基本组件:JButton、JComboBox、JList、JMenu、JSlider和JTextField
                §不可编辑信息组件:JLabel、JProgressBar和ToolTip
                §可编辑信息组件:JColorChooser、JFileChooser、JTable和JTextArea
    Swing中的JComponent类,提供了一些设置组件的方法:使用
setBorder()方法设置组件外围边框、使用setDoubleBuffered()方法设置双缓冲技术能改进频繁变化的组件显示效果、使用setToolTipText()方法为组件设置工具提示文本等。    Swing中的JComponent类,提供了一些设置组件的方法:使用setBorder()方法设置组件外围边框、使用setDoubleBuffered()方法设置双缓冲技术能改进频繁变化的组件显示效果、使用setToolTipText()方法为组件设置工具提示文本等。
    Swing程序设计的一般流程:引入java.swing包、选择“外观和感觉”、设置顶层容器、设置基本组件、向容器中添加组件、在组件周围添加边界、进行事件处理。

    Swing组件与AWT相比较所具有的优势:
                §Swing的按钮和标签可以显示图像,而在AWT只能显示文本。
                §可以很容易地增加或改变大多数Swing组件的边界。
                §通过Swing组件的方法或创建一个子类,可以很容易地改变Swing组件的行为和外观。
                §Swing组件可以不是矩形,例如按钮可以是椭圆形。
                §Accessibility技术(例如触摸屏)可以很容易地从Swing组件得到信息。
                §真正做到了与平台无关。

5 、一个awt实例(仅外观设计):

 
  
  1. import java.awt.*;  
  2. import java.awt.event.*;  
  3. public class frame {  
  4.     public static void main(String[] args) throws Exception{  
  5.         Frame fr=new Frame("awt演示程序");//构造Frame对象  
  6.         CardLayout cla=new CardLayout();//定义卡片布局引用  
  7.         fr.setSize(300400);//设置Frame大小  
  8.         fr.setLayout(cla);//设置Frame布局方式  
  9.         MenuBar mb=new MenuBar();//构建MenuBar  
  10.         Menu mson=new Menu("选择");//构建Menu对象mson  
  11.         mson.add("选择一个字符");//添加菜单项  
  12.         mson.add("选择一个单词");  
  13.         mson.add("选择整行");  
  14.         mson.add("选择整段");  
  15.         mson.add("全选");  
  16.         Menu m=new Menu("编辑");  
  17.         m.add("复制");  
  18.         m.add("剪切");  
  19.         m.add("粘贴");  
  20.         m.addSeparator();//添加分隔符  
  21.         m.add("替换");  
  22.         m.add("查找");  
  23.         m.add(mson);  
  24.         mb.add(m);//将菜单添加到菜单栏  
  25.         Card1 c1=new Card1();//卡片1  
  26.         Card2 c2=new Card2();//卡片2  
  27.         Card3 c3=new Card3();//卡片3  
  28.         fr.setMenuBar(mb);//frame对象添加菜单栏  
  29.         fr.add(c1, "c1");//添加卡片  
  30.         fr.add(c2, "c2");  
  31.         fr.add(c3,"c3");  
  32.         fr.addWindowListener(new WindowAdapter(){//添加Window事件,以能退出程序  
  33.             public void windowClosing(WindowEvent e){  
  34.                 System.exit(0);  
  35.             }  
  36.         });  
  37.         fr.setResizable(false);//用户不可设置frame对象尺寸  
  38.         fr.setVisible(true);//显示frame对象  
  39.         while(true){//循环显示卡片  
  40.             Thread.sleep(5000);//当前线程休眠50000毫秒  
  41.             cla.next(fr);  
  42.         }  
  43.     }  
  44. }  
  45.  
  46. //类Card1  
  47. class Card1 extends Panel{  
  48.     private Label la1,la2;  
  49.     private Button bt1,bt2;  
  50.     private TextField tf1,tf2;  
  51.     private TextArea ta;  
  52.     private Panel p;  
  53.     public Card1(){  
  54.         setSize(300,400);  
  55.         setLayout(new BorderLayout(5,10));  
  56.         la1=new Label("标签、按钮、文本框和多行文本框的演示",Label.CENTER);  
  57.         la2=new Label();  
  58.         la2.setText("版权所有:梦与桥");  
  59.         la2.setAlignment(Label.CENTER);  
  60.         la2.setBackground(Color.gray);  
  61.         bt1=new  Button("提交");  
  62.         bt2=new Button("重置");  
  63.         tf1=new TextField("文本框");  
  64.         tf2=new TextField("密码框");  
  65.         tf2.setEchoChar('*');//设置回显字符  
  66.         ta=new TextArea(10,40);  
  67.         ta.setText("多行文本框,此处设置的是10行,40列。");  
  68.         p=new Panel();  
  69.         p.setLayout(new FlowLayout(FlowLayout.CENTER,38,10));  
  70.         p.setBackground(Color.yellow);//设置背景颜色  
  71.         p.add(tf1);  
  72.         p.add(tf2);  
  73.         p.add(ta);  
  74.         p.add(bt1);  
  75.         p.add(bt2);  
  76.         add(la1,BorderLayout.NORTH);  
  77.         add(la2,BorderLayout.SOUTH);  
  78.         add(p,BorderLayout.CENTER);  
  79.     }  
  80. }  
  81.  
  82. //类Card2  
  83. class Card2 extends Panel{  
  84.     private Label la1,la2,la3,la4,la5,la6;  
  85.     Checkbox cb1,cb2,cb3,cb4,cb5,cb6;  
  86.     CheckboxGroup cbg;  
  87.     Choice c1;  
  88.     List l1;  
  89.     private Panel p,p1,p2,p3,p4;  
  90.     public Card2(){  
  91.         setSize(300,400);  
  92.         setLayout(new BorderLayout(5,10));  
  93.         la1=new Label("复选框、单选框、下拉列表、列表的演示",Label.CENTER);  
  94.         la2=new Label();  
  95.         la2.setText("版权所有:梦与桥");  
  96.         la2.setAlignment(Label.CENTER);  
  97.         la2.setBackground(Color.gray);  
  98.         la3=new Label("复选框:");  
  99.         la4=new Label("单选框:");  
  100.         la5=new Label("下拉列表:");  
  101.         la6=new Label("列表:");  
  102.         cb1=new Checkbox("体育",true);  
  103.         cb2=new Checkbox("文学");  
  104.         cb3=new Checkbox();  
  105.         cb3.setLabel("计算机");  
  106.         cb3.setState(true);  
  107.         p1=new Panel();  
  108.         p1.add(la3);  
  109.         p1.add(cb1);  
  110.         p1.add(cb2);  
  111.         p1.add(cb3);  
  112.         cbg=new CheckboxGroup();  
  113.         cb4=new Checkbox("北京",cbg,false);  
  114.         cb5=new Checkbox("上海",cbg,true);  
  115.         cb6=new Checkbox();  
  116.         cb6.setLabel("双阳");  
  117.         cb6.setCheckboxGroup(cbg);  
  118.         cb6.setState(false);  
  119.         p2=new Panel();  
  120.         p2.add(la4);  
  121.         p2.add(cb4);  
  122.         p2.add(cb5);  
  123.         p2.add(cb6);  
  124.         c1=new Choice();  
  125.         c1.add("one");  
  126.         c1.add("three");  
  127.         c1.insert("two"1);  
  128.         c1.select(2);  
  129.         p3=new Panel();  
  130.         p3.add(la5);  
  131.         p3.add(c1);  
  132.         l1=new List();  
  133.         l1.add("one");  
  134.         l1.add("two");  
  135.         l1.add("three");  
  136.         l1.add("four");  
  137.         l1.setMultipleMode(true);  
  138.         l1.select(1);  
  139.         l1.select(2);  
  140.         p4=new Panel();  
  141.         p4.add(la6);  
  142.         p4.add(l1);  
  143.         p=new Panel();  
  144.         p.setLayout(new FlowLayout(FlowLayout.LEFT,38,10));  
  145.         p.add(p1);  
  146.         p.add(p2);  
  147.         p.add(p3);  
  148.         p.add(p4);  
  149.         p.setBackground(Color.magenta);  
  150.         add(la1,BorderLayout.NORTH);  
  151.         add(la2,BorderLayout.SOUTH);  
  152.         add(p,BorderLayout.CENTER);  
  153.     }  
  154. }  
  155.  
  156. //类Card3  
  157. class Card3 extends Panel{  
  158.     private Label la1,la2,la3,la4;  
  159.     private Scrollbar sb1,sb2,sb3,sb4;  
  160.     private Canvas c;  
  161.     private Panel p,p1,p2,p3;  
  162.     public Card3(){  
  163.         setSize(300,400);  
  164.         setLayout(new BorderLayout(5,10));  
  165.         la1=new Label("滚动条、画布的演示",Label.CENTER);  
  166.         la2=new Label();  
  167.         la2.setText("版权所有:梦与桥");  
  168.         la2.setAlignment(Label.CENTER);  
  169.         la2.setBackground(Color.gray);  
  170.         la3=new Label("滚动条:");  
  171.         la4=new Label("画板:");  
  172.         sb1=new Scrollbar();  
  173.         sb2=new Scrollbar(Scrollbar.VERTICAL);  
  174.         p1=new Panel();  
  175.         p1.add(sb1);  
  176.         p1.add(sb2);  
  177.         p=new Panel();  
  178.         sb3=new Scrollbar(Scrollbar.HORIZONTAL);  
  179.         sb4=new Scrollbar(Scrollbar.HORIZONTAL,400,200,100,5000);  
  180.         p2=new Panel();  
  181.         p2.add(la3);  
  182.         p2.add(sb3);  
  183.         p2.add(sb4);  
  184.         c=new Canvas();c.setSize(200,160);  
  185.         p3=new Panel();  
  186.         p3.add(la4);  
  187.         p3.add(c);  
  188.         p3.setBackground(Color.white);  
  189.         p.setLayout(new FlowLayout(FlowLayout.CENTER,38,10));  
  190.         p.setBackground(Color.yellow);  
  191.         p.add(p1);  
  192.         p.add(p2);  
  193.         p.add(p3);  
  194.         add(la1,BorderLayout.NORTH);  
  195.         add(la2,BorderLayout.SOUTH);  
  196.         add(p,BorderLayout.CENTER);  
  197.     }  
  198. }6、Swing基本组件:JLabel、JTextField、JButton、JFrame和JPanel构造应用程序  
  199. import javax.swing.*;  
  200. public class LoginDemo extends JFrame{  
  201.     //声明组件  
  202.     JLabel lblTitle,lblUser,lblPass;  
  203.     JTextField txtUser;  
  204.     JPasswordField pwdPass;  
  205.     JButton btnLogin,btnExit;  
  206.     JPanel pnlMain;  
  207.     //构造方法  
  208.     public LoginDemo(){  
  209.         super("用户登录");  
  210.         pnlMain=new JPanel();  
  211.         this.getContentPane().add(pnlMain);  
  212.         //实例化组件  
  213.         String address="G:\\00\\p_w_picpaths\\";  
  214.         lblTitle=new JLabel(new ImageIcon(address+"welcome.gif"));  
  215.         lblUser=new JLabel("用户名:");  
  216.         txtUser=new JTextField(12);  
  217.         lblPass=new JLabel("密码:");  
  218.         pwdPass=new JPasswordField(12);  
  219.         //"登录"按钮  
  220.         Icon imgLogin=new ImageIcon(address+"login.gif");  
  221.         btnLogin=new JButton("登录(L)",imgLogin);  
  222.         btnLogin.setMnemonic('L');//键盘助记符  
  223.         btnLogin.setToolTipText("点击登录");//工具提示文字  
  224.         //"退出"按钮  
  225.         Icon imgExit=new ImageIcon(address+"exit.gif");  
  226.         btnExit=new JButton("退出(x)",imgExit);  
  227.         btnLogin.setMnemonic('X');  
  228.         btnExit.setToolTipText("退出登录");  
  229.         //添加组件到面板  
  230.         pnlMain.add(lblTitle);  
  231.         pnlMain.add(lblUser);  
  232.         pnlMain.add(txtUser);  
  233.         pnlMain.add(lblPass);  
  234.         pnlMain.add(pwdPass);  
  235.         pnlMain.add(btnLogin);  
  236.         pnlMain.add(btnExit);  
  237.         //设置窗口属性  
  238.         setSize(450,400);  
  239.         setResizable(false);  
  240.         setVisible(true);  
  241.         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
  242.     }  
  243.     public static void main(String[] args) {  
  244.         new LoginDemo();  
  245.     }  
  246.  
  247. }  
  248. 7、 单选按钮(JRadioButton)、复选框(JCheckbox)、列表框(JList)、组合框(JComboBox)编程演示: import javax.swing.*;  
  249. import java.awt.*;  
  250. public class FontDemo extends JFrame{  
  251.     JPanel pnlMain;  
  252.     JLabel lblSize,lblType,lblTest;  
  253.     JRadioButton rbtnRed,rbtnGreen;  
  254.     JCheckBox chkBold,chkItalic;  
  255.     JButton btnExit;  
  256.     ButtonGroup grpColor;  
  257.     List lstSize;  
  258.     JComboBox cmbType;  
  259.     String[] strType={"宋体","隶书","楷体_GB2312","仿宋_GB2312"};  
  260.     public FontDemo(){  
  261.         super("字体设置器");  
  262.         lblType=new JLabel("请选择字体");  
  263.         lblSize=new JLabel("请选择字形");  
  264.         //使用List构造字形选择列表  
  265.         lstSize=new List();  
  266.         for(int i=10;i<30;i+=2)  
  267.             lstSize.add(String.valueOf(i));  
  268.         lstSize.select(0);  
  269.         //使用JComboBox和StrType构造字体选择组合框  
  270.         cmbType=new JComboBox(strType);  
  271.         cmbType.setSelectedIndex(0);  
  272.         //使用JRadioButton构造字体颜色选择单选按钮  
  273.         grpColor=new ButtonGroup();  
  274.         rbtnRed=new JRadioButton("红色");  
  275.         grpColor.add(rbtnRed);  
  276.         rbtnRed.setSelected(true);  
  277.         rbtnGreen=new JRadioButton("绿色");  
  278.         grpColor.add(rbtnGreen);  
  279.         //使用JCheckBox构造字体效果选择复选框  
  280.         chkBold=new JCheckBox("加粗");  
  281.         chkItalic=new JCheckBox("倾斜");  
  282.         lblTest=new JLabel("这是字体设置的测试文字");  
  283.         //创建一个指定类型的斜面边框  
  284.         lblTest.setBorder(BorderFactory.createBevelBorder(1));  
  285.           
  286.         btnExit=new JButton("退出");  
  287.         //布局组件  
  288.         pnlMain=new JPanel();  
  289.         pnlMain.add(lblType);  
  290.         pnlMain.add(cmbType);  
  291.         pnlMain.add(lblSize);  
  292.         pnlMain.add(lstSize);  
  293.         pnlMain.add(rbtnRed);  
  294.         pnlMain.add(rbtnGreen);  
  295.         pnlMain.add(chkBold);  
  296.         pnlMain.add(chkItalic);  
  297.         pnlMain.add(lblTest);  
  298.         pnlMain.add(btnExit);  
  299.           
  300.         this.setContentPane(pnlMain);//将面板设置为Frame的容器  
  301.         this.setSize(250,200);  
  302.         this.setVisible(true);  
  303.         }  
  304.     public static void main(String[] args) {  
  305.         new FontDemo();  
  306.     }  
  307.  
  308. }  
  309. 8、文本域(JTextArea)、菜单(JMenuBar、JMenu、JMenuItem)和工具栏(JToolbar)程序演示  import javax.swing.*;  
  310.  
  311. import java.awt.*;  
  312. import java.awt.event.*;  
  313. import java.net.URL;  
  314. public class NotepadDemo extends JFrame{  
  315.     JMenuBar mbMain;  
  316.     JMenu mnuSystem,mnuHelp;  
  317.     JMenuItem mnuiNew,mnuiSave,mnuiOpen,mnuiExit,mnuiContent,mnuiIndex,mnuiAbout;  
  318.     public NotepadDemo(){  
  319.         super("小小记事本");  
  320.         mbMain=new JMenuBar();  
  321.         mnuSystem=new JMenu("文件(F)");  
  322.         mnuHelp=new JMenu("帮助(H)");  
  323.         mnuSystem.setMnemonic('F');  
  324.         mnuHelp.setMnemonic(KeyEvent.VK_H);  
  325.         mbMain.add(mnuSystem);  
  326.         mbMain.add(mnuHelp);  
  327.         mnuiNew=new JMenuItem("新建");  
  328.         mnuiOpen=new JMenuItem("打开");  
  329.         mnuiSave=new JMenuItem("保存");  
  330.         mnuiExit=new JMenuItem("退出");  
  331.         mnuSystem.add(mnuiNew);  
  332.         mnuSystem.add(mnuiSave);  
  333.         mnuSystem.add(mnuiSave);  
  334.         mnuSystem.add(mnuiExit);  
  335.         Icon icnContent=new ImageIcon("help.gif");  
  336.         mnuiContent=new JMenuItem("目录",icnContent);  
  337.         mnuiIndex=new JMenuItem("索引");  
  338.         mnuiAbout=new JMenuItem("关于[Notepad]");  
  339.         mnuHelp.add(mnuiContent);  
  340.         mnuHelp.add(mnuiIndex);  
  341.         mnuHelp.add(mnuiAbout);  
  342.         setJMenuBar(mbMain);  
  343.         //构造工具栏  
  344.         JToolBar tb=new JToolBar();  
  345.         //添加按钮到工具栏  
  346.         JButton btnNew=null;  
  347.         btnNew=makeButton("new","NEW","新建一个文件","新建");  
  348.         tb.add(btnNew);  
  349.         JButton btnOpen=null;  
  350.         btnOpen=makeButton("open","OPEN","打开一个文件","打开");  
  351.         tb.add(btnOpen);  
  352.         JButton btnSave=null;  
  353.         btnSave=makeButton("save","SAVE","保存一个文件","保存");  
  354.         tb.add(btnSave);  
  355.         JPanel pnlMain=new JPanel(new BorderLayout());  
  356.         setContentPane(pnlMain);  
  357.         pnlMain.add(tb,BorderLayout.PAGE_START);  
  358.           
  359.         setSize(250,150);  
  360.         setVisible(true);  
  361.         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
  362.     }  
  363.     //构造工具栏按钮方法  
  364.     private JButton makeButton(String strImage, String strAction, String txtToolTip,  
  365.             String strAlter) {  
  366.         //搜索图片  
  367.         String imgLocation=strImage+".gif";  
  368.         URL urlImage=NotepadDemo.class.getResource(imgLocation);  
  369.         //初始化工具按钮  
  370.         JButton btnTemp=new JButton();  
  371.         //设置按钮的命令  
  372.         btnTemp.setActionCommand(strAction);  
  373.         //设置提示信息  
  374.         btnTemp.setToolTipText(txtToolTip);  
  375.         if(urlImage!=null)//找到图像  
  376.             btnTemp.setIcon(new ImageIcon(urlImage));  
  377.         else             //没有图像  
  378.             btnTemp.setText(strAlter);  
  379.         return btnTemp;  
  380.     }  
  381.     public static void main(String[] args) {  
  382.         new NotepadDemo();  
  383.     }  
  384.  
  385. }  
  386. 8、颜色(Color)和字体(Font)程序演示 : import java.awt.*;  
  387. import javax.swing.*;  
  388. public class ColorFontDemo extends JFrame{  
  389.     JLabel lblTitle,lblHead;  
  390.     JPanel pnlMain;  
  391.     Font fn1=new Font("宋体",Font.ITALIC,20);  
  392.     Font fn2=new Font("楷体",Font.ITALIC+Font.BOLD,18);  
  393.     Color cl=new Color(20);  
  394.     public ColorFontDemo(){  
  395.         lblTitle=new JLabel("吉林农业大学发展学院");  
  396.         lblHead=new JLabel("计算机学院05软件");  
  397.         pnlMain=new JPanel();  
  398.         lblTitle.setFont(fn1);  
  399.         lblTitle.setForeground(Color.RED);  
  400.         lblHead.setFont(fn2);  
  401.         lblHead.setForeground(cl);  
  402.         this.getContentPane().add(pnlMain);  
  403.           
  404.         pnlMain.add(lblTitle);  
  405.         pnlMain.add(lblHead);  
  406.           
  407.         setSize(300,150);  
  408.         setVisible(true);  
  409.         setTitle("颜色字体演示");  
  410.         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
  411.     }  
  412.     public static void main(String[] args) {  
  413.         new ColorFontDemo();  
  414.     }  
  415.  
  416. }  
  417. 9、一个使用JTable的例子:  
  418. import javax.swing.*;  
  419. import javax.swing.event.*;  
  420. import javax.swing.table.TableModel;  
  421. import java.awt.*;  
  422. import java.awt.event.*;  
  423. public class GuiTest extends JFrame  
  424. {  
  425.     private JTable table;  
  426.     private String data[][];  
  427.     public static void main(String args[])  
  428.     {  
  429.         GuiTest gt=new GuiTest();  
  430.         //pack()是java.awt.Window的方法  
  431.         //调整此窗口的大小,以适合其子组件的首选大小和布局。  
  432.         gt.pack();  
  433.         gt.setVisible(true);  
  434.     }  
  435.     public GuiTest()  
  436.     {  
  437.         String columnNames[]={"姓名","计算机","英语","平均分"};  
  438.         data=new String[][]{{"小一","90.0","60.0","75.0"},{"小二","90.0","80.0","85.0"}  
  439.         ,{"小三","100.0","80.0","90.0"}};  
  440.         table=new JTable(data,columnNames);  
  441.         //设置某个表视区的首选大小  
  442.         //java.awt.Dimension封闭单个单个对象中组件的宽度和高度(精确到整数)  
  443.         table.setPreferredScrollableViewportSize(new Dimension(300,100));  
  444.         JScrollPane tablePane=new JScrollPane(table);  
  445.         setTitle("表格的使用");  
  446.         Container c=getContentPane();  
  447.         c.add(tablePane,BorderLayout.CENTER);  
  448.         addWindowListener(new WindowAdapter()  
  449.         {  
  450.             public void windowClosing(WindowEvent e)  
  451.             {  
  452.                 System.exit(0);  
  453.             }  
  454.         });  
  455.         //设置为单选  
  456.         //接口 ListSelectionModel表示任何组件的当前选择状态  
  457.         table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);  
  458.         //接口 TableModel指定了 JTable 用于询问表格式数据模型的方法  
  459.         TableModel mod=table.getModel();  
  460.         //每当数据模型发生更改时,就将一个侦听器添加到被通知的列表中  
  461.         //TableModelListener 定义侦听 TableModel 中更改的对象的接口  
  462.         mod.addTableModelListener(new TableModelListener()  
  463.         {  
  464.             public void tableChanged(TableModelEvent e)  
  465.             {  
  466.                 int row=e.getFirstRow();  
  467.                 float num,sum=0;  
  468.                 for(int i=1;i<=2;i++)  
  469.                 {  
  470.                     num=Float.parseFloat((String)table.getValueAt(row,i));  
  471.                     sum=sum+num;  
  472.                 }  
  473.                 float average=sum/2;  
  474.                 data[row][3]=Float.toString(average);  
  475.             }  
  476.         });  
  477.     }