Java核心技术上Swing用户界面组件_第1页
Java核心技术上Swing用户界面组件_第2页
Java核心技术上Swing用户界面组件_第3页
Java核心技术上Swing用户界面组件_第4页
Java核心技术上Swing用户界面组件_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1Java核心技术(上)医药信息工程学院陈伟广东药学院11.Swing与MVC设计模式2.布局管理器概述3.

常用组件介绍文本输入选择组件和单选按钮菜单工具栏4.

对话框对话框简介选项对话框文件对话框颜色对话框Swing用户界面组件2设计模式,--借鉴经验DesignPatterns的书籍中总结了很多设计模式组合模式装饰器模式策略模式MVC模式3MVC设计模式模型-视图-控制器模式模型:存储内容视图:显示内容控制器:处理用户输入4布局管理器当往窗口中放置组件时,首先要指定组件的放置策略。布局管理器:解决如何将组件安排在一个框架或面板内的问题。三种最简单的布局管理器:流布局管理器(flowlayoutmanager)-默认布局管理器边框布局管理器(borderlayoutmanager)网格布局管理器(gridlayoutmanger)5voidSetLayout(LayoutManagerm)为容器设置布局管理器Componentadd(Componentc);Componentadd(Componentc,Objectconstraints)将组件添加到容器,并返回组件的引用。61.流布局管理器流布局管理器(flowlayoutmanager)将组件按加入的先后次序从左至右排列在面板中。在JavaAPI库中,流布局管理器对应的类是FlowLayout,它有3个构造器:FlowLayout():居中对齐,水平间距和垂直间距都是5个像素。FlowLayout(intalign):指定对齐方式align,水平间距和垂直间距都是5个像素。FlowLayout(intalign,inthGap,intvGap):指定对齐方式align、水平间距和垂直像素。对于对齐方式,可以用FlowLayout类中的以下属性指定:LEFT/CENTER/RIGHT:左对齐/居中对齐/右对齐7流布局管理器的使用效果演示FlowLayoutTest.java8边框布局管理器边框布局管理器(borderlayoutmanager)把一个容器(例如panel)分成North、West、Center、East、South五部分,对应的类是BorderLayout。例:使用边界布局管理器,将一个Button放在South位置。panel.setLayout(newBorderLayout());panel.add(aButton,BorderLayout.SOUTH);BorderLayout是Window、Frame和Dialog缺省的布局管理器。

9效果举例仅使用BorderLayout来定位组件往往不能准确定位组件。下图显示了上一个页面中代码的执行结果:按钮自动扩展到填满框架的整个South区域;而且如果再往South区域添加一个新按钮时,旧按钮就会被替换掉。panel.setLayout(newBorderLayout());panel.add(aButton,BorderLayout.SOUTH);10面板嵌套可以通过面板嵌套来解决这个问题:1.创建一个新panel,命名为southPanel。2.在southPanel中设置按钮的布局方式,向southPanel中添加按钮。3.添加southPanel至South区域。JPanelsouthPanel=newsouthPanel();southPanel.add(yBt);southPanel.add(bBt);southPanel.add(rBt);panel.setLayout(newBorderLayout());panel.add(southPanel,BorderLayout.SOUTH);演示BorderLayoutTest.java11网格布局管理器网格布局管理器(gridlayoutmanger):这种布局是将容器分成单元格,每个单元格的大小都一样。例如:panel.setLayout(newGridLayout(2,3));将面板分成2行和3列,然后将组件添加到单元格中:panel.add(newJButton(“1”));panel.add(newJButton(“2”));组件的添加顺序是从第一行第一列开始,接着是第一行第二列……网格布局布局管理器总是忽略组件的最佳大小。所有单元的宽度和高度是相同的,是根据单元数对可用宽度和高度进行平分而定。12举例:计算器程序制作一个如图所示的计算器程序。使用面板嵌套技术:一个子面板,置于根面板的CENTER,该子面板内使用GridLayout布局。一个用于显示计算结果的按钮,使用BorderLayout放置于North13布局管理器小结布局管理器主要应用于容器类中。其一般使用步骤如下:1.获得容器类对象。例如:JPanelparentPanel=newJPanel();2.对该容器类对象设置布局管理器。例如:panel.setLayout(newGridLayout(2,3));3.根据布局管理器的特性,将组件放置于适当的位置。例如:panel.add(newJButton(“1”));4.如果需要获得更加精确的布局,可以使用容器类的嵌套。14复杂的布局管理器除了这些简单的布局管理器,Java还提供了一系列功能更加强大,使用起来也更加复杂的管理器:1.箱式布局管理器(BoxLayout)2.网格组布局管理器(GridbagLayout)3.弹簧布局管理器(SpringLayout)另外,用户还可以自定义布局管理器。详细介绍参考《java2核心技术卷I》P37015借用工具进行布局。如:Netbeans、WindowsBuilder.........16文本输入文本域(JTextField)和文本区(JTextArea):用于获取文本输入。

JTextField:接收单行文本输入。

JTextArea:接收多行文本输入。

JPasswordField:特殊的文本域,用户的输入不直接显示出来,而用其它字符代替,常用于输入密码。(自学)文本域的使用方法:JPanelpanel=newJPanel();JTextFieldtextField=newJTextField("Defaultinput",20);panel.add(textField);第一个参数“Defaultinput”:将文本域的缺省显示值为Defaultinput第二个参数20:列数,是指文本域显示的宽度为20列(并非可以输入的字符的个数)。17文本域JTextField的常用方法Java.swing.JTextFieldJTextField(intcols)构造一个指定列数的cols的JTextFieldJTextField(Stringtext,intcols)构造一个指定列数,指定初始字符串的JTextFieldvoidsetColumns(intcols)

设置文本域使用的列数18文本区(JTextArea)文本区JTextArea组件可以让用户输入多行文本。在JTextArea组件中,可以指定文本区的行数和列数:textArea=newJTextArea(8,40);//8行40列一行的结尾为’\n’(回车)符如果文本区的文本超出显示范围,则其余的文本会被剪裁。可以使用换行来避免行过长:textArea.setLineWrap(true);

在Swing中,文本区没有滚动条,需要手动安装:JScrollPanescrollPane=newJScrollPane(textArea)演示TextAreaTest.java19文本域JTextArea的常用方法Java.swing.JTextAreaJTextArea(introws,intcols)构造一个rows行cols列的新的文本区JTextArea(Stringtext,introws,intcols)用初始文本构造一个新的文本区voidsetRows(introws)

设置文本域使用的行数voidappend(StringnewText)将给定文本附加到文本区中已有文本的后面voidsetLineWrap(booleanwrap)打开或关闭换行Java.swing.JScrollPaneJScrollPane(Componentc)在组件c上添加滚动条,返回添加后的组件20文本域与文本区的常用方法Java.swing.text.JTextComponentvoidsetText(Stringt)用新文本改变文本组件中的文本StringgetText()

返回文本组件中的文本voidsetEditable(booleanb)

确定用户是否可以编辑JTextComponent中的内容Java.swing.JComponentvoidrevalidate()重新计算容器内所有组件的大小和位置,并对它们重新布局如panel.revalidate()21标签组件(JLabel)标签是容纳文本的组件。它们没有任何修饰(例如没有边界),也不响应用户输入。标签的常用用途之一就是标识组件,例如标识文本域。其使用步骤如下:1.创建一个JLabel组件例:

JLabellabel=newJLabel(“hours”,SwingConstants.RIGHT);或者JLabellabel=newJLabel(“hours”,JLabel.RIGHT);上面的代码创建了一个label,并指定label的对齐方式为右对齐。2.将标签组件放置在离标识的组件足够近的地方。22选择组件常见的选择组件有:复选框、单选按钮、选项列表以及滑块等。1).复选框JCheckBox如果想要接收的输入只有“是”或“非”两者的话,可以使用复选框组件。这种组件缺省带有标识标签。在构造器中可以指定该标签的文本:bold=new

JCheckBox(“Bold”);

用户点击复选框的动作监听器为实现ActionListener接口。(actionPerformed方法)23复选框实例:监听器使用实例:使用选中的字型显示字符串。……bold=newJCheckBox(“Bold”);italic=newJCheckBox(“Italic”);…….classCheckBoxListenerimplementActionListener{publicactionPerformed(ActionEventevent){}}……CheckBoxListenerlistener=newCheckBoxListerner();bold.addActionListener(listener);italic.addActionListener(listener)演示CheckBoxTest.java24复选框JCheckBox的常用函数Java.swing.JCheckBoxJCheckBox(Stringlabel)用给定的标签构造一个复选框JCheckBox(Stringlabel,booleastate)用给定的标签和初始化状态构造一个复选框booleanisSelected()

返回复选框状态voidsetSelected(booleanstate)为复选框设置状态252).单选按钮单选按钮(radiobuttongroup):提供一组选择项,用户在任何时刻只能选择一个选择项,每个选项都带有一个标签。在Swing中实现单选按钮对象的步骤:1.创建一个ButtonGroup对象ButtonGroup

group=newButtonGroup();2.将JRadioButton对象添加到按钮组中,ButtonGroup对象负责当新按钮被按下时,取消前一个按下的操作。JRadioButtonsmallButton=newJRadioButton("Small",false);group.add(smallButton);JRadioButtonmediumButton=newJRadioButton("Medium",true);group.add(mediumButton);3.将多个单选按钮添加到面板时要一个个添加panel.add(smallButton);panel.Add(mediumButton);26单选按钮实例:监听器使用策略用户点击单选按钮的动作监听器为实现ActionListener接口(actionPerformed方法)的类对象。方法一:如果各个单选按钮中的按钮的行为相似,可以让它们共享一个监听器。(需要在动作监听器中判断哪一个按钮被选中,然后才能作出响应)方法二:单选按钮的每个按钮对象设置其独有的监听器。(推荐)27单选按钮实例:监听器使用实例:当选中不同的按钮时,使用不同的字体显示字符串。演示RadioButtonTest.java28请自学边界(Border)密码框(JPasswordField)组合框(JComboBox)滑块(JSlider)微调控制器(JSpinner)294.菜单菜单的创建可以遵循以下步骤:1.创建一个菜单栏JMenuBarmenuBar=newJMenuBar();2.将菜单栏放置在frame的顶部。frame.setMenuBar(menuBar);3.为每个菜单建立一个菜单对象JMenueditMenu=newJMenu(“Edit”);4.将顶层菜单添加到菜单栏中menuBar.add(editMenu);菜单栏菜单菜单项子菜单项30菜单的创建可以遵循以下步骤(续):5.往菜单对象中添加菜单项、分隔符和子菜单JMenuItempasteItem=newJMenuItem("Paste");editMenu.add(pasteItem)等价于使用JMenu.add(String)方法将菜单项插入到菜单的末尾JMenuItempasteItem=editMenu.add("Paste");editMenu.addSeparator();JMenuoptionsMenu=newJMenu(“Options”)...;//一个子菜单

editMenu.add(optionsMenu);6.用户点击菜单项的动作监听器为实现ActionListener接口(actionPerformed方法)的类对象或关联一个动作事件:ActionListenerlistener=...;pasteItem.addActionListener(listener);或将一个动作直接与菜单项关联ActionListenerpasteAction=…;JMenuItemcutItem=newJMenuItem(cutAction);editMenu.add(pasteAction);31菜单中的图标JMenuItem类扩展自AbstractButton类,故菜单项与按钮很相似。有3种方法为菜单项指定一个图标:1.构造器方法JMenuItemcutItem=newJMenuItem(“Cut”,newImageIcon(“cut.gif”);//默认图形在名称的左侧2.setIcon方法cutItem.setIcon(newImageIcon(“cut.gif”);3.把一个图标添加到一个动作上,再用该动作构造菜单项cutAction.putValue(Action.SMALL_ICON,newImageIcon(“cut.gif”));JMenuItemcutItem=newJMenuItem(cutAction);使用动作构造菜单项时,Action.NAME将会成为菜单项的文本,而Action.SMALL_ICON成为图标。32弹出菜单弹出菜单(pop-upmenu):即单击鼠标右键可弹出的快捷菜单。建立弹出菜单的方法与一般菜单相似:(1)创建一个弹出式菜单JPopupMenupopup=newJPopupMenu();(2)在菜单中添加菜单项:JMenuItemitem=newJMenuItem("Cut");item.addActionListener(listener);popup.add(item);33弹出式触发器弹出式触发器(pop-uptrigger):用户点击鼠标某个键时,弹出菜单。在Windows或者Linux中,弹出式触发器是右键。要想在用户点击某一个组件的时候弹出菜单,就要使用弹出式触发器:component.setComponentPopupMenu(popup);34快捷键可以为菜单项设置快捷键。在当前菜单打开的情况下,可以按下某菜单项的快捷键,相当于鼠标单击了该菜单项。

JMenuItemCutItem=newJMenuItem(“Index”);CutItem.setMnemonic(“I”);

快捷键就会自动显示在菜单项中,快捷键下面有一条下划线。35加速器加速器可以在不打开菜单的情况下选中菜单项的快捷键。例如,很多程序把CTRL+O和CTRL+S关联到菜单中的Open和Save项。使用SetAccelerator方法可以将加速器关联到一个菜单项。该方法使用KeyStroke类型的对象作为参数。例如:openItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,InputEvent.CTRL_MASK));当用户按下加速器组合键时,就自动选择了相应的菜单项,同时激活一个动作事件。注意:加速器实际上并不打开菜单,而是直接激活菜单关联的动作事件。36启用和禁用菜单项在程序运行过程中,经常需要屏蔽某些暂时不适用的命令,待到条件允许时再使之重新可用。屏蔽/启用菜单项的方法:aMenuItem.setEnabled(boolean)当参数值为false时,屏蔽该菜单项;当参数值为true时,启用该菜单项;如果需要动态启用/屏蔽某菜单项,则需要为“menuselected”事件注册监听器。javax.swing.event包定义了MenuListener接口,它有三个方法:voidmenuSelected(MenuEventevent)voidmenuDeselected(MenuEventevent)voidmenuCanceled(MenuEventevent)37监听“menuselected”事件只需要监听“menuselected”事件,当一个菜单被选中时,将菜单中包含的需要被屏蔽的菜单项屏蔽掉即可。例如下列代码可屏蔽/打开Save按钮和SaveAs按钮。publicvoidmenuSelected(MenuEventevent){saveAction.setEnabled(!readonlyItem.isSelected());saveAsAction.setEnabled(!readonlyItem.isSelected());}注意:此处不使用仅用Save和SaveAs菜单项是因为对于拥有加速键的菜单项,即使菜单项被屏蔽,也可以使用加速键直接激发菜单项关联的动作事件。385.工具栏工具栏是在程序中提供快速访问常用命令的按钮栏。工具栏的特别之处在于可以移动,脱离工具栏或拖拽到框架其他地方,如图所示。39工具栏的创建创建工具栏时,直接将组件添加到工具栏中,再将工具栏放入框架中:JToolBarbar=newJToolBar();bar.add(blueButton);frame.add(bar,BorderLayout.NORTH);

也可以使用添加Action对象的方法来填充工具栏:bar.add(blueAction);可以设置工具提示:setToolTipText(String);如果使用Action对象,则可使用putValue方法putValue(Action.SHORT_DESCRIPTION,“…”)注意:按钮是工具栏中最常见的组件类型。但其它组件也可以放置在工具栏中,例如复选框等。40工具栏相关的常用方法Java.swing.JToolBarJToolBar()JToolBar(StringtitleString)

JToolBar(intorientation)//orientation:SwingConstants.HORIZONTAL或SwingConstants.VERTICALJButtonadd(Actiona)在工具栏添加与动作a关联的按钮voidaddSeparator()

在工具栏末尾添加一个分隔符Java.swing.JToolBarvoidsetToolTipText(Stringtext)设置当鼠标停留在组件上时显示的工具提示的文本41对话框的种类对话框分为模式对话框和无模式对话框。1.模式对话框在用户结束对它的操作之前,不允许用户与应用程序其它窗口的交互。模式对话框的作用:在程序继续运行之前,必须获得用户提供的信息。例如:用户希望读取某个文件,则可以使用模式对话框请求用户提供文件名以及路径。42无模式对话框无模式对话框运行用户同时在对话框和应用程序的其它窗口中输入信息。例如:工具栏。工具栏可以停靠在任何地方,并且用户可以在需要时与应用程序窗口和工具栏进行交互。下面将会介绍一些常用的对话框:选项对话框、文件对话框、颜色对话框431).选项对话框Swing提供了一组简单的对话框,用于收集用户提供的简单信息。JOptionPane有四个用于显示这些简单对话框的静态方法:showMessageDialog:显示一条消息,并等待用户点击OKshowConfirmDialog:显示一条消息,并等待用户点击确认(与OK/Cancel按钮类似)showOptionDialog:显示一条消息,并等待用户作出某一种选择showInputDialog:显示一条消息,并等待用户输入一行信息44选项对话框假设需要显示一个如图所示的对话框,要求用户确认或者取消,它是一个确认对话框:intselection=JOptionPane.showConfirmDialog(parent,“Message”,“Title”,//设置要显示的字符串和标题JOptionPane.OK_CANCEL_OPTION,//设置OK和Cancel按钮JOptionPane.QUESTION_MESSAGE);//设置图标为问题图标//selection的值指示了用户单击了哪一个按钮if(selection==JOptionPane.OK_OPTION)...

具体的参数选择可以参照JAVAAPI:DEFAULT_OPTIONYES_NO_OPTIONYES_NO_CANCEL_OPTIONOK_CANCEL_OPTION

图标设置参数:ERROR_MESSAGEINFORMATION_MESSAGEWARNING_MESSAGEQUESTION_MESSAGEPLAIN_MESSAGE45示例不同类型模式对话框示例OptionDialogTest.java46创建对话框如何创建一个对话框?可遵循以下几个步骤:1.创建一个派生自JDialog类的子类。2.在子类的构造器中,需要进行以下工作:(1)调用超类的构造器,用于指定对话框的拥有者(ownerframe),(也可以设置为null,但这样对话框有可能被隐藏在其它窗口后面),对话框的标题以及是否模式对话框(2)添加对话框的用户界面组件(3)添加相应的事件处理器(5)设置对话框的大小47举例:创建一个About对话框public

AboutDialog

extends

JDialog{publicAboutDialog(JFrameowner){

//调用超类构造器super(owner,“AboutDialogTest”,true);

//添加组件和事件监听器,true参数表示该对话框为模式对话框add(newJLabel(“…"),BorderLayout.CENTER);JPanelpanel=newJPanel();JButtonok=newJButton("Ok");ok.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEventevent){setVisible(false);}});

panel.add(ok);add(panel,BorderLayout.SOUTH);setSize(250,150);//设置对话框大小}}

演示DialogTest.java48练习:自定义数据交换对话框使用对话框的一个重要目的是获取用户的输入信息。举例:定义一个包含菜单栏的框架,菜单栏中包含一个菜单项File-connect,点击connect菜单项将弹出一个要求输入用户名和用户密码的对话框,该对话框有OK和Cancel两个按钮,如果用户点击OK按钮,则关闭对话框并将用户名和密码记入一个文本域组件中。

实验题492.文件对话框文件对话框用于帮助用户打开或者保存文件。下面是建立文件对话框并且获取用户选择信息的步骤:1.建立一个JFileChooser对象。与JDialog类构造器不同,这种对象不需要指定父组件,因而允许在多个框架中重用一个文件选择器:JFileChooserchooser=newJFileChooser();2.调用setCurrentDirectory方法设置当前目录chooser.setCurrentDirectory(newFile("."));3.如果要指定一个默认的文件名,可以使用setSelectedFile方法:chooser.setSelectedFile(newFile(filename));504.如果要允许用户能同时选中多个文件,可以使用setMultiSelectionEnabled方法:chooser.setMultiSelectionEnabled(true);5.如果希望在对话框中只显示某一类型的文件(如所有.gif文件),则需要文件过滤器。(后面讨论)6.默认情况下只能选中文件,如果希望允许用户选择目录,则需要使用setFileSelectionMode方法,相关参数值为:JFileChooser.FILES_ONLY/JFileChooser.DIRECTORIES_ONLY/JFileChooser.FILES_AND_DIRECTORIES例如:chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);517.调用showOpenDialog或者showSaveDialog方法显示对话框。必须为这些调用指定父组件:intresult=chooser.showOpenDialog(parent);

intresult=chooser.showSaveDialog(parent);//result的值可以为:JFileChooser.APPROVE_OPTION或JFileChooser.CANCEL_OPTION或JFileChooser.ERROR_OPTION8.使用getSelectedFile或者getSelectedFiles来获得选中的一个或多个文件。这些方法返回一个File对象或者一组File对象。如果需要文件对象名字时,可以调用getPath方法:Stringfilename=choo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论