版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第9章Swing用户界面组件西北师范大学计算机科学与工程学院主要内容9.1Swing与模型-视图-控制器设计模式9.2布局管理概述9.3文本输入9.4选择组件9.5菜单9.6复杂的布局管理9.7对话框9.1Swing与模型-视图-控制器设计模式9.1.1设计模式9.1.2MVC模式9.1.3Swing按钮的模型-视图-控制器分析面向对象软件最大的好处之一就是复用,不是解决任何问题都要从头做起。在众多的软件开发过程中,人们发现了许多问题都可以运用以前的设计方案解决现在的问题。设计模式也就应运而生,简单地说,设计模式是对反复出现的设计问题的重复解决方案。9.1.1设计模式AWT和Swing设计中常见的设计模式模型-视图-控制器容器和组件是“组合(composite)”模式带滚动条的面板是“装饰器(decorator)”模式布局管理器是“策略(strategy)”模式模式的一般格式首先描述背景,即引发设计问题的情形;接着解释问题,通常这里会有几个冲突的因素;最终,权衡这些冲突,给出问题的解决方案。以模型-视图-控制器设计模式为例:其背景是显示信息和接收用户输入的用户界面系统;冲突:对一些数据,可能需要同时更新多个可视化表示等等;解决方案:将这些功能分布到三个独立的交互组件:模型、视图和控制器。9.1.2MVC模式组件(component)三要素:
内容,如:按钮的状态(是否按下),或者文本框的文本;
外观(颜色、大小等);
行为(对事件的反应)。为了实现需求,Swing设计者采用了一种很有名的设计模式:模型-视图-控制器(model-view-controller)模式,简称MVC模式。
MVC模式的组成MVC模式是一种通用的框架,它由三部分组成,如图:控制器controller模型model视图view模型(Model)--存储并操作数据;视图(View)--显示模型中的数据;控制器(Control)--处理用户输入,并决定是否改变模型或者视图(通过调用相应的方法)。MVC模式实现的设计原则模型、视图、控制器对象之间的交互JavaMVC模式的优点一个模型可以有多个视图和多个控制器;当模型改变时,模型的视图能够自动地得到通知;在一个视图中改变模型的属性,可以使模型其他视图也随之更新;由于模型独立于视图,所以不需要修改模型来适应新类型的视图或控制器。为了简化组件的设计工作,在Swing组件中往往提供“组件包装器类”,将视图和模型两部分合为一体。包装器类起到了一个“转发命令”的作用:1.需要查询内容时:包装器类向Model查询并返回结果。2.需要改变视图时:包装器类将此请求转发给View.注意:包装器类不是万能的,有时候直接与Model打交道也是必要的。包装器类9.1.3Swing按钮的模型-视图-控制器分析按钮是最简单的用户界面元素,所以我们从按钮开始学习模型-视图-控制器模式会感觉容易些。对于复杂的Swing组件来说,所遇到的类和接口都是类似的。按钮JButton是一个包装器类。对于大多数组件,模型类实现了名字以Model结尾的接口,然后组件就会使用Model类对象。例如:按钮就实现了ButtonModel接口。例如:一个JButton对象中有一个存储其状态的分离模型ButtonModel对象(从其父类AbstractButton中继承)。可以通过下面的代码获得该ButtonModel对象:JButtonbutton=newJButton(“Blue”);ButtonModelmodel=button.getModel()注意:1.Model不存储按钮标签或者图标。——即无法通过模型来知道外观2.同一Model可用于不同组件。例如:DefaultButtonModel可用于下压按钮、单选按钮、复选框甚至菜单项。ButtonModel接口方法作用getActionCommand()与按钮关联的动作命令字符串getMnemonic()按钮的快捷键isArmed()如果按钮被按下且鼠标仍在按钮上时返回trueisEnabled()如果按钮是可选择的,返回true
isPressed()如果按钮被按下且鼠标按钮没有被释放,返回trueisRollover()如果鼠标在按钮之上,返回trueisSelected()如果按钮已被选择(用于复选框和单选按钮),返回trueButtonModel接口提供了一系列的方法来获取按钮模型维护时所需的数据。DefaultButtonModel(同样的模型)是一个实现了ButtonModel接口的类。即使是采用同一Model的按钮,可能会有各自不同的View和Controller。例如:当使用Metal观感时,JButton类会采用BasicButtonUI类作为其视图;用ButtonUIListener类作为控制器。注意:一般情况下,不必直接操作View——这是感观代码的工作。Java1.4不允许基本组件直接被加入到顶级容器中,以后的版本,基本组件即使允许被直接加入到顶级容器中,其中的组件也会互相覆盖,影响使用。为了设计美观合理的界面,则需要进一步考虑如何设计和控制组件在容器中的位置和相互关系,就需要学习布局设计的知识。在Java的GUI应用程序界面设计中,布局控制是通过为容器设置布局管理器来实现的。189.2布局管理器概述199.2.1布局管理器Java.awt包中定义了5种布局管理类,每一种布局管理类对应一种布局策略。每个容器都有缺省的布局管理器。当一个容器选定一种布局策略时,它应该创建该策略对应的布局管理器的对象,并将此对象设置为自己的布局管理器。20
Java中的布局类型有五种:(1)FlowLayout:流布局(Applet和Panel的默认布局管理器)(2)BorderLayout:边框布局(Window、Frame和Dialog的默认布局管理器)(3)GridLayout:网格布局(4)GridBagLayout:网格组布局(5)CardLayout:卡片布局布局管理器的种类21如何设置布局每个容器都有一个与它相关的缺省的布局管理器。在没有设置新的布局前,在容器中添加组件都按照该容器的缺省布局排列。可以通过setLayout()方法为容器设置新的布局。格式:容器组件名.setLayout(布局类对象名)229.2.2FlowLayout(流布局管理器)Flow布局管理器用于对组件逐行地定位,每完成一行,一个新行便又开始。与其他布局管理器不一样的是,Flow布局管理器不限制它所管理的组件的大小,允许它们有自己的最佳大小。FlowLayout的构造函数有:FlowLayout():生成一个默认的流式布局;FlowLayout(intalign):可以设定每一行组件的对齐方式(FlowLayout.LEFT,FlowLayout.CENTER,FlowLayout.RIGHT);FlowLayout(intalign,inthgap,intvgap):可以设定组件间的水平和垂直距离(缺省时组件之间没有空隙)。239.2.3BorderLayout(边框布局管理器)边框布局管理器是每个JFrame的内容窗格的默认布局管理器。流布局管理器完全控制每个组件的放置位置,边框布局管理器则不然组件可被置于内容窗格的中部,北部、南部、东部或西部位置。如果扩大窗口,用户将会看到中心区域会尽可能的扩大,而其他区域只扩大到容纳组件所需空间的大小。24BorderLayout的使用方法设置容器的布局管理器为BorderLayout;向容器中加入组件时,用户必须使用两个参数的add()方法,而且第一个参数必须为“North”、“South”、“East”、“West”或“Center”。259.2.4GridLayout(网格布局管理器)网格布局像电子数据表一样,按行列排列所有的组件。在网格布局对象的构造器中,需要指定行数和列数:panel.setLayout(newGredLayout(5,4));每个单元具有相同的尺寸。添加组件,从第一行和第一列开始,然后是第一行的第二列。以此类推。panel.add(newJButton("1"));panel.add(newJButton("2"));26GridLayout的使用方法GridLayout的构造函数如下所示:(1)GridLayout():生成一个单列的网格布局;(2)GridLayout(introws,intcols):生成一个设定行数和列数的网格布局;(3)GridLayout(introws,intcolumns,inthgap,intvgap):可以设置组件之间的水平和垂直间隔。27Grid布局管理器总是忽略组件的最佳大小。所有单元的宽度是相同的,是根据单元数对可用宽度进行平分而定的。同样地,所有单元的高度也是相同的,是根据行数对可用高度进行平分而定的。将组件添加到网格中的命令决定它们占有的单元。单元的行数是从左到右填充,就像文本一样,而页是从上到下由行填充。下面是一个GridLayout应用的示例。28importjava.awt.*;publicclassGridLayoutDemo{ publicstaticvoidmain(Stringargs[]) {GridLayoutGrid1=newGridLayout(3,2); Framef=newFrame("Gridexample");f.setSize(200,150);f.setLayout(newGridLayout(3,2)); Buttonb1=newButton("1"); Buttonb2=newButton("2");Buttonb3=newButton("3");Buttonb4=newButton("4");Buttonb5=newButton("5"); Buttonb6=newButton("6");
29f.add(b1);f.add(b2);f.add(b3);f.add(b4);f.add(b5); f.add(b6);f.setVisible(true); }}CardLayout的容器可以容纳多个组件,但是实际上同一时刻容器只能从这些组件中选出一个来显示,就象一叠“扑克牌”每次只能显示最上面的一张。9.2.5GardLayout(卡片布局管理器)为Frame类的实例f指定了一个CardLayout类型的布局管理器,然后向其中加入了五张卡片,每张卡片都是Panel类的一个实例,并且具有不同的背景色。每当在程序窗口单击鼠标时,下一张卡片就会显示出来。9.3文本输入首先介绍具有用户输入和编辑文本功能的组建(分类如右图)。三者都能用于获取文本输入。这三个类都继承于JTextComponent类,它是一个抽象类所以不能构造这个类的对象。在查看API文档时,经常会发现要找寻的方法实际上来自于父类JTextComponent,而不是来自派生类自身。文本输入组件文本域(JTextField)文本区(JTextArea)JPassword只能接受单行文本的输入。接受多行文本的输入。接收单行文本输入但不显示。JTextField是一个轻量级组件,所谓的轻量级组件是用JAVA代码画出来的,这样的组件具有平台移植性;一般建议采用轻量级组件,这可以提高程序的移植性,在Javax.Swing包里的组件大部分是轻量级的。API:javax.swing.text.JTextComponent
StringgetText()voidsetText(Stringt)获取或设置文本组件中的文本。booleanisEditable()voidsetEditable(booleanb)获取或设置editable特性。9.3.1文本域
构造方法JTextField()--文本域的长度为一个字符JTextField(intcols)--文本域的长度为X个字符JTextField(Stringtext)--文本域的初始字符串为textJTextField(Stringtext,intcols)--文本域的初始字符串为text,长度为cols个字符添加文本域把一个文本域添加到一个窗口的通常办法是把它添加到一个面板或其它容器中。
代码:
JPanelpanel=newJPanel();JTextFieldtextField=newJTextField(“文本域输入”20);panel.add(textField);改变文本域的大小列不是一个精确的测量单位,一列就是一个字符在当前使用的字体下的宽度。可用setColumn(intx)方法改变列的大小textField.setColumn(10);调用setColumn()方法后需要调用所在容器的validate方法,重新计算组件大小panel.validate();安装文档监听器
textField.getDocument().
addDocumentListener(listener)文档接口DocumentListener中含有三个方法:voidinsertUpdate(DocumentEvente)voidremoveUpdate(DocumentEvente)voidchangeUpdate(DocumentEvente)当文本发生改变后,上面三个方法中的一个会被调用。标签是容纳文本的组件,常用来标识别的组件。构造方法:JLabel(Stringtext)JLabel(Iconicon)JLabel(Stringtext,intalign)JLabel(Stringtext,Iconicon,intalign)9.3.2标签和标签组件
参数说明text:标签中的文本Icon:标签中的图标align:
SwingConstant.LEFTSwingConstant.RIGHTSwingConstant.CENTERvoidsetText(Stringtext)voidsetIcon(Iconicon)密码域是一种特殊类型的文本域,为了避免有不良企图的人看见密码,用户输入的字符不显示出来,每个输入的字符都用回显字符(echocharacter)表示。典型的回显字符是(*),Swing提供了JPasswordField类来实现这样的文本域。密码域是另一个应用模型-视图-控制器体系模式的例子。密码与采用与常规的文本域相同的模型来存储数据,但是,它的视图却改为显示回显字符而不是实际的字符。9.3.3密码域方法JPasswordField(Stringtext,intcolumns)——构造一个新的密码域对象。voidsetEchoChar(charecho)——为密码域设置回显字符。0表示重新设置为默认的回显字符。char[]getPassword()——返回密码域中的文本。使用之后应该覆写返回的数组内容。
当用户的输入超过一行时,就需要用到JTextArea组件来接受这样的输入,当在程序中放置一个文本区组件时,用户就可以输入多行文本,用ENTER键换行。每行都有一个“\n”结尾。在JTextArea组件的构造器中,可以指定文本区的行数和列数。
例如:textArea=newJTextArea(8,40);//8行40列如果文本区文本超出显示范围会被裁减,可开启换行避免。而且换行只是视觉效果,文本没有改变。9.3.4文本区
构造方法JTextArea(introws,intcols)JTextArea(Stringtext,introws,intcols)改变文本区大小setColumn(intcols)setRows(introws)追加文本append(StringnewText)打开或关闭换行setLineWrap(booleanword)
9.3.4文本区在Swing中,文本区没有滚动条,可以将文本区插入到滚动窗格(scrollpana)中。JTextAreatextArea=newJTextArea(8,40);JScrollPanescrollPane=newJScrollPane(textArea);contentPane.add(scrollPane,“Center”);如果文本超出了文本区可以显示的范围,滚动条就会自动的出现,并且在删除部分文本后能够显示在文本区范围内时,滚动条会再次自动消失。9.3.5滚动窗格滚动是由滚动窗格内部处理的,编写程序时无需处理滚动事件。这是一种为任意组件添加滚动功能的通用机制,而不是文本区特有的。也就是说,想要为组件添加滚动条,只需将它们放入一个滚动窗格中即可。注释:JTextArea组件只显示无格式的文本,没有特殊字体或者格式设置。如果想要显示格式化文本(如HTML),就需要使用JEditorPane类。程序9-2展示了各种文本组件。这个程序只是简单地显示了一个文本域,一个密码域和一个带滚动条的文本区。文本域和密码域都使用了标签。点击“Insert”会将组件中内容插入到文本区中。P339:程序清单9-29.4选择组件9.4.1选择框9.4.2单选按钮9.4.3边框9.4.4组合框9.4.5滑动条在输入的情况只是“是”或“否”。使用复选框;自动带有标志标签,获得焦点时可通过空格键切换;构造器指定标签
bold=newJCheckBox(“Bold”)isSelected返回复选框当前状态bold.setSelected(true)方法来选定或取消选定复选框9.4.1复选框添加监听器:ActionListenerlistener=……bold.addactionListener(listener)bold.removeactionListener(listener)监听器的接口方法为:actionPerformed()
程序实例API:Javax.swing.JCheckBox
JCheckBox(Stringlabel)
JCheckBox(Stringlabel,Iconicon)
构造一个复选框,初始没有被选择
JCheckBox(Stringlabel,booleanstate)
用给定的标签和初始化状态构造一个复选框,
设定初选状态。booleanisSelected()voidsetSelected(booleanstate)
获取或设置复选框选择状态9.4.2单选按钮复选框与单选按钮的区别按钮的区别:复选框与单选按钮外观不一样,复选框为正方形,选中出现一个对勾符号。单选按钮为圆形,选中出现一个原点。选择的区别:对于复选框可以选择一个,两个甚至多个。但是对于单选按钮只能选择一个。当选择下一个,前一个自动弹起。监听器的区别:每一个单选按钮对应一个不同的监听器对象。复选框共享一个动作监听器。添加监听器:ActionListenerlistener=……bold.addactionListener(listener)bold.removeactionListener(listener)监听器的接口方法为:actionPerformed()单选按钮实例APIjava.swing.JRadioButtonJRadioButton(Stringlabel,Iconicon)
构造一个单选按钮,初始没有被选择JRadioButton(Stringlabel,booleanstate)用给定的标签和初始状态构造一个单选按钮APIjavax.swing.ButtonGroupvoidadd(AbstractButtonb)
将按钮加到组中ButtonModelgetSelected()
返回被选择的按钮的模型APIjavax.swing.ButtonModel
StringgetActionCommand()返回按钮模型的动作命令APIjavax.swing.AbstractButtonvoidsetActionCommand(Strings)设置按钮其模型的动作命令
9.4.3边框可以用来指明那些按钮属于同一组。可以在任何继承了Jcomponent的组件上应用边框调用BordFactory的静态方法创建边框。风格(凹斜面,凸斜面,蚀刻,直线,蒙版,空)给边框添加标题:BorderFactory.createTitledBorder调用下列方法将几种边框组合起来BorderFactory.createCompoundBorder调用JComponent类中setBorder将结果边框添加到一个面板中。1.javax.swing.borderAbstractBorder所有边框类的父类2.BorderFactory使用工厂设计模式快速设计边框,隐藏创建细节。3.LineBorderLineBorder是围绕组件周围用户义定宽度的单色行边框。他可以具有方角或是圆角。
LineBorder有三个构造函数,两个工厂方法以及两个BorderFactory工厂方法。4.MatteBorder如果我们希望修改不同边的粗细,我们需要使用MatteBorder。5.TitleBorder6.BevelBorderBevelBorder以三维外观绘制边框,其可以表现为升起或是降低。当边框升起时,在边框的底部与右边会出现阴影效果。当降低时,阴影的位置会相反。BevelBorder有三个构造函数以及一个工厂方法,同时还有BorderFactory创建BevelBorder对象的五个工厂方法。7.SoftBevelBorderSoftBevelBorder是BevelBorder的近亲。这个组件会包围四角,所以他们的边并不尖利。
而他使用下边与右边的相应外边颜色只绘制一条线。8.EtchedBorder建立一个四周有凹痕的边界,也可以指定突边与阴影的颜色。9.CompoundBorder建立一个复合边界,并可以指定它的内外边界。9.4.4组合框当有多个选择项时,采用组合框。单选按钮占屏幕空间大。调用setEditable方法可以让组合框可编辑。编辑只会影响当前项,不会改变列表内容。可以调用getSelectedItem方法获取当前选择como.getItemAt(como.getSelectedIndex())为所选项提供正确的的类型。可通过addItem方法增加选项的调用。增加在尾部。其中insertItemAt在任何位置插入。insertItemAt(“X”,position)
当如果需要添加大量的选项时,构造函数,调用addElement方法进行加载。再调用JComboBox中setModel方法toString显示内容删除选项内容,可以使用removeItem(content)或者removeItemAt(postion)removeAllItem删除所有的选项。
若想持久的显示列表,而不是下拉列表,使用Jlist组件javax.swing.JComboBoxbooleanisEditable()voidsetEditable(booleanb)
获取或设置组合框的可编辑性。9.4.5滑动条JSildersilder=newJsilder(min,max,initialValue);默认为0,100,50垂直滑条JSildersilder=newJsilder(SwingConstants.VERICAL,min,max,initialValue);添加监听器:
ActionListenerlistener=……
listener.addChangeListener(listener)监听器的接口方法为:
StateChanged()javax.swing.JSilderSilder.setMajorTickSpacing(Num)显示一个大尺标标记
Silder.setMinorTickSpacing(Num)显示一个小尺标标记
Silder.setPaintTicks(true)显示标尺标记,否则隐藏Silder.setSnapToTicks(true)滑动条与标尺对齐Silder.setPaintTrack(false)隐藏滑动条Silder.setInverted(true)逆向滑动滑动条或者标签若不显示,检查是否调用setPaintTicks(True)和setPaintLabels(True)。每个滑动条都安装了一个改变事件的监听器。6.5菜单
菜单栏菜单
菜单项菜单栏菜单项菜单框架6.5.1菜单创建过程创建菜单栏JMenuBarmenuBar=newJMenuBar();
框架中添加菜单栏frame.setJMenuBar(menuBar);创建菜单JMenumenu=newJMenu(“File”);把菜单加入菜单栏中menuBar.addMenu(menu);创建菜单项JMenuItemsaveItem=newJMenuItem(“Save”);向菜单中添加菜单项menu.add(saveItem);6.5.2安装菜单项监听器当用户选择一个菜单项时,一个动作事件就会被触发
ActionListenerlistener=…..;pasteItem.addActionListener(listener);JMenu.add(Strings)是一个很方便的方法,它可以把一个菜单项添加到菜单的结尾
editMenu.add(“paste”);add()返回创建的子菜单项,因此可以捕获它的返回值并添加监听器
JMenuItempItem=editMenu.add(“Paste”);pItem.addActionListener(listener);6.5.3其它常用方法JMenuBar()创建一个菜单栏JMenu(Stringlabel)创建一个菜单JMenuItem(Stringlabel)创建一个菜单项voidaddSeparator()添加一个分隔行JMenuIteminsert(JMenuItem,intindex)
把一个菜单项添加到菜单的指定位置voidinsertSeparator(intindex)
把一个分隔符添加到菜单的指定位置voidremove(JMenuItemitem)删除指定菜单项6.5.4菜单项中的图标可以通过JMenuItem(String,Icon)或者MenuItem(Icon)来为菜单指定一个图标。用JMenuItem类中的setIcon方法来设定图标。例如:
JMenuItemcutItem=newJMenuItem(
“cut”,newImageIcon(“cut.gif”)6.5.5复选框菜单项创建一个复选框菜单项
JCheckBoxMenuItemreadonlyItem=newJCheckBoxMenuItem(“read-only”);optionsMenu.add(readonlyItem);
6.5.6单选按钮菜单项同常规按钮一样,先将其添入按钮组
ButtonGroupgroup=newButtonGroup();JRadioButtonMenuIteminsertItem=newJRadioButtonMenuItem(“insert”);insertItem.setSelected(true);JRadioButtonMenuItemovertypeItem=newJRadioButtonMenuItem(“overtype”);group.add(insertItem);group.add(OvertypeItem);optionsMenu.add(insertItem);optionsMenu.add(OvertypeItem);6.5.7弹出菜单是一种并非固定在菜单栏中,但是可随处浮动的菜单。创建弹出菜单JPopupMenupopup=newJPopupMenu();添加菜单JMenuItemitem=newJMenuItem(“cut”);item.addActionListener(listener);popup.add(item);弹出式菜单并不总显示在窗口顶部,必须用show方法显示。show(Componentc,intx,inty);
例:popup.show(Panel,x,y);通常用户点击某个鼠标键时,弹出菜单就会出现,这就是弹出触发器,通常为鼠标右键。使用触发器步骤如下:安装鼠标监听器在鼠标监听器中添加如下代码:publicvoidmouseReleased(MouseEventevent){if(event.isPopupTrigger())popup.show(event.getComponent(),event.getx(),event.gety());}例:MenuTest.java例子演示例子演示例子演示9.6复杂的布局管理在windows中,布局管理不是一个太大问题:首先,可以用对话框编辑器将组件拖放到对话框的表面上。然后,再使用编辑器工具完成组件对齐,均衡间隔,中心定位等工作。Java布局管理器是一种用于组件布局的好办法。应用布局管理器,布局就可以使用组件间关系的指令来完成布局操作。对于最初的AWT来说,这一点特别重要,这是因为AWT使用的是本用户界面元素。接下来,将进述网格组布局。这是因为这种布局在早期的Java版本中,使用的最普遍,且也是产生布局代码的最简单方式。80最复杂的布局管理器是GridBagLayout。GridBagLayout与GridLayout有点相似,它也是将组件排在格子里,但是GridBagLayout在网格的基础上提供更复杂的布局。它允许单个组件在一个单元中不填满整个单元,而只是占用最佳大小,也允许单个组件扩展成不止一个单元,并且可以用任意顺序加入组件。为了使用GridBagLayout,必须构造一个GridBagConstraints对象。GridBagConstraints用于指定如何用GridBagLayout放置组件。GridBagConstraints对象包含一些重要的约束,以指定组件的放置方式,这些约束的含义如下:9.6.1
GridBagLayout
(网格组布局)811.gridx、gridy、gridwidth和gridheight参数。这四个参数用于指定组件在网格中的位置。gridx和gridy值用于指定组件左上角的坐标;gridwidth和gridheight决定组件将占用多少行和列。2.增量域(weightx和weighty)。GridBagLayout内的每个区域都必须设置它的增量域,即weightx和weighty。如果将权值设置为0,那么这个区域就不会在那个方向上扩张或收缩,超出它的初始大小。从概念上讲,增量参数属于行和列的属性,而不属于摸个单独的单元格。但却需要在单元格上指定它们,这是因为网格组布局并不暴露行和列。注意,增量并不实际给出列的相对大小。3.fill和anchor参数。fill参数用于指定组件在单元格内进行伸缩时的填充方式,该参数可以有四种有效值:GridBagConstraints.NONE(不伸缩)、GridBagConstraints.HORIZONTAL(水平伸缩)、GridBagConstraints.VERTICAL(垂直伸缩)GridBagConstraints.BOTH如果组件没有填充整个区域,可以通过设置anchor域指定其位置。有效值为GridBagConstraints.CENTER,GridBagConstraints.NORTH,GridBagConstraints.NORTHEAST,GridBagConstraints.EAST等834.填充参数insets,ipadx和ipady。insets参数用于设置沿单元格边界的外部填充空白区域。ipadx和ipady则用于指定在环绕组件四周的单元格内部填充空白区域。5.指定gridx、gridy、gridwidth和gridheight参数的另一种方法(362页)6.使用帮助类管理(tame)网格组约束(363页)
849.6.2布局类型的选用
每个布局管理器都有自己特定的用途。要按行和列显示几个同样大小的组件,GridLayout(网格布局)会比较合适。要尽量使用所有的空间来显示组件,就要选择BorderLayout(边框布局)或GridBagLayout(网格组布局)。要在紧凑的一行中以组件的自然尺寸显示组件时,使用FlowLayout(流布局)。85有时候用户可能不想使用任何布局管理器,而只是想把组件放在一个固定的位置上。下面是将一个组件定位到莫个绝对定位的步骤:1)将布局管理器设置为nill。2)将组件添加到容器中。3)指定想要放置的位置和大小。frame.setLayout(null);Jbuttonok=newJbutton("ok");frame.add(ok);ok.setBounds(10,10,30,15);9.6.3不使用布局管理器9.6.4定制布局管理器原则上,可以通过自己设计LayoutManager类来实现特殊的布局方式。如果一定需要定制布局管理器,可以采用下面进述的定制布局管理器的方法。vouidaddLayoutComponent(Strings,Componentc);voidremoveLayoutComponent(Componentc);DimensionpreferredLayoutSize(Containerparent);DimensionminimumLayoutSize(Containerpanent);voidlayoutContainer(containerparent);9.6.5遍历顺序当把很多组件添加到窗口中时,需要考虑遍历顺序(traversalorder)的问题。在JavaSE1.4中有两个标准的遍历策略:
1)纯的AWT应用程序使用
DefaultFocusTraversalPolicy。
2)Swing应用程序使用
LayoutFocusTraversalPolicy。对话框分类:模式对话框:其特征是在处理完对话框之前不能同应用程序主窗口进行交互。如:文件模式对话框。无模式对话框:允许用户同时在对话框和程序剩余部分中输入信息。如:工具栏。9.7对话框Swing中的JOptionPane类提供了一些简单对话框用于收集用户的信息。JOptionPane类有四个静态方法来显示这些对话框:showMessageDialogshowConfirmDialogshowOptionDialogshowInputDialog9.7.1选项对话框消息类型消息对象显示方式按钮取决于对话框类型和选项类型,常用选项为:几个常用API:showMessageDialog(Componentparent,Objectmessage,Stringtitle,intmessageType,Iconicon);
showConfirmDialog(Componentparent,Objectmessage,Stringtitle,intoptionType,intmessageType,Iconicon);
showOptionDialog(Componentparent,Objectmessage,Stringtitle,intoptionType,intmessageType,Iconicon,Object[]option,Objectdefault);
showInputDialog(Componentparent,Objectmessage,Stringtitle,intmessageType,Iconicon,Object[]option,Objectdefault);例:显示一条信息并让用户确认或取消。代码如下:
intselection=JOptionPane.ShowConfirmDialog(parent,“message”,
“Title”,JOptionPane.OK_CANCEL_OPTION,JOptionPane.WARNING_MESSAGE);if(selection==JOption.OK_OPTION…..例:OptionDialogTest.java例子演示例子演示为了实现一个对话框,需要派生JDialog类的一个子类,步骤如下:在对话框的构造器中,调用基类JDialog的构造器。添加该对话框的用户界面组件。添加事件处理器。设置对话框的大小。9.7.2创建对话框classAboutDialogextendsJDialog{publicAboutDialog(JFrameowner){super(owner,"AboutDialogTest",true);ContainercontentPane=getContentPane();contentPane.add(newJLabel(
“
主只是一个对话框的例子"),BorderLayout.CENTER);
//OkbuttonclosesthedialogJButtonok=newJButton("Ok");ok.add
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二四年度大连市生猪买卖合同协议
- 2024年度电商企业财务咨询服务协议3篇
- 二零二四年度技术转让合同及技术资料保密协议
- 二零二四年技术支持与维护合同
- 导购员续签劳动合同(2篇)
- 公共厕所清洁保养协议
- 钢筋采购合同协议
- 二零二四年度艺人经纪与排他性表演合同
- 长期设备购销协议
- 卓越电气设计制作合同
- 违反师德师风惩戒办法
- 我是小小志愿者小学主题班会PPT
- 工伤职工医疗费报销单
- 细胞核的结构与功能说课课件 高一上学期生物人教版(2019)必修1
- MT 559-1996煤矿用带式输送机橡胶缓冲托辊安全性能检验规范
- GA/T 1567-2019城市道路交通隔离栏设置指南
- 幼儿规则意识培养《有趣的常规》课件
- 六朝志怪小说课件
- 2023江苏省高中学业水平合格性考试英语模拟试卷(含答案详解1)
- 设计任务通知单
- 北京理工大学2016级爆炸物理学习习题
评论
0/150
提交评论