资源描述
第外障图形用户界面世前事关学就必算机科学学和图形用户界面图形用户界面(Gr aphic al UserI nt er fac e,简称GUI)是人机交互接口,它是应用程序的外观。Java语言提供了一套用来构建用户界面的组件(c omponent),包括面板(Panel)、按 钮(But t on)、标签(Label).画板(Canvases)、滚动条(Sc r ollbar)、列表框(List)、文本域(Text Field)、文本区(Text Ar ea)等。8.1 AWT 与 Sw ing早期的JDK版本中提供的是Java抽象窗口 工具集(Abst r ac t Window Toolkit,简称AWT),相应的组件定义在 iava.aw t 包中。在后续的JDK版本中,又提供了功能更强的 Sw ing o Sw inq属于JavaTM Foundat ion Classes(简称JFC)的一部分。Sw ing 组件则定义在j avax.sw ing包中o1)AWT包 AWT中包含的主要类及相互的继承关系如图:2)Sw ing包 Sw ing包中主要的类与继承关系如图所示:java.awt.Container j avax.swing.JComponentJTextComponentJTextArea JTextField-JEdi tor PaneAbstractButtonJPasswordFieldJPanel JComboBox JLabel JLayeredPane JList JToolBar JMenuBar JPopupMenu JPanel JScrollBar JScrollPane JSlider JTable JSeparator JTree JProgressBar JRootPane JSplitPaneJToggleButton JButton JMenuItemJCheckBoxJRadioButtonJRadioButtonMenuItemJCheckBoxMenuItemJMenuAWT包与Sw ing包比较 Sw ing对AWT的改进主要的是体现在壬食 无关性上。Sw ing称为轻量级(light w eight)组件,在实现时可以完 全不依赖于本机环境。所以使用Sw ing组 件的程序移植性更好。AWT组件称为重量级(heavyw eight)组件,是指它含有较多的本机代码,平台无 关性不彻底,不便于程序移植。3)组件和容器组件是构成图形用户界面最基本的元素。组件的级 别是不同的,有些组件是最顶层的组件,可以在界 面窗口内直接显示。有一些组件不能单独存在,它 们必须被加入到某个组件中才能显示。能够容纳其 他组件的组件称为容器(c ont ainer),有了容 器,就可以构造嵌套关系的组件架构,从而形成复 杂的窗口界面。设计程序时,最外层的组件必须是容器,这些容器 称为顶层容器。Sw ing中共有四种顶层容器,分 另4为JFr ame、JApplet JDialog和 JWindow o例:窗口简单示例程序8-1:窗口简单示例。设计一个窗口要求 该程序运行之后,弹出的窗口如图8-3所示,窗口市有一个按钮。该程序代码如下:a)窗口简单示例代码程序8-1窗口简单示例/p1 42im por t j ava.aw t.*;im por t j avax.sw ing.*;public c lass JFr ameDemol public st at ic void main(St r ing ar gs)JFr ame fr ame=newJFr am e(H JFr am eH);/创建一个j Fr am e的实例JBut t on but t on=new JBut t on(HAFaEe”)二 塞/创建一个JBut t on的实例/将JBut t on放到JFr am e的中央fr am e.get Cont ent Pa ne().ad d(but t on);fr am e.pac k();/eDeo2.n X _ _ _A Button内容窗格的完整程序程序8-2创建新的内容窗格的完整程序im por t j ava.aw t.*;im por t j avax.sw ing.*;public c lass JFr ameDemo2 public st at ic void main(St r ing ar gs)JFr ame fr ame=newJFr ame(HJFr ameDemo2H);/创建一个JFr am e的实例JBut t on but t on=new JBut t on(ABut t。心昼 二/创建一个JBut t on的实例=JPanel c ont ent Pane=new JPanel();/创建一个J Pan el的实例内容窗格的完整程序/为JPanel设置Bor der Layout布局管理器 c ont ent Pane.set Layout(new Bor der Layou t();/将JBut t on放到JPanel的中央c ont ent Pane.add(but t on,Bo r d er Lay out.CENTER);1/为JFr am e设置新的内容窗格fr am e.set Con t ent Pan e(c on t ent Pane);fr am e.pac k();/JRadioBut t onAbstractButton Demo,lD|x|JButton JToggleButton JCheckBox O JRadioButton8.2.1 按钮这些按钮类均是Abst r ac t But t on的子类 或间接子类,各类之间的继承关系如图所示:=按钮 胃 But t on是最简单的按钮,它的构造方法中 可以指定在按钮上要显示的内容,既可以显 示文本,也可以显示图标。切换按钮(JToggleBut t on)具有两种状 态,即选中状态和未选中状态,每次单击导 致从一种状态变为另一种状态。构造方法中 如果没有指定按钮的初始状态,则默认地处 于未选中状态。JToggleBut t on 按钮口下图中第一个按钮未被单击过,为未选中状 态,第三个按钮被重击过一次,为选中状 态,三第士个按钮被单击过两次,又回到未 选中状太。建 JToggleButton Demo-ln|x|Button 1 I Button 2 Button 3JChec kBox 和 JRadioBut t on 按钮复选按钮(JChec kBox)允许同时选取多个选 顼,如图8-7中第一排的按钮所示。单选按钮(JRadioBut t on)顾名思义,只允许 在多种选择中选择一种,具有排他性,如图8-7 中第二排的按钮所示。,!1 x|JChe ckB ox-画 JCheckBox 1 JCheckBox 2 回 JCheckBox 3-JRadioButton-O JRadioButton 1 JRadioButton 2 O JRadioButton 3 e-:会 Two States Button Demo按钮示例 JChec kBox 和 JRadioBut t on 都是 JToggleBut t on的子类,构造方法的格式与 JToggleBut t on相同,它们也都具有选中和未 选中两种状态。程序8-3 各种按钮示例。/p1 44Buttons Deao 1 _ XJCheckBox0 JCheckBox 1 回 JCheckBox 2 JCheckBox 3 JCheckBox Group0 JCheckBox 4 JCheckBox 5 JCheckBox 6 JRadioButton(:JRadioButton 1 JRadioButton 2 O JRadioButton 3 JRadioButton Group JRadioButton 4 C JRadioButton 5 O JRadioButton 6im por t j ava.aw t.*im por t j ava.aw t.event.*im por t j avax.sw ing.im por t j avax.sw ing.bor der.*public c lass Sw ingComponent Demol(JFr am e fr am e=new JFr am e(But t ons Demo 1H);JChec kBox c hbox1=new JChec kBox(JChec kBox1t r u e);/第一组复选按钮,选中JChec kBox c hbox2=new JChec kBox(JChec kBox2”,t r ue);/选中JChec kBox c hbox3=new JChec kBox(HJChec kBox 3);/未选中JChec kBox c hbox4=new JChec kBox(JChec kBox4,t r ue);/第二组复选按钮JChec kBox c hbox5=new JChec kBox(nJChec kBox5,t r ue);/选中JChec kBox c hbox6=new JChec kBox(HJChec kBox 6”);JRadioBut t on r abut 1=newJ Rad ioBut t on(JRadioBut t on 1H,t r ue);II 第一组单选按钮JRadioBut t on r abut 2=newJRad ioBut t on(JRadioBut t on 2n,t r ue);JRadioBut t on r abut 3=newJRadioBut t on(JRadioBut t on 3);JRadioBut t on r abut 4=newJRadioBut t on(JRadioBut t on 4H,t r ue);/第二组单选按钮JRadioBut t on r abut 5=newJRadioBut t on(H JRadioBut t on 5n 5t r ue);JRadioBut t on r abut 6=newJRadioBut t on(JRadioBut t on 6”);public st at ic void m ain(St r ing ar gs目)Sw ingComponent Demol t est Com=newSw ingComponent Demol();t est Com.go();public void go()JPanel j panel=new JPanel();/定义4个面板,分别用来布置按钮JPanel j pane2=new JPanel();JPanel j pane3=new JPanel();JPanel j pane4=new JPanel();JPanel j panea=new JPanel();/用来放置上述4个面板,嵌套/第一个面板中放第一组复选按钮 j panel.add(c hbox1);/添加按钮j panel.add(c hbox2);j paneLadd(c hbox3);Bor der et c hed=Bor der Fac t or y.c r eat e Et c hed Bor der();Bor der bor der=Bor der Fac t or y.er e at eTit led Bo r d er(et c hed,JChec kBox);j pan el.set Bo r d er(bor der);/设置边框/第二个面板中放第二组复选按钮 j pane2.add(c hbox4);/添加按钮j pane2,add(c hbox5);j pane2,add(c hbox6);bor der=Bor der Fac t or y.c r eat eTit led Bo r d er(et c hed,JChec kBox Gr oup);j pane2,set Bor der(bor der);/设置边框/创建But t onGr oup按钮组,添力口第 二组复选按钮But t onGr oup gr oupl=new But t onGr oup();gr oupl.add(c hbox4);/建组后,这3个按钮相关,只能有一个是选中的gr oupl.add(c hbox5);gr oupl.add(c hbox6);/第三个面板中放第一组单选按钮 j pane3.add(r abut 1);/添加按钮j pane3.add(r abut 2);j pane3.add(r abut 3);bor der=Bor der Fac t or y.c r eat eTit ledBor der(et c hed,JRadioBut t on);j pan e3.set Bo r d er(bor der);/设置边框/第四个面板中放第二组单选按钮 j pane4.add(r abut 4);/添加按钮j pane4.add(r abut 5);j pane4,add(r abut 6);bor der=Bor der Fac t or y.c r eat eTit ledBor der(et c hedJRad io But t on Gr oup);j pan e4.set Bo r d er(bor der);/设置边框/创建But t onGr oup按钮组,添加第 二组单选按钮But t onGr oup gr oup2=new But t onGr oup();gr oup2.add(r abut 4);/建组后,这3个按钮相关,只能看一个是选中的gr oup2.add(r abut 5);gr oup2.add(r abut 6);j panea.set Layout(newGr idLayout(0,1);/设置布局管理器 j panea.add(j panel);j panea.add(j pane2);j panea.add(j pane3);j panea.add(j pane4);Cont ainer c ont pane=fr am e.get Cont ent Pane();c ont pane.set Layout(newGr idLayout(0,1);c ont pane.add(j panea);f r am e.set Defau It CloseOper at ion(JFr ame.EXI T_ON_CLOSE);fr ame.pac k();fr am e.set Visible(t r u e);8.2.2 标签(JLabel)标签对象通常用于显示提示性的内容,可以显示文 本信息,也可以显示图标。如:JLabel label=new JLabel(Hello”,JLabel.RIGHT);构造方法中的in t型参数hor izon t ai Align m ent 用来指定显示的信息在水平方向上的对方方式,它 的取值可以是JLabel.LEFT、JLabel.RI GHT和 JLabeLCENTER等常量,分别表示左对齐、右 对齐和居中。标签(JLabel)可以分别使用set Hor izon t ai Align m ent(int alignment)方法和set Ver t ic alAlignm ent(int alignment)方 法改变标签内容的水平或垂直对齐方式。改变水平 对齐方式时,alignm ent取值可为JLabel.LEFT、JLabel.RIGHT和 JLabel.CENTER等常量,改 变垂直对齐方式时,alignment取值可为 JLabel.TOP.JLabel.BOTTOM和 JLabel.CENTER 等常量。标签示例 JLabel label=new JLabel(Hello”,JLabeLRIGHT);/构造一个以右对齐方式显示的标签 labeLset Hor izont alAlignm ent(JLabeLCENTER);/显示内容设置为水平居中 labeLset Ver t ic alAlignm ent(JLabel.BOTTOM);/显示内容设置为底部对齐 label.set Ver t ic al Text Posit ion(JLabel.BOTTOM);/设置文本信息显示在图标的底部 labeLset Hor izont alText Posit ion(JLabel.CENTE R);/文本和图标都居中 在程序中,可以技用set Text(St r ing t ext)方法修改显示 卷标签上的文本信息,也可以使用set I c on(I c on ic on)方 法修改标签上的图标,但是在程序运行过程中,用户不能对 标签内容进行修改。标签示例程序8-4标签示例/P1 47程序8-4源代码im por t j ava.aw t.*;im por t j ava.aw t.event.*;im por t j avax.sw ing.*;public c lass JLabelDemo JFr ame fr ame=new JFr ame(nJLabel Demon JLabel labell,Iabel2,Iabel3 j abel4j abel5;public st at ic void m ain(St r ing ar gs)JLabelDemo labeldemo=newJLabelDemo();labeldemo.go();public void go()labell=new JLabel(nOnly Text Labeln);Iabel2=new JLabel(n Right Alignment Text Label”JLabel,RI GHT);/右对齐I m agel c on ic on=new I m agel c on(n./im age/j t.gifn);labels=new JLabel(ic on);Iabel3.set Ver t ic alAlignm ent(JLabel.BOTTOM);/底部对齐Iabel4=new JLabel(n I mage and Text”,ic on.JLabel.LEFT);/左对齐label4.set Ver t ic alAlignm ent(JLabel.TOP);/顶部对齐/设置文本信息和图标的相对位置:文本信息在图标的底 部,与图标中间对齐Iabel4.set Ver t ic alText Posit ion(JLabel.BOTTO M);I abel4.set Hor izo nt al Text Posit ion(J Lab el.CENT ER);iabel5=new JLabel(H I nput your nam eher e11);JText Field nam eField=new JText Field(12);/文本域JPanel panel=new JPanel();panel.add(label5);panel,ad d(name Field);JPanel panel2=new JPanel();panel2.set Layout(new Gr id Lay out(3,1);/3行1列panel2.add(label 1);panel2.add(label2);panel2.add(panel);Cont ainer c p=fr ame.get Cont ent Pane();c p.set Layout(new Gr id Lay out(3,1);c p.add(panel2);c p.add(label3);c p.add(Iabel4);f r am e.set DefauIt CloseOper at ion(JFr am e.E XIT_ON_CLOSE);f r am e.set Size(3 00,3 50);fr ame.set Visible(t r ue);)8.2.3组合框组合框(JComboBox)是一个下拉式菜单.程序中当一个输入框中的值只有若干种选择的 时候,可以将它们组织到组合框中,使用者只 需要从中选择就可以了。组合框分可编辑和不可编辑两种形式,对不可 编辑的组合框,用户区能在现有的选项列表中 选择其中之一:而可编辑的组合框,用户既可 以在现有选项中选择,也可以输入新的内容。组合框常用方法组合框中控制选项的方法:方法名功能addItem(Object anObject)insertItemAt(Object anObject,int index)removeItem(Object anObject)在末尾位置添加新的可选项在index指定的位置添加新的可选项 anObject删除由anObject指定的可选项组合框示例例8-4组合框示例St r ing it em List=“One”J Tw o,“Thr ee,“Four”,-JCom boBox j c b=new JCom boBox(it em List);/创建一个具有五个可选项的组合框程序8-5组合框示例/p1 49程序8-5源代码im por t j ava.aw t.*;im por t j ava.aw t.event.*;im por t j avax.sw ing.*;im por t j avax.sw ing.bor der.*;public c lass JCom boBoxDem o JFr am e fr am e=new JFr am e(JComboBox Demo”);JCom boBox j c b1,j c b2;public st at ic void m ain(St r ing ar gs)JCom boBoxDem o c bd=newJCom boBoxDem o();c bd.t est();)public void t est()/测试程序/创建内部JPanel容器JPanel panel=new JPanel();JPanel pane2=new JPanel();JPanel pane3=new JPanel();St r ing it em List=“一月“,”二月”J三月“,四月,五月“,六月,七月”,”八月“,”九月“,”十月V十一月”十二月”;j c b1=new JComboBox(it emList);/设置含5个初始选项的组合框j c b1.set Selec t ed I ndex(1);/设直第2 个可选项为当前的显示项,即显示二月panel.add(j c b1);Bor der et c hed=Bo r der Fac t o r y.er e at e Et c hed Bo r der();/边框Bor der bor der=Bo r der Fac t o r y.c r eat eTit led Bo r der(et c hed,H Unedit able JCom boBoxM);panel.set Bor der(bor der);/设置边框j c b2=new JCo m bo Box();/空的组合相/依次添加2个可选项j c b2.addl t em(第六项”);j c b2.addl t er n(第七项”);j c b2.set Edit ableft r u e);/将j c b2设置为可编辑的pane2.add(j c b2);bor der=Bo r der Fac t or y.c r eat eTit led Bo r der(et c hed,Edit able JComboBoxH);pane2.set Bor der(bor der);p a ne 3.set Layout(new Gr id Lay out(0,1);pane3.add(pane1);pane3.add(pane2);Cont ainer c p=fr ame.get Co nt ent Pane();c p.set Layout(new Gr idLayou t(0,1);c p.add(pane3);f r am.set DefauIt CloseOper at ion(JFr am e.E XIT_ON_CLOSE);fr am e.pac k();fr ame.set Visible(t r ue);8.2.4文本组件 Java提供了文本组件,专门用来处理输入较多文字的情况,文本组件既能显示信息,也可以接受用户的输入。在Sw ing中有多个文本组件,它们有共同的基类 JText Com ponent,如:1)文本域(JText Field)、2)口令输入域(JPassw or dField)、3)文本区(JText Ar ea)等。口文本域是一个单行的文本榆入框,可用于输入少量 文本.它的构造方法允许指定列数,也可以显示初 始字符串.文本区是一个多行多列的文本输入框,同样地,它 允许程序员设定初始的字符串,也允许设定初始的 行数和列数.文本组件示例例8-5文本组件示例/创建一个列数为30、有初始字符串的文本 域JText Field t f=newJText Field(Single Une”,3 0);/创建一个4行3 0列、有初始字符串的文本区JText Ar ea t a=newJText Ar ea(nit ial t ext55,4,3 0);8.2.5菜单组件.Sw ing包中提供了设计菜单时使用的多种组件,包括J防enuBar、JMenu.JMenu I t em.JPopupMenu JRadioBut t onMenult em 和J Chec k Box Men u I t em等,它们的继承关系 如图所示:,I Container j|“Component j _ I _I I I I S12Pop叩.511 II 2Abstra ctButtorJj era toi|B I _ S|Jfteniilten|QciieckboxMeiiMpen|JRadKoBmonMeiw 1)普通菜单示例例8-6菜单示例/定义菜单栏JFr am e f r am e=new JFr am e(uJMenu Barn);JMenuBar m enubar=new JMenuBar();/创建最上面一行的菜单fr ame.set JMenuBar(menubar);/定义菜单JMenu m enu 1=new JMenu(H FileH);/最上面一行菜单的内容JMenu m enu2=new JMenu(”Edit”);/第二项 menubar.add(menu1);/将菜单加入菜单栏中 m enubar.add(menu2);普通菜单示例/建立并添加菜单项JMenu I t em m i 1=new JMenult em(n Save11);JMenult em m i2=new JMenu I t em(“Load);JMenul t em m i3=new JMenu I t em(“Quit”);m enu 1.add(mil);/添加菜单项 m enu 1.add(m i2);menul.addSepar at or);/添加分隔线 m enu 1.add(m i3);2)特殊菜单项除了普通的菜单项之外,还有两种特殊的美 单项,分别是夏成素犁项和率成蕖泰与 X 选菜单项的前法看二a方框,单选不单项的G幅这两类特殊菜单项也可以显示文本和图我,同时可议在病病方法中用bool e&n型聋数指 定菜单项的初始状态。例如:JChec k Box Menu It em m i4=newJChec kBoxMenult em(复选未选中”);JRadioBut t onMenult em m i5=new JRadioBut t onMenult em(单选选 中”,t r ue);m enu2.add(m i4);m enu2.add(m i5);3)弹出式菜单final JPopupMenu p=new JPopupMenu(Popu p”);JMenu I t em save=new JMenult em(n Saven);JMenuI t em load=new JMenuI t em(M Load11);p.add(save);p.add(load);Cont ainer c on=fr am e.get Cont ent Pa ne();c on.addMou seList ener(new MouseAdapt er()(public void m ou se Re Ie ased(Mouse Event e)(if(e.isPopupTr igger()/判断是否要求弹出一个菜单 p.show(e.get Com ponent(),e.get X(),e.get Y(););8.2.6对话框 对话框有3类:普通对话框、标准对话框、文 件对话框 普通对话框(JDialog)是一个可移动窗口,能嵌速设萋为“盘工(mpc j w n”窗口.所谓“模式/窗口是指在筱浙口被关闭之前,其他窗 口无法接收任何形式的输入。对话框可以带标 题,并需要指定它的拥有者是哪个框架.例如 创建一个标题为Dialog”的模式对话框:JDialog dialog=newJDialog(fr am e/fiDialog5t r u e);这个对话框的拥有者为框架fr ame。对话框依 附于其朝有者,当拥有者被清除后,对话框也 被注希:如巢拥有者最小化,对话框也随之不 可见。2.标准对话框 Sw ing中还提供了用于显示标准对话框(J Opt io nPa ne)的JOpt ion Pane类.例如下面两个是常用的标准对话框:JOpt ionPane.show MessageDialog(fr ame,“File not found.,nAn er r or11,JOpt ion Pane.ERROR_MESSAGE);/信息对话框 JOpt ion Pane.show Opt ionDialog(fr am e,H Clic k OK t o c ont inu e”,“War ning”,JOpt ionPane.WARNI NG_MESSAGE,null,opt ions,opt ions 0);/选项对话框 补充知识:ht t p:/hi.baidu.c om/c flyc/it em/2df463 68 859efb1e7c dec c 3 b 3.文件对话框 H 文件对话框(JFileChooser)是专门用于对文件(或目 录)进行浏览和选择的对话框,刚刚创建的文件对话框是不 可见的,根据不同的文件对话框类型可以调用不同的方法将 其显示出来。例如show OpenDialog()方法将显示一个“打开”文件对话框.补充知识:ht t p:/hi.baidu.c om/c flyc/it em/705728a3 93 d763 fc 143 29b3 e打开奇:口 apl I miix.htinl|(a|旦且慵住I三一文件类覆:网畲文仲8.3布局管理器负责组件布局的机制是布局管理器,它用来决定窗口中各组 件的排列方式,从而决定着界面的美观程度与使用的方便性.Java为各个容器确定了默认的布局管理器,下表列出了 Java标准类库提供的几个预定义的布局管理器。布局管理器Border Layout将组件放到五个区域(北、南、东、西和中心)中。Box Layout将组件按一行或一列来排列。vara LayoutFlow Layout杼电忏取JU jt liW1?f珥次其HEM剃 TSB忤。将姐件从左至右排列,排小卜时另起一行。Grid Layout将组件放到横、纵的格子里。GridBag Layout将组件放到单元格里,允许组件占据多个单元。1.Flow Layout布局管理器 Flow Layout是简单常用的一种布局管理器.它象我们在 白纸上写字那样按行来放丑组件,按组件添加的次序逐个如:setLayout(new FlowLayout(FlowLayout.LEFT.200v400):2.Bor der Layout布局管理器 Bor der Lavout是顶层容器中内容窗格的默认布局管理器.每个由Bor der Layout管理的容器被划分成北(Nor t h)、南(Sout h)、西(West)、东(East)、中(Cent er)五个区域,分别代表容器的上、下、左、右和 中部,用常量Bor deLayout.NORTH、Bor der Layout.SOUTH、Bor der Layout.W EST、Bor der Layout.EAST Bor der Layout.CENTERS 示,在容器的每个区域可以加入一个组件.对East、Sout h West和Nor t h这四个边界区域,如果 其中的某个区城没有使用、那么它的大小将变为零,此时 Cent er区域将会扩展并占据这个未用区域的位置.布局管理示例 程序86布局管理示例/p1 55程序86布局管理示例的源代码pac kage p8_6_layout demo;im por t j ava.aw t.*;im por t j avax.sw ing.*;public c lass Layout Dem o pr ivat e JFr ame fr ame;/框架 public st at ic void m ain(St r ing ar gs)Layout Dem o t hat=newLayout Dem o();t hat.go();)public void go()f r am e=new JFr am e(H Layout Demo”);Cont ainer c ont ent PaneF=fr ame.get Cont ent Pa ne();/内容窗格/为内容窗格设置Flow Layout布局管理器c o nt ent Pan eF.se t Layout(new Flow Layout();JPanel I n ner Panel=new JPanel();/内层面板JPanel I n ner Pane2=new JPanel();/内层面板/为内层面板设置Bo r der Layout布局管理器I n ner Panel.set Layout f new Bo r der Layout();JBut t on but t onE=new JBut t on(H East*);/分别设置五个按钮JBut t on but t ons=new JBut t on(n Sout hH);/对应放到内层面板的五个区域中JBut t on but t on W=new JBut t on(H WestH);JBut t on but t onN=new JBut t on(Nor t h*1);JBut t on but t onC=new JBut t on(,Cent erH);I n n er Panel.addfbut t on E,Bor der Layout.EAST);/添加按钮到东部I nner Panel.add(but t onS,Bor der Layout.SOUTH);/添加按钮到南部I nner Panel.addfbut t onW,Bor der Layout.W EST);/添加按钮到西部I nner Panel.add(but t onN,Bor der Layout.NOR TH);/添加按钮到北部I n n er Panel.add(but
展开阅读全文