chapter-10-Java-Swing-图形用户界面1_第1页
chapter-10-Java-Swing-图形用户界面1_第2页
chapter-10-Java-Swing-图形用户界面1_第3页
chapter-10-Java-Swing-图形用户界面1_第4页
chapter-10-Java-Swing-图形用户界面1_第5页
已阅读5页,还剩92页未读 继续免费阅读

下载本文档

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

文档简介

Java语言程序设计主要内容窗口文本框、按纽、标签和文本区布局选择性组件容器表格和树窗口事件、鼠标事件和键盘事件使用MVC结构与中介者模式概述图形用户界面〔GraphicsUserInterface,缩写GUI〕是指以图形的显示方式与用户实现交互操作的应用程序界面。Java提供了十分完善的图形用户界面功能,使得软件开发人员可以轻而易举地开发出功能强大、界面友善、平安可靠的应用软件。

开展历史:命令行——》图形用户界面

概述在Java语言中,有两个包〔java.awt和javax.swing〕囊括了实现图形用户界面的所有根本元素,这些根本元素主要包括容器、组件、绘图工具和布局管理器等。java.awt是java1.1用来建立GUI的图形包,“awt”是抽象窗口工具包〔AbstractWindowToolkit〕的缩写,其中的组件常被称为AWT组件。javax.swing是Java2提出的AWT的改进包,它主要改善了组件的显示外观,增强了组件的控制能力。概述早期版本的AWT组件在java.awt包里,包括Button、Checkbox、Scrollbar等,都是Component类的子类大局部含有nativecode,所以随操作系统平台的不同会显示出不同的样子,而不能进行更改,是重量级组件(heavyweightcomponents)没有弹性、缺乏效率概述较新的Swing组件其名称都是在原来AWT组件名称前加上J,例如JButton、JCheckBox、JScrollbar等,都是JComponent类的子类Java1.2推出,架构在AWT之上,是AWT的扩展而不是取代,AWT仍然是Swing的一个必备补充完全是由java语言编写的,其外观和功能不依赖于任何由宿主平台的窗口系统所提供的代码,是轻量级组件〔lightweightcomponents〕可提供更丰富的视觉感受,被越来越多地使用概述在javax.swing包中,定义了两种类型的组件:容器和组件。容器各种组件必须放在容器容器本身也是一种组件分类顶层容器,如JFrame,JApplet,JDialog和JWindow其它容器,如JPanel,JScrollPane,JSplitPane,JToolBar组件根本控制组件,如JButton,JComboBox,JList,JMenu,JSlider,JTextField不可编辑的信息显示组件,如JLabel,JProgressBar,JToolTip可编辑的信息显示组件,如JColorChooser,JFileChooser,JTable,JTextArea8Swing的类层次结构Swing的类层次结构java.awt.Component

|——java.awt.Container

——java.awt.Window

——java.awt.Frame—javax.swing.JFrame

——javax.Dialog—javax.swing.JDialog

——javax.swing.JWindow

——java.awt.Applet-javax.swing.JApplet

——javax.swing.Box

——javax.swing.JComponet10.2窗口Java提供的JFrame类的实例是一个底层容器,即通常所称的窗口。其他组件必须被添加到底层容器中,以便借助这个地层容器和操作系统进行信息交互。JFrame类是Container类的间接子类。当需要一个窗口时,可使用JFrame或其子类创立一个对象。10.2窗口JFrame是一种具有边框的容器,它是JavaApplication程序的图形用户界面的最外层容器。特点:〔1〕有边框〔2〕能被移动、缩放和关闭〔3〕作为最外层容器,不能被其它容器所包含〔4〕默认布局:边界布局(BorderLayout)10.2窗口构造函数格式:JFrame()功能:建立一个无标题的Frame。格式:JFrame(Stringtitle)功能:建立一个标题为title的Frame。常用方法StringgetTitle();获取窗口标题voidsetTitle(Strings);设置窗口标题voidsetVisible(booleanb);设置窗口可见性voidsetBounds(inta,intb,intwidth,intheight);设置窗口位置和大小voidsetBackground(Colorc);设置窗口背景颜色voidpack();用紧凑方式显示窗口voidsetSize(intwidth,intheight);设置窗口大小10.2窗口创立窗体有两种方式:〔1〕直接创立JFrame的对象,适合于简单窗体;〔2〕继承JFrame类,在继承类中编写代码对窗体进行详细的刻画,适合窗体比较复杂的情况。大多数情况下开发人员都用第二种方法。注意:窗体创立以后是不可见的,必须调用Window类的show()方法或Component类的setVisible()方法显示该窗体。见以下两个例子:importjavax.swing.*;publicclassSample10_1{ publicstaticvoidmain(String[]args){ //创立一个窗体对象JFramemyWindow=newJFrame(); //向窗体中添加一个标签 myWindow.add(newJLabel("这是一个窗体,演示了JFrame类的根本功能")); //设置窗体的标题 myWindow.setTitle("自定义的窗体"); //设置窗体的大小 myWindow.setBounds(80,80,480,180); //根据接收的boolean设置窗体是否可以调整大小 myWindow.setResizable(false); //设置窗体的可见性 myWindow.setVisible(true);

}}直接创立JFrame的对象importjavax.swing.*;classMyWindowextendsJFrame{ //定义无参构造函数 publicMyWindow(){} publicMyWindow(booleanb){ //向窗体中添加一个标签 this.add(newJLabel("这是一个窗体,演示了JFrame类的根本功能")); //设置窗体的标题 this.setTitle("自定义的窗体"); //设置窗体的大小 this.setBounds(80,80,480,180); //根据接收的boolean设置窗体是否可以调整大小 this.setResizable(b); //设置窗体的可见性 this.setVisible(true); }}publicclassSample10_2{ publicstaticvoidmain(String[]args){ //创立MyWindow类的对象,并传递False值使得窗体不能调整大小 newMyWindow(false); }}继承JFrame类对话框〔JDialog〕对话框〔JDialog〕与JFrame一样,都是有边框和标题的独立使用的容器,不能被其它容器所包容。与JFrame的不同之处:不能作为程序的最外层容器,它必须属于某个JFrame,由该JFrame弹出。对话框可以接受用户的输入,实现与用户的交互作用。对话框〔JDialog〕JDialog的继承结构└javax.swing.JDialog要实现对话框,需要从JDialog派生一个类对话框〔JDialog〕构造函数JDialog(Frameowner)功能:建立无标题的通用对话框,它属于窗口owner,可以响应其它窗口。JDialog(Frameowner,booleand)功能:建立无标题的通用对话框,它属于窗口owner,假设d为true那么不能响应其它窗口。JDialog(Frameowner,Stringtxt)功能:建立标题为txt的通用对话框,它属于窗口owner,可以响应其它窗口。JDialog(Frameowner,Stringtxt,booleand)功能:建立标题为txt的通用对话框,它属于窗口owner,假设d为true那么不能响应其它窗口。对话框〔JDialog〕常用方法表列出了通用对话框JDialog类的几个常用的方法。面板(JPanel)无边框容器特点:〔1〕最简单的一种容器〔2〕没有边框〔3〕不能被移动、缩放和关闭〔4〕通常作为一个容器组件被加到其它容器中,如JApplet,JFrame等〔5〕默认布局:顺序布局(FlowLayout)JApplet是JPanel的子类,是一种特殊的JPanelJPanel常用方法:标签1.创立标签标签〔JLabel〕的功能是显示单行的字符串,可在屏幕上显示一些提示性、说明性的文字。例如,在列表框的旁边加上一个标签,说明列表框的功能。2.标签的构造方法〔1〕JLabel()该方法用来创立一个没有显示内容的对象。〔2〕JLabel(Stringlabel)该方法用来创立一个显示内容为label的对象。〔3〕JLabel(Stringlabel,intalignment)该方法除了用来创立一个显示内容为label的对象外,还设置了Label的对齐方式。Label的对齐方式有三种,分别用JLabel类的三个常量LEFT、CENTER和RIGHT来表示左对齐、居中对齐和右对齐。〔4〕JLabel(Iconico)建立一个JLabel对象,其初始图标为ico,没有标题。〔5〕JLabel(Stringtxt,Iconico,inthalign)功能:建立一个JLabel对象,其初始标题为txt,初始图标为ico,水平对齐方式为halign。标签3.标签的常用方法〔1〕publicintgetAlignment()返回当前的对齐方式。〔2〕publicStringgetText()返回当前显示的字符串。〔3〕publicvoidsetAlignment(intalignment)设置对齐方式。〔4〕publicvoidsetText(Stringlabel)设置显示的字符串。标签按钮1.按钮的构造方法〔1〕JButton()创立一个没有标题的按钮。〔2〕JButton(Stringlabel)创立一个有显示标题的按钮。〔3〕JButton(Iconico)建立一个JButton对象,图标为ico,没有标题。〔4〕JButton(Stringtxt,Iconico)建立一个JButton对象,标题为txt,图标为ico。2.按钮的常用方法〔1〕publicStringgetLabel()返回按钮的显示标题。〔2〕publicvoidsetLabel(Stringlabel)设置按钮上的显示标题。按钮以上方法是各种按钮共有的方法,因为它是AbstractButton抽象类里定义的方法。按钮类AbstractButton抽象类是众多按钮类的基类,继承它的类包括JButtonJToggleButton——表示有两个选择状态的按钮CheckBox〔多项选择按钮〕JRadioButton〔单项选择按钮〕JMenuItem——在菜单中使用JCheckBoxMenuItem〔多项选择按钮〕JRadioButtonMenuItem〔单项选择按钮〕JMenu〔一般的菜单项〕importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;publicclassButtonDemoextendsJFrameimplementsActionListener{protectedJButtonbutton1,button2;protectedJLabellabel1;protectedintclickedNum=0;

publicButtonDemo(Stringtitle){ setTitle(title); label1=newJLabel("共点击了"+clickedNum+"次");

button1=newJButton("点我");button2=newJButton("清零");button1.addActionListener(this);button2.addActionListener(this);setLayout(newFlowLayout());setSize(400,200);

add(button1);add(button2);add(label1);}publicvoidactionPerformed(ActionEvente){if(e.getSource()==button1){ clickedNum++; }if(e.getSource()==button2){ clickedNum=0; }label1.setText("共点击了"+clickedNum+"次");}

publicstaticvoidmain(String[]args){ButtonDemoframe=newButtonDemo("ButtonDemo1");frame.addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEvente){System.exit(0);}});frame.setVisible(true);}}单项选择按钮JRadioButton1.构造函数JRadioButton() 功能:建立一个无标题、无图片的单项选择按钮。JRadioButton(Stringtxt) 功能:建立一个标题为txt但没有图片的单项选择按钮。JRadioButton(Iconico)功能:建立一个图片为ico但没有标题的单项选择按钮。JRadioButton(Stringtxt,Iconico)功能:建立一个标题为txt、图片为ico的单项选择按钮。JRadioButton(Stringtxt,booleanstat)功能:建立一个标题为txt但没有图片的单项选择按钮,其初始选择状态由stat指定。JRadioButton(Iconico,booleanstat)功能:建立一个图片为ico但没有标题的单项选择按钮,其初始选择状态由stat指定。JRadioButton(Stringtxt,Iconico,booleanstat)功能:建立一个标题为txt、图片为ico的单项选择按钮,其初始选择状态由stat指定。复选按钮JCheckBox复选按钮〔JCheckbox〕可以让用户作出多项选择。1.构造函数JCheckBox()功能:建立一个无标题、无图片的复选按钮。JCheckBox(Stringtxt) 功能:建立一个标题为txt但没有图片的复选按钮。JCheckBox(Iconico)功能:建立一个图片为ico但没有标题的复选按钮。JCheckBox(Stringtxt,Iconico)功能:建立一个标题为txt、图片为ico的复选按钮。JCheckBox(Stringtxt,booleanstat)功能:建立一个标题为txt但没有图片的复选按钮,其初始选择状态由stat指定。JCheckBox(Iconico,booleanstat)功能:建立一个图片为ico但没有标题的复选按钮,其初始选择状态由stat指定。JCheckBox(Stringtxt,Iconico,booleanstat)功能:建立一个标题为txt、图片为ico的复选按钮,其初始选择状态由stat指定。列表框列表框〔JList〕可以使用户选择多个选项。1.构造函数格式:JList()功能:建立一个单项选择的JList对象。格式:JList(Object[]data)功能:建立一个单项选择且初始数据为data的JList对象。例如:String[]stu={"王小平","刘国军","吴芬","李建军"};Listjl=newJList(stu);这就创立了一个列表框,其初始数据有4项,分别为:"王小平"、"刘国军"、"吴芬"、"李建军"。2.常用方法略组合框组合框〔JComboBox〕可以使用户选择多个选项。1.构造函数格式:JComboBox()功能:创立具有默认数据模型的组合框;格式:JComboBox(Object[]data)功能:建立一个初始数据为data的组合框对象。例如:String[]stu={"王小平","刘国军","吴芬","李建军"};JComboBoxjl=newJComboBox(stu);这就创立了一个列表框,其初始数据有4项,分别为:"王小平"、"刘国军"、"吴芬"、"李建军"。2.常用方法略文本框1.单行文本编辑框JTextField用来接受用户键盘输入的单行文本信息。2.文本框的构造方法〔1〕JTextField()创立一个缺省长度的文本框。〔2〕JTextField(intcolumns)创立一个指定长度的文本框。〔3〕JTextField(Stringtext)创立一个带有初始文本内容的文本框。〔4〕JTextField(Stringtext,intcolumns)创立一个带有初始文本内容并具有指定长度的文本框。3.文本框的常用方法文本框文本区1.文本区〔JTextArea〕可以显示大段的文本。

2.文本区的构造方法〔1〕JTextArea()创立一个缺省大小的文本区。〔2〕JTextArea(introws,intcolumns)创立一个指定行和列数的文本区。〔3〕JTextArea(Stringtext)创立一个带有初始文本内容的文本区。〔4〕JTextArea(Stringtext,introws,intcolumns)创立一个带有初始文本内容并具有指定行和列数的文本区。〔5〕JTextArea(Stringtext,introws,intcolumns,intscrollbars)在〔4〕的根底上添加滚动条。3.文本区的常用方法文本区36菜单常规菜单:菜单栏(JMenuBar)、下拉式菜单(JMenu)和菜单项。菜单项:命令式菜单项(JMenuItem)、复选菜单项(JCheckBoxMenuItem)和单项选择菜单项(JRadioButtonMenuItem)弹出式菜单37菜单的用法JMenuBarjmb=newJMenuBar();//定义菜单栏

JMenufile=newJMenu("File");//定义菜单

JMenuItemitem1=newJMenuItem("Open");//定义菜单项

JMenuItemitem2=newJMenuItem("Save");JMenuItemitem3=newJMenuItem("Close");JRadioButtonMenuItemJRMenuItem1=newJRadioButtonMenuItem("one",(Icon)newImageIcon("face5.gif"));JRadioButtonMenuItemJRMenuItem2=newJRadioButtonMenuItem(“two”);//定义互斥菜单项,其中的“one”带图标

ButtonGroupbgroup=newButtonGroup();//定义选项组对象

JPopupMenupopup=newJPopupMenu("mypopup");//定义弹出式菜单

JMenuItemit1=newJMenuItem("popupone");//定义弹出式菜单的菜单项

JMenuItemit2=newJMenuItem("popuptwo");38菜单的用法setJMenuBar(jmb);jmb.add(file);//将菜单File参加菜单栏file.add(item1);//参加菜单File的各菜单项file.add(item2);file.add(item3);file.addSeparator();//菜单File中参加一分割线bgroup.add(JRMenuItem1);//将互斥菜单项参加选项组bgroup.add(JRMenuItem2);file.add(JRMenuItem1);//将互斥菜单项参加菜单Filefile.add(JRMenuItem2);39表格表格是Swing新增加的组件,主要功能是把数据以二维表格的形式显示出来。表格用javax.swing.table.JTable类来实现JTable类常用的方法有:JTable(TableModeldm)//dm对象中包含了表格要显示的数据JTable(object[][]rowData,object[]columnNams);JTable(Vector[][]rowData,Vector[]columnNams);getModel()//获得表格的数据来源对象40创立并显示一张表格Object[][]data={{"Jenny","female","football",newInteger(20),"ENGLISH"},{"May","female","music",newInteger(20),"ENGLISH"},{"Lili","female","art",newInteger(20),"CHINESE"}};Object[]columnNames={"name","sex","hobby","age",“nationality"};JTablejtable1=newJTable(data,columnNames);jtable1.setRowHeight(20);JScrollPanejscrp1=newJScrollPane();jscrp1.getViewport().add(jtable1);JComponent类JComponent类是所有组件的父类,下面介绍JComponent类的常用方法1、组件的颜色publicvoidsetBackground(Colorc)设置组件的背景色。publicvoidsetForeground(Colorc)设置组件的前景色。publicColorgetBackground()获取组件的背景色。publicColorgetForeground()获取组件的前景色。2.组件的字体publicvoidsetFont(Fontf)组件调用该方法设置组件上的字体。例如,文本组件调用该方法可以设置文本组件中的字体。

publicFontgetFont()组件调用该方法获取组件上的字体。3.组件的激活与可见性publicvoidsetEnabled(booleanb)组件调用该方法可以设置组件是否可被激活,当参数b取值true时,组件可以被激活,当参数b取值false时,组件不可激活。默认情况下,组件是可以被激活的。publicvoidsetVisible(boolean)设置组件在该容器中的可见性,当参数b取值true时,组件在容器中可见,当参数b取值false时,组件在容器中不可见。除了Window型组件外,其它类型组件默认是可见的。JComponent类4.组件的大小与位置publicvoidsetSize(intwidth,intheight)组件调用该方法设置组件的大小。publicvoidsetLocation(intx,inty)组件调用该方法设置组件在容器中的位置,包含该组件的容器都有默认的坐标系,容器的坐标系的左上角的坐标是(0,0),参数x,y指定该组件的左上角在容器的坐标系中的坐标,即组件距容器的左边界x个像素,距容器的上边界y个像素。publicDimensiongetSize()组件调用该方法返回一个Dimension对象的引用,该对像实体中含有名字是width和height的成员变量,方法返回的Dimension对象的width的值就是组件的宽度、height的值就是当前组件的高度。JComponent类publicPointgetLocation()组件调用该方法返回一个Point对象的引用,该对像实体中含有名字是x和y的成员变量,方法返回的Point对象的x,y的值就是组件的左上角在容器的坐标系中的x坐标和y坐标。publicvoidsetBounds(intx,inty,intwidth,intheight)组件调用该方法设置组件在容器中的位置和组件的大小。该方法相当于setSize方法和setLocation方法的组合。publicRectanglegetBounds()组件调用该方法返回一个Rectangle对象的引用,该对象实体中含有名字是x、y、width和height的成员变量,方法返回的Rectangle对象的x,y的值就是组件的左上角在容器的坐标系中的x坐标和y坐标,width和height的值就是当前组件的宽度和高度。5.组件上的光标publicvoidsetCursor(Cursorc)设置鼠标指向组件时的光标形状。可以使用Cursor类的类方法直接获得一个光标对象,例如:Cursorc=Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);6.paint方法与repaint方法调用repaint()方法时,repaint()方法会再去调用update(Graphicsg)方法。update(Graphicsg)方法也是Component类中的一个方法,这个方法的功能是:去除paint()方法以前所画的内容,然后再调用paint方法。因此我们可以在子类中重写update方法〔即隐藏父类的方法〕,根据需要来去除哪些局部或保存哪些局部。JComponent类46布局管理器流式布局FlowLayout边界布局BorderLayout盒式布局管理器BoxLayout网格布局GridLayout卡片布局CardLayout网格包布局GridBagLayout471、流式布局FlowLayout是一种最根本的布局管理器是、和的默认布局方式在容器中,从左到右依次放置GUI组件当组件排到容器一行的末尾时,那么从下一行开始接着排列组件每行组件的对齐方式可以是:左对齐、中间(默认对齐方式)和右对齐48FlowLayout的构造方法publicFlowLayout()publicFlowLayout(intalignment)publicFlowLayout(intalignment,inthorizontalGap,intverticalGap)alignment参数的值必须是FlowLayout.LEFT、Flowlayout.CENTER或FlowLayout.RIGHT。horizontalGap和verticalGap参数指定了组件间隔距离(以像素为单位)。FlowLayout的默认间隔值为5。49例6:FlowLayout的使用方法importjava.awt.*;importjavax.swing.*;publicclassFlowLayoutDemoextendsJFrame{publicFlowLayoutDemo(){Containerc=getContentPane();c.setLayout(newFlowLayout());c.add(newJLabel("Buttons:"));c.add(newJButton("Button1"));c.add(newJButton("2"));c.add(newJButton("Button3"));c.add(newJButton("Long-NamedButton4"));c.add(newJButton("Button5"));}publicstaticvoidmain(Stringargs[]){FlowLayoutDemowindow=newFlowLayoutDemo();window.setTitle("FlowLayoutDemo");window.pack();//窗口大小设置为适合组件最正确尺寸与布局所需的空间window.setVisible(true);}}502、边界布局BorderLayout是容器JFrame和JApplet的默认布局方式将容器分成五个区域,NORTH (顶部)SOUTH (底部)WEST (左侧)EAST (右侧)CENTER (中间)每个区域最多只能1个组件51BorderLayout的方法构造方法:BorderLayout()构造一个组件之间没有间距的新边界布局。BorderLayout(int

hgap,int

vgap)用指定的组件之间的水平间距构造一个边界布局。

将组件添加到BorderLayout布局的容器中的方法add(newButton("South"),BorderLayout.SOUTH);add(newButton("South"),"South");add("South",newButton("South"));52例7:BorderLayout的使用方法importjava.awt.*;importjavax.swing.*;publicclassBorderLayoutDemoextendsJFrame{publicBorderLayoutDemo(){ Containerc=getContentPane();c.setLayout(newBorderLayout(5,5));c.add(newJButton("North"),"North");c.add(newJButton("South"),"South");//c.add("South",newButton("South"));//c.add(newButton("South"),BorderLayout.SOUTH);c.add(newJButton("East"),"East");c.add(newJButton("West"),"West");c.add(newJButton("Center"),"Center");}publicstaticvoidmain(Stringargs[]){BorderLayoutDemowindow=newBorderLayoutDemo();window.setTitle("BorderLayoutDemo");window.pack();window.setVisible(true);}}533、盒式布局管理器BoxLayout允许多个组件在容器中沿水平方向或竖直方向排列容器的大小发生变化时,组件占用的空间不会发生变化54BoxLayout的方法构造方法:BoxLayout(Containertarget,intaxis)创立一个将沿给定轴放置组件的布局管理器。轴的方向:BoxLayout.X_AXIS:指定组件应该从左到右放置BoxLayout.Y_AXIS:指定组件应该从上到下放置55例8:BoxLayout使用的例子importjava.awt.Container;importjavax.swing.BoxLayout;importjavax.swing.JButton;importjavax.swing.JFrame;publicclassBoxLayoutDemo{publicstaticvoidmain(Stringargs[]){JFrameapp=newJFrame("盒式布局管理器例程");app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);app.setSize(220,130);Containerc=app.getContentPane();c.setLayout(newBoxLayout(c,BoxLayout.X_AXIS));Strings;JButtonb;for(inti=0;i<3;i++){s="按钮"+(i+1);b=newJButton(s);c.add(b);}app.setVisible(true);}}564、网格布局GridLayout布局管理器GridLayout按行与列将容器等分成网格每个组件占用具有相同宽度和高度的网格添加组件占用网格的顺序:从上到下,从左到右当一行满了,那么继续到下一行,仍然是从左到右57GridLayout类的构造方法GridLayout()

创立默认值的网格布局,即每个组件占据一行一列。GridLayout(int

rows,int

cols)

创立具有指定行数和列数的网格布局GridLayout(int

rows,int

cols,int

hgap,int

vgap)

创立具有指定行数和列数的网格布局。58例9:GridLayout的使用方法importjava.awt.*;importjavax.swing.*;publicclassGridLayoutDemo{JFramef;publicGridLayoutDemo(Stringstr){f=newJFrame(str);Containerc=f.getContentPane();

c.setLayout(newGridLayout(3,2));for(inti=1;i<=6;i++){ c.add(newJButton(i+""));}f.pack();f.setVisible(true);}publicstaticvoidmain(Stringargs[]){newGridLayoutDemo("GridLayoutDemo");}}595、卡片布局管理器CardLayoutCardLayout的布局方式有点象码“扑克牌”一个组件压在另一个组件的上面,所以每次一般只能看到一个组件CardLayout的构造方法:CardLayout();参加组件的方法:add(<组件代号>,<组件名称>);<组件代号>为一个字符串常用方法:show(<容器名称>,<组件名称>);//显示组件first(<容器名称>);//显示容器中的第一个组件last(<容器名称>);//显示容器中的最后一个组件next(<容器名称>);//显示容器中的下一个组件5、卡片布局管理器CardLayout616、空布局不使用任何布局管理器,一般不使用该方式空布局的使用创立容器对象

JPanelpanel=newJPanel();设置容器对象的布局为null

panel.setLayout(null);设置组件在容器中的位置

组件对象.setBounds(x,y,width,height);向容器中添加组件对象(设组件对象已创立)

panel.add(组件对象);62使用布局管理器的根本规那么(1)假设组件尽量充满容器空间,可以考虑使用BorderLayout和GridBagLayout。(2)假设用户需要在紧凑的一行中以组件的自然尺寸显示较少的组件,用户可以考虑用面板容纳组件,并使用面板的默认布局管理器FlowLayout。(3)假设用户需要在多行或多列中显示一些同样尺寸的组件,GridLayout最适合此情况。(4)假设界面较为复杂,可先使用面板来容纳组件,然后选用适当的布局管理器。63布局管理器嵌套实际上是容器的嵌套,被嵌套的容器可以具有不同的布局管理器在嵌套的布局管理器中JPanel通常起到了“桥”的作用64例:复杂GUI的布局65例:实现GUI的步骤分析panel1panel2panel3panel5panel4panel6panel8panel766GUI的设计步骤先设计一个窗口,如JFrame确定布局管理器在窗口中添加所需组件增加事件处理67事件处理模型GUI是由事件(event)驱动的当用户与GUI交互可以产生事件(events)一些常见的交互方式移动鼠标用鼠标点击按钮在文本框中输入数据关闭窗口等68事件处理!用户交互事件如:单击鼠标如:按下/释放鼠标按钮对象状态改变调用事件处理确定发生的事件的类型确定生成的事件的组件编写适宜的代码处理事件事件作用于对象。对象识别事件并做出响应,不同的对象能识别的事件不全相同。可以针对相应的事件编写相应的代码,在事件发生时,程序执行事件里的代码。69事件处理模型

源对象监听器事件

传播事件的实例方法传递途径代理事件模型Swing中的GUI组件适配器对象事件源:产生事件的组件叫事件源。事件对象:描述系统中发生了什么的对象事件监听器:对事件进行处理的类。事件对象事件监听器事件源事件处理机制71事件处理机制事件源可供用户进行交互的GUI组件事件对象封装了包含所发生的各种事件的有效信息信息包括:事件源的引用、以及事件监听器在处理事件时所需要的其它各种信息事件信息被包含在类AWTEvent或其子类的实例对象中事件监听器接受事件对象,并处理事件对象72事件处理机制包含事件处理的程序应该包括以下四局部内容:1、引入系统事件类包,如importjava.awt.event.*。2、在事件处理类的声明中指定要实现的监听器名,如:publicclassMyClassimplementsActionListener{…}3、注册事件源对象的事件监听者,如btn.addActionListener(this)。4、实现监听器中的接口如实现按钮事件监听接口ActionListener:publicvoidactionPerformed(ActionEvente){ ...//响应某个动作的代码...}73事件分类与监听器接口1、事件分类

ActionEventAdjustmentEventComponentEventItemEventTextEvent…ContainerEventFocusEventWindowEventPaintEventInputEventMouseEventKeyEvent742、监听器接口对于每种类型的事件,都定义了相应的事件处理接口;XXXEvent对应的事件处理接口通常为XXXListener。

ActionListenerItemListenerWindowListenerKeyListenerMouseListenerMouseMotionListener…75事件接口及处理方法

76事件接口及处理方法〔续〕77例:按钮事件的例如(方法1)importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;publicclassTestJButtonimplementsActionListener{publicTestJButton(){JFramef=newJFrame("TestButtonEvent!");Containerc=f.getContentPane();JButtonb=newJButton("PressMe!");

b.addActionListener(this);c.add(b,"Center");f.setSize(200,100);f.setVisible(true);}publicvoidactionPerformed(ActionEvente){System.out.println("Actionoccurred");System.out.println("Button’slabelis:"+e.getActionCommand());}publicstaticvoidmain(Stringargs[]){newTestJButton();}}方法1:采用同一个类中实现事件接口的方法78例:按钮事件的例如(方法2)importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;publicclassTestJButtonDemo{publicTestJButtonDemo(){JFramef=newJFrame("TestButtonEvent!");Containerc=f.getContentPane();JButtonb=newJButton("PressMe!");

b.addActionListener(newButtonHandler());c.add(b,"Center");f.setSize(200,100);f.setVisible(true);}publicstaticvoidmain(Stringargs[]){newTestJButtonDemo();}}79例:按钮事件的例如(方法2)importjava.awt.event.*;publicclassButtonHandlerimplementsActionListener{publicvoidactionPerformed(ActionEvente){System.out.println("Actionoccurred");System.out.println("Button’slabelis:"+e.getActionCommand());}}方法2:采用另一个类中实现事件接口的方法80例:按钮事件的例如(方法3)importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;publicclassTestInnerButtonDemo{publicTestInnerButtonDemo(){JFramef=newJFrame("TestButtonEvent!");Containerc=f.getContentPane();JButtonb=newJButton("PressMe!");

b.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){System.out.println("Actionoccurred");System.out.println("Button’slabelis:"+e.getActionCommand());}});c.add(b,"Center");f.setSize(200,100);f.setVisible(true);}publicstaticvoidmain(Stringargs[]){newTestInnerButtonDemo();}}方法3:采用匿名内部类实现事件接口的方法81如何监听多个组件事件?例:编写一个允许学生在文本字段中输入一个数的程序。创立一个每当用户单击一次就将此数加一的按钮。创立另一个每当用户单击一次就将此数减一的按钮。界面效果如以下图所示。82importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;classIncrementorimplementsActionListener{JTextFieldnumberTxf;JButtonincrementBtn,decrementBtn;publicvoidmakeGUI(){JFramefrm=newJFrame("Incrementor");Containerc=frm.getContentPane();c.setLayout(newFlowLayout());numberTxf=newJTextField("0",5);c.add(numberTxf);incrementBtn=newJButton("Increment");c.add(incrementBtn);

incrementBtn.addActionListener(this);decrementBtn=newJButton("Decrement");c.add(decrementBtn);

decrementBtn.addActionListener(this);frm.setSize(300,100);frm.setVisible(true);}83publicvoidactionPerformed(ActionEvente){intoldNum=Integer.parseInt(numberTxf.getText());intnewNum=oldNum;if(e.getActionCommand().equals("Increment")){newNum++;}elseif(e.getActionCommand().equals("Decrement")){newNum--;}numberTxf.setText(String.valueOf(newNum));}publicstaticvoidmain(Stringargs[]){Incrementori=newIncrementor();i.makeGUI();}}if(e.getSource()==incrementBtn){elseif(e.getSource()==decrementBtn){84事件适配器类

Java中为那些具有多个方法的监听者接口提供了事件适配器类,这个类通常命名为XxxAdapter,在该类中以空方法体实现了相应接口的所有方法;可通过继承适配器类来编写监听者类,在类中只需给出关心的方法,从而减轻工作量。85事件接口与适配器类86事件接口与方法目录事件适配器类(Adapter)只实现接口所需要处理的方法通过覆盖对于接口中的其它方法:系统会提供默认的方法(方法体为空)事件适配器类与事件监听器接口的区别?利用事件适配器类,只需实现所需处理的方法利用事件监听器接口,必须实现所有的方法事件适配器类88案例基于Swing编写一个用户登录的界面程序,用户类型分为学生用户和教师用户,如以下图所示。如果用户输入为空,那么给出“用户名不可为空”的提示信息,假设是教师用户,输入的用户名和密码都是teacher,那么显示“教师用户登录成功”的提示信息;假设是学生用户,输入的用户名和密码都是student,那么显示“学生用户登录成功”的提示信息;否那么显示“用户名不存在或者密码不正确”。importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;publicclassSwingUserLoginextendsJFrameimplementsActionListener,ItemListener{ JPanelpanel1,panel2; JLabelUserType,UserLabel,PasswordLabel; JTextFieldUserTextField; JPasswordFieldPasswordTextField; JButtonYesBtn,CancelBtn,ExitBtn; JComboBoxUserSelect; Stringuser[]={"学生用户","教师用户","管理员"}; Containerc; inti=0;

publicSwingUserLogin(){ super("用户登录"); UserType=newJLabel("用户类型",JLabel.CENTER); UserSelect=newJComboBox(user); UserSelect.addItemListener(this);UserLabel=newJLabel("用户名:",JLabel.CENTER); PasswordLabel=newJLabel("密码:",JLabel.CENTER); UserTextField=newJTextField(10); PasswordTextField=newJPasswordField(10); YesBtn=newJButton("确定"); CancelBtn=newJButton("取消"); ExitBtn=newJButton("退出"); YesBtn.addActionListener(this); CancelBtn.addActionListener(this); ExitBtn.addActionListener(this); panel1=newJPanel();

温馨提示

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

评论

0/150

提交评论