Java程序设计16用户界面开发_第1页
Java程序设计16用户界面开发_第2页
Java程序设计16用户界面开发_第3页
Java程序设计16用户界面开发_第4页
Java程序设计16用户界面开发_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

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

文档简介

Java程序设计第16章用户界面开发学习目标利用JFrame创建可定制的应用程序主窗口理解组件和容器的差异,区别顶级容器和中间容器的作用能够灵活应用布局管理器组织界面如何向容器中添加和布局组件理解事件机制,掌握各类监听器的创建、注册和处理掌握基本的图形处理程序开发16.1.1从AWT到Swing抽象窗口工具包AWT(AbstractWindowToolkit)是Java类库程序提供的建立图形用户界面GUI(GraphicsUserInterface)工具集,Swing类提供了GUI编程较为通用的部分,被统称为JavaFoundationClasses(Java语言基础类,简称JFC)。Swing采用了一种MVC的设计范式,即"模型-视图-控制"(Model-View-Controller),其中模型用来保存内容,视图用来显示内容,控制器用来控制用户输入。16.1.2模型-视图-控制体系

Swing胜过AWT的主要优势在于MVC体系结构的普遍使用。在一个MVC用户界面中,存在三个相互通信的对象:模型、视图和控件。模型是指定的逻辑表示法视图是模型的可视化表示法控件则指定了如何处理用户输入。当模型发生改变时,它会通知所有依赖它的视图,视图使用控件指定其响应机制。16.1.3创建第一个Swing窗口

publicclassFirstSwingApp{publicstaticvoidmain(String[]args){//创建一个顶层容器并设置其标题为FirstSwingApp。JFrameframe=newJFrame("FirstSwingApp");frame.add(newJButton(“OK”));//向窗口中增加一个按钮//设置窗口中右上角的关闭按钮图标的缺省操作事件是关闭程序frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setSize(600,400);//设置窗口对象的尺寸/让窗口对象自行决定以最合适的方式显示窗口,并不依赖前面的定义尺寸frame.pack();frame.setVisible(true);//最后,让窗口对象可见}}图16-1JFrame的继承层次16.2容器和基本组件

组件(Component)代表一种可以显示在屏幕上的图形元素,也是一种能与用户进行交互的Java对象,例如一个按钮,一个标签等。组件不能独立地显示出来,必须将组件放在一定的容器中才可以显示出来。容器(Container)容器类继承于Component类,其本身及其子类可以容纳其他组件对象Swing应用程序的容器层次设计GUI时,都有用于放置可视化组件的主窗口。Container对象可用于将组件组合在一起。容器中的组件根据特定布局排列。Swing中的容器有两类:-顶级容器-中间容器顶级容器JFrame:用于框架窗口的类,此窗口带有边框、标题、用于关闭和最小化窗口的图标等。带GUI的应用程序通常至少使用一个框架窗口。JDialog:用于对话框的类。JApplet:用于使用Swing组件的JavaApplet的类。中间容器JPanel:最灵活、最常用的中间容器。JScrollPane:与JPanel类似,但还可在大的组件或可扩展组件周围提供滚动条。JTabbedPane:包含多个组件,但一次只显示一个组件。用户可在组件之间方便地切换。JToolBar:按行或列排列一组组件(通常是按钮)。Swing类结构图Swing有很多组件,这些组件从功能上分为以下几类。顶层容器:JFrame,JApplet,JDialog,JWindow共4个。中间容器:JPanel,Box,JScrollPane,JSplitPane,JToolBar。特殊容器:在GUI上起特殊作用的中间层,如JInternalFrame,JLayeredPane,JRootPane。基本控件:实现人机交互的组件,如JButton,JComboBox,JList,JMenu,JSlider,

JTextField等。不可编辑信息的显示:向用户显示不可编辑信息的组件,例如JLabel,JProgressBar,JToolTip等。可编辑信息的显示:向用户显示能被编辑的格式化信息的组件,如JColorChooser,JFileChoose,

JFileChooser,

JTable,

JTextArea等。16.2.1设计主窗口

可以作为容器的类很多,但是能够作为顶级容器控制整个界面的只有JFrame等四个,而这4个顶级容器中,JApplet类主要开发用于在浏览器中的applet小程序JWindow它没有标题栏、窗口管理按钮或者其他与JFrame关联的修饰,并不适合做主窗口JFrame对象是用来代表应用程序的主窗口的最佳选择JDialog通常需要一个JFrame对象来构造。16.1.3创建第一个Swing窗口

importjavax.swing.JFrame;publicclassMyFirstSwingAppextendsJFrame{publicMyFirstSwingApp(Stringtitle,intwidth,intheight){ super(title);//调用父类构造方法,同时设置窗口标题

//设置窗口的显示尺寸

this.setSize(width,height); //设置窗口的关闭动作为关闭整个程序

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //一般在构造方法中组织自己的主界面显示}

SwingGUI框架你好,世界菜单栏顶级容器GUI组件GUI组件内容窗格16.2.2添加组件到窗口

JFrame对象的getContentPane()方法返回一个对contentPane的引用JFrameJFrame组件用于在Swing程序中创建窗体,是放置其他Swing组件的顶级容器,它的构造函数:JFrame()JFrame(StringTitle)缺省的布局管理器是BoderLayout添加组件到内容窗格,两种方法,示例:frame.getContentPane().add(newJButton(“button”));frame.add(newJButton(“button”));JFrame包含一个JRootPane作为其惟一的子容器,用来管理其所有内容,包括:内容窗格菜单分层窗格玻璃窗格大部分情况下,我们只使用内容窗格关闭FramesetDefaultCloseOperation(int

operation)设置用户在此窗体上发起"close"时默认执行的操作。必须指定以下选项之一:DO_NOTHING_ON_CLOSE(在WindowConstants中定义):不执行任何操作;要求程序在已注册的WindowListener对象的windowClosing方法中处理该操作。HIDE_ON_CLOSE(在WindowConstants中定义):调用任意已注册的WindowListener对象后自动隐藏该窗体。DISPOSE_ON_CLOSE(在WindowConstants中定义):调用任意已注册WindowListener的对象后自动隐藏并释放该窗体。EXIT_ON_CLOSE(在JFrame中定义):使用Systemexit方法退出应用程序。仅在应用程序中使用。默认情况下,该值被设置为HIDE_ON_CLOSE。常用的JFrame方法voidadd(Componentc)voidsetJMenuBar(JMenuBarMenu)voidpack()voidremove(Componentc)voidsetIconImage(Iconimage)voidsetLayout(LayoutManagerlayout)voidsetSize(intwidth,intheight)16.2.3组件的基本功能颜色设置可以使用setBackground()方法和setForeground()来设置组件的背景色和前景色btnOK.setBackground(Color.BLUE);边框设置使用setBorder()方法可以设置组件外围的边框btnOK.setBorder(BorderFactory.createLineBorder(Color.RED));双缓冲区使用双缓冲技术能改进频繁变化的组件的显示效果,如果想关闭双缓冲区,可以在组件上施加setDoubleBuffered(false)方法提示信息:使用setTooltipText()方法,为组件设置对用户有帮助的提示信息btnOK.setToolTipText("Hi,这是一个按钮");键盘导航:用setMnemonic()方法指定一个字符,通过这个字符和一个当前L&F(LookandFeel,观感)的无鼠标修饰符(通常是Alt)共同激活按钮动作btnOK.setMnemonic(KeyEvent.VK_O);可插入L&F:每个JComponent对象有一个相应的ComponentUI对象,为它完成所有的绘画、事件处理、决定尺寸大小等工作。ComponentUI对象依赖当前使用的L&F,用UIManager.setLookAndFeel()方法可以设置需要的L&F。支持布局:通过设置组件最大、最小、推荐尺寸的方法和设置X、Y对齐参数值的方法能指定布局管理器的约束条件,为布局提供支持。16.2.4按钮JButton

JButton类允许用图标、字符串或两者同时构造一个按钮JButton()//创建不带有设置文本或图标的按钮。JButton(Iconicon)//创建一个带图标的按钮。JButton(Stringtext)//创建一个带文本的按钮。JButton(Stringtext,Iconicon)//创建一个带初始文本和图标的按钮。ImageIconbuttonIcon=newImageIcon("on.gif");JButtonbtnLogin=newJButton("登陆(L)",buttonIcon);btnLogin.setMnemonic(KeyEvent.VK_L);16.2.5标签JLabelJLabel对象可以显示文本、图像或同时显示二者JLabelJLabel(IconimageJLabel(Iconimage,inthorizontalAlignment)JLabel(Stringtext)

JLabel(Stringtext,Iconicon,inthorizontalAlignment)JLabel(Stringtext,inthorizontalAlignment)aImageIconicon=newImageIcon("on.gif");JLabellblUser=newJLabel("用户名",icon,SwingConstants.LEFT);SwingConstants中定义的以下常量:LEFT、CENTER、RIGHT、LEADING或TRAILING,定义了组件的对齐方式16.2.6文本组件单行文本输入框JTextFieldJTextField()JTextField(Documentdoc,Stringtext,intcolumns)JTextField(intcolumns)JTextField(Stringtext)JTextField(Stringtext,intcolumns)其他主要方法publicStringgetText()//获取组件包含的文本publicStringgetText(intoffs,intlen)//获取组件包含的文本部分(有偏移量和长度决定)publicStringgetSelectedText()//返回此TextComponent中包含的选定文本多行纯文本编辑框JTextAreaJTextArea()JTextArea(introws,intcolumns)JTextArea(Stringtext)JTextArea(Stringtext,introws,intcolumns)密码输入框JPasswordFieldJPasswordField()JPasswordField(intcolumns)JPasswordField(Stringtext)JPasswordField(Stringtext,intcolumns)设置输入字符的回显字符的方法是:publicvoidsetEchoChar(char

c)16.2.7选择性输入组件JCheckBox复选框是一个可以被选定和取消选定的项,它将其选择状态显示给用户。JCheckBox()JCheckBox(Iconicon)JCheckBox(Iconicon,booleanselected)JCheckBox(Stringtext)JCheckBox(Stringtext,booleanselected)JCheckBox(Stringtext,Iconicon)JCheckBox(Stringtext,Iconicon,booleanselected)判断一个复选框是否被选中的方法是publicbooleanisSelected()JRadioButtonRadioButton实现一个单选按钮,一般和ButtonGroup对象结合,实现多中选一的目标。JRadioButtonrdb1=newJRadioButton("rdb1");JRadioButtonrdb2=newJRadioButton("rdb2");JRadioButtonrdb3=newJRadioButton("rdb3");//下面将三个按钮加入到一个组中,而剩余两个没有加入ButtonGroupbg=newButtonGroup();bg.add(rdb1);bg.add(rdb2);bg.add(rdb3);JRadioButtonrdb4=newJRadioButton("rdb4");ButtonGroup只是对JRadioButton进行了逻辑分组,本身不是一个组件类16.2.8列表JListJList用来显示对象列表并且允许用户选择一个或多个项的组件。单独的模型ListModel维护列表的内容。JList()JList(ListModeldataModel)JList(Object[]listData)JList(Vector<?>listData)String[]data={"one","two","three","four"};JListmyList=newJList(data);myList.setBorder(BorderFactory.createEtchedBorder());//设置myList的边框设置选择模式一个JList的默认选择模式是任意选择,通过调用对象的setSelectionMode方法可以修改选择模式ListSelectionModel.SINGLE_INTERVAL_SELECTION:一次只能选择一个连续间隔ListSelectionModel.MULTIPLE_INTERVAL_SELECTION:在此模式中,不存在对选择的限制。此模式是默认设置。myList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);获得选择的数据publicintgetSelectedIndex();返回最小的选择单元索引;选择了多项时,则只返回最小的选择索引。如果什么也没有选择,则返回

-1publicObjectgetSelectedValue();可以获得所选的对象publicint[]getSelectedIndices();所选的全部索引(按升序排列);如果什么也没有选择,则返回一个空数组。publicObject[]getSelectedValues();返回所有选择值的数组。利用ListSelectionModel管理选择数据可以利用一个独立的ListSelectionModel对象管理JList组件的当前选择状态,该对象显示一个具有稳定索引的值列表。可以用下面的方法得到这个选择模型。publicListSelectionModelgetSelectionModel()利用ListModel设置和获取JList对象的值ListModel接口定义了方法组件(如JList),这些组件用于获取列表中每个单元格的值以及列表的长度publicvoidaddElement(Objectobj)//将指定组件添加到此类表的末尾publicvoidremoveElementAt(int

index)//删除指定索引处的组件16.2.9表格JTableJTable用来显示和编辑常规二维单元表,其构造过程和基本功能类似于JList。16.2.10添加菜单到窗口菜单栏并不被添加到内容窗格中,而是有自己的固定位置,因此,添加菜单到窗口有自己的方法。首先,创建一个JMenuBar菜单栏对象将创建的菜单JMenu对象按顺序追加到JMenuBar对象中,而菜单项JMenuItem则一个个按顺序追加到对应的JMenu对象中,最后将JMenuBar对象设置为当前窗口的菜单栏。JMenuBarmnubar=newJMenuBar();JMenumnuFirst=newJMenu("文件");

mnubar.add(mnuFirst);JMenuItemitmAdd=newJMenuItem("添加");

mnuFirst.add(itmAdd);mnuFirst.addSeparator();//增加菜单分隔符JMenuItemitmExit=newJMenuItem("退出(E)");mnuFirst.add(itmExit);itmExit.setMnemonic(KeyEvent.VK_E);itmExit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E,InputEvent.CTRL_DOWN_MASK));JMenumnuSecpmd=newJMenu("Help");mnubar.add(mnuSecpmd);//将mnuBar设置为当前窗口的菜单栏对象this.setJMenuBar(mnubar);16.3布局管理器

程序16-1和前述其他程序运行的界面效果差别很大,16-1界面中的按钮占满了窗口,而其他程序则没有,主要差别是其他程序在构造方法中均有这么一行语句:this.setContentPane(newJPanel());决定组件在容器中排列方式的对象称为布局管理器(LayoutManager)Swing程序采用布局管理器来管理组件的排放、位置、大小等布置任务,能实现平台无关的自动合理排列。Java提供了多种类型的布局管理器,如BorderLayout、FlowLayout、GridLayout、GridBagLayout、CardLayout等等,每种管理器都有着特殊的组件布局管理方式。16.3.1BorderLayout

边界布局管理器BorderLayout将管理的容器分为东西南北中五个位置,并通过BorderLayout类中相应的类常量进行标识:NORTH、SOUTH、EAST、WEST、CENTER,可以重复添加组件到相同的位置,但前面的组件将被移走。16.3.2FlowLayout

FlowLayout布局方式是将组件一排一排地依次放置,它自动调用组件的getPreferredSize()方法,使用组件的最佳尺寸来显示组件。当容器被重新设置大小后,则布局也会随之发生改变:各组件的大小不变,但相对位置会发生变化。它是JPanel的默认布局。构造方法FlowLayout()//居中对齐,默认的水平和垂直间隙是5个单位。FlowLayout(intalign)//它具有指定的对齐方式(FlowLayout类声明的三个类常量LEFT,RIGHT,CENTER),默认的水平和垂直间隙是5个单位。FlowLayout(intalign,inthgap,intvgap)//创建一个新的流布局管理器,它具有指定的对齐方式以及指定的水平和垂直间隙。16.3.3BoxLayout

BoxLayout允许垂直或水平布置多个组件的布局管理器。构造方法:publicBoxLayout(Containertarget,intaxis)//创建一个水平排列组件的Box容器Boxhbox=Box.createHorizontalBox();//创建一个垂直排列组件的Box容器Boxvbox=Box.createVerticalBox();//将组件加入Box的容器中的方法如下面的语句:hbox.add(newJButton("button1"));hbox.add(newJButton("button2"));调整Box内部组件间的间隔

用Box的类方法createRigidArea()在组件间添加空白hbox.add(newJButton("button1"));//追加一个按钮到Box容器中hbox.add(Box.createRigidArea(newDimension(20,0)));hbox.add(newJButton("button2"));Box还可以用类方法createHorizontalGlue()创建自动占据剩余空间的水平透明组件(同样还有垂直组件),如果有多个Glue组件,则它们平分一个方向上的剩余空间定义自己的尺寸。Box提供的第三类透明组件是Strut,它定义了在一个方向上具有固定尺寸的Strut16.3.4GridLayout

GridLayout布局方式可以使容器中的各组件呈网格状分布。容器中各组件的高度和宽度相同,当容器的尺寸发生变化时,各组件的相对位置不变,但各自的尺寸会发生变化。GridLayout的构造方法如下:GridLayout()//创建具有默认值的网格布局,即每个组件占据一行一列。

GridLayout(introws,intcols)//创建具有指定行数和列数的网格布局。

GridLayout(introws,intcols,inthgap,intvgap)//创建具有指定行数和列数的网格布局,此外,将水平和垂直间距设置为指定值。16.4用中间容器组织界面元素

JFrame是用来创建主窗口的顶级容器,很多程序中,组件并不直接添加到JFrame容器中,而是通过用中间容器组织好界面的布局,最后再根据要求将不同的中间容器对象加入到主窗口中,从而可以实现复杂的界面变换。常用的中间容器有:JPanel:最灵活、最常用的中间容器,其默认的布局管理器是FlowLayout。Box:综合利用其水平和垂直Box,可以方便的布局一个规整的组件显示。JScrollPane:与JPanel类似,但还可在大的组件或可扩展组件周围提供滚动条。常用构造方法:JScrollPane(Componentc);16.4用中间容器组织界面元素

常用的中间容器有:JPanel:最灵活、最常用的中间容器,其默认的布局管理器是FlowLayout。Box:综合利用其水平和垂直Box,可以方便的布局一个规整的组件显示。JScrollPane:与JPanel类似,但还可在大的组件或可扩展组件周围提供滚动条。常用构造方法:JScrollPane(Componentc);JTabbedPane:包含多个组件,但一次只显示一个组件。用户可在组件之间方便地切换。JToolBar:按行或列排列一组组件(通常是按钮)。JSplitPane:用于拆分窗口;16.5事件机制

开发Swing程序一般遵循这样的步骤:根据需要创建不同的界面类添加合适的组件到对应的界面类中为界面和界面中的组件添加必要的事件监听器,对诸如菜单选择、点击按钮以及文本输入之类的事件进行响应。16.5.1事件处理过程

16.6.2主要事件类型

表16-2部分事件及监听器事件类型事件源组件类型监听器接口必须实现的方法ActionEventJButton,JCheckBox,JMenuIte,JMenu,JCheckBoxMenuItem,JTextField等ActionListenervoidactionPerformed(ActionEvente)ItemEventJButton,JCheckBox,JMenuItem,JMenu,JCheckBoxMenuItem,JTextField等ItemListenervoiditemStateChanged(ItemEvente)MouseEventJFrame,JPanel,JButton等容器类MouseListenerMouseMotionListenerMouseWheelListenervoidmouseClicked(MouseEvente)mousePressedmouseReleasedmouseDraggedmouseMovedmouseWheelMoved定义监听器importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;publicclassButtonListenerimplementsActionListener{ publicvoidactionPerformed(ActionEvente){ //添加事件发生时的代码

}}将监听器和事件源绑定JButtonbtnLogin=newJButton(“登录”);ButtonListenerloginListener=newButtonListener();btnLogin.addActionListener(loginListener);//将监听器注册到按钮对象上16.6对话框

和利用中间容器组织界面不同,Java提供了一类特殊的窗口编程,就是对话框编程。对话框可以显示在另一个窗口即父窗口的范围内,使用对话框可以在不切换原有视图内容的情况下和用户交互,例如简单的输入、操作确认等。16.7.1选项对话框

JOptionPane弹出要求用户提供输入值或向其发出通知的标准对话框。publicvoidactionPerformed(ActionEvente){ JOptionPane.showConfirmDialog(null, "您确认删除这条信息吗?","操作提示",JOptionPane.YES_NO_OPTION);}JOptionPane确认对话框showConfirmDialog信息告知对话框showMessageDialog选项对话框showOptionDialog只能在指定窗口内移动的对话框showInternalXxxxDialog16.6.2文件对话框JFileChooser为用户选择文件提供了一种简单的机制,通过它可以获得用户选择的文件信息,如位置和文件名等,进而可以利用前面介绍的I/O编程的知识实现文件的处理。publicvoidactionPerformed(ActionEvente){JFileChooserchooser=newJFileChooser();//创建了一个文件名过滤器,文件类型参数是一个变长的参数类型FileNameExtensionFilterfilter=newFileNameExtensionFilter( "JPG&GIFImages","jpg","gif");chooser.setFileFilter(filter);//return保存了用户选择按钮的情况intreturnVal=chooser.showOpenDialog(this);//利用getSelectedFile方法返回一个File对象表示用户选中的文件if(returnVal==JFileChooser.APPROVE_OPTION){ System.out.println("被选择的文件是:“ +chooser.getSelectedFile().getName());}}16.7.3自定义对话框

可以通过继承JDialog创建一个自定义的对话框,满足程序特定的需要。创建一个对话框重点需要确定以下几个问题:满足应用需要的组件搭配和屏幕布局,这个过程和前面讲述的窗口和容器的处理一致。如何向使用者返回必要的信息,包括用户所需的结果和关闭对话框的方式等等。16.8图形编程基础

组件的显示每个组件知道应该如何显示自己,这是因为每个组件都有一个paint的方法,当组件需要显示时,运行时环境

温馨提示

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

评论

0/150

提交评论