《Java应用开发》课件-第11章 GUI_第1页
《Java应用开发》课件-第11章 GUI_第2页
《Java应用开发》课件-第11章 GUI_第3页
《Java应用开发》课件-第11章 GUI_第4页
《Java应用开发》课件-第11章 GUI_第5页
已阅读5页,还剩167页未读 继续免费阅读

下载本文档

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

文档简介

第11章GUI·Swing概述·Swing顶级容器·布局管理器·Swing概述·Swing顶级容器·布局管理器11.1Swing概述Swing是Java语言开发图形化界面的一个工具包。它以抽象窗口工具包(AWT)为基础,使跨平台应用程序可以使用可插拔的外观风格。Swing拥有丰富的库和组件,使用非常灵活,开发人员只用很少的代码就可以创建出优雅的用户界面。11.1Swing概述在Java中,所有的Swing组件都保存在javax.swing包中,为了有效的使用Swing组件,必须了解Swing包的层次结构和继承关系。下面通过一张图描述Swing组件的继承关系。11.1Swing概述从上图可以看出,Swing组件的所有类都继承自Container类,然后根据GUI开发的功能扩展了两个主要分支,分别是容器分支(包括Window窗口和Panel面板)和组件分支。其中,容器分支是为了实现图形化用户界面窗口的容器而设计的,而组件分支则是为了实现向容器中填充数据、元素以及交互组件等功能。11.1Swing概述Jcomponent类几乎是所有Swing组件的公共超类,Jcomponent类的所有子类都继承了它的全部公有方法,Jcomponent的常用子类如下图。11.1Swing概述在容器分支中,Swing组件类中有三个组件是继承的AWT的Window类,而不是继承自JComponent类,这三个组件是Swing中的顶级容器类,它们分别是JWindow、JFrame、和JDialog。11.2.1JFrame在Swing组件中,最常见的一个容器就是JFrame,它是一个独立存在的顶级容器(也叫窗口),不能放置在其他容器之中。JFrame支持通用窗口所有的基本功能,例如,窗口最小化、设定窗口大小等。11.2.1JFrameJFrame类的常用操作方法如下表。方法类型功能描述publicJFrame()throwsHeadlessException构造方法创建一个普通窗体对象publicJFrame(Stringtitle)throwsHeadlessException构造方法创建一个窗体对象,并指定标题publicvoidsetSize(intwidth,intheight)普通方法设置窗体大小publicvoidsetSize(Dimentiond)普通方法通过Dimention设置窗体大小publicvoidBackground(Colorc)普通方法设置窗体的背景颜色11.2.1JFrame方法类型功能描述publicvoidsetLocation(intx,inty)普通方法设置组件的显示位置publicvoidsetLocation(Pointp)普通方法通过Point设置组件的显示位置publicvoidsetVisiable(booleanb)普通方法显示或隐藏组件publicComponentadd(Componentcomp)普通方法向容器中增加组件PublicsetLayout(Componentcomp)普通方法设置布局管理器,如果设置为null表示不使用publicvoidpack()普通方法调整窗口大小,以适合其子组件的首选大小和布局publicComntainergetContentPane()普通方法返回此窗体的容器对象11.2.1JFrame接下来通过一个案例演示一下JFrame的使用效果。1importjava.awt.FlowLayout;2importjavax.swing.*;3classExample01extendsJFrame{4privatestaticvoidcreateAndShowGUI(){5//创建并设置JFrame容器窗口6JFrameframe=newJFrame("JFrameTest");7//设置关闭窗口时的默认操作8frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);9//设置窗口标题10frame.setTitle("JFrameTest");

11.2.1JFrame11//设置窗口尺寸12frame.setSize(350,300);13//设置窗口的显示位置14frame.setLocation(300,200);15//让组件显示16frame.setVisible(true);17}18publicstaticvoidmain(String[]args){19//使用SwingUtilities工具调用createAndShowGUI()方法显示GUI程序20SwingUtilities.invokeLater(Example01::createAndShowGUI);21}22}11.2.1JFrame程序运行结果如下图。11.2.1JFrame上述代码中,第6行代码通过JFrame类创建了一个窗体对象frame,并在创建窗体对象的同时定义了窗体对象的标题为“JFrameTest”;第8行代码通过调用JFrame类的setDefaultCloseOperation()方法设置了窗体对象关闭时的默认操作;第10行代码通过调用JFrame类的setTitle()方法设置了窗口标题;第12行代码通过调用JFrame类的setSize()方法设置了窗口尺寸;11.2.1JFrame第14行代码通过调用JFrame类的setLocation()方法设置了窗口的显示位置;第16行代码通过调用JFrame类的setVisible()方法设置让组件显示;最后在main()方法中,调用javax.swing包中的SwingUtilities(封装有一系列操作Swing的方法集合工具类)工具类的invokeLater()方法执行了GUI程序。需要注意的是,invokeLater()方法需要传入一个接口作为参数。11.2.2JDialogJDialog是Swing的另外一个顶级容器,它和Dialog一样都表示对话框窗口。JDialog对话框可分为两种,分别是模态对话框和非模态对话框。所谓模态对话框是指用户需要处理完当前对话框后才能继续与其他窗口交互的对话框,而非模态对话框是允许用户在处理对话框的同时与其他窗口交互的对话框。11.2.2JDialog对话框是模态或者非模态,可以在创建JDialog对象时为构造方法传入参数进行设置,也可以在创建JDialog对象后调用它的setModal()方法进行设置。JDialog常见的构造方法如下表。方法声明功能描述JDialog(Frameowner)用于创建一个非模态的对话框。参数owner为对话框所有者(顶级窗口JFrame)。JDialog(Frameowner,Stringtitle)创建一个具有指定标题的非模态对话框。JDialog(Frameowner,booleanmodal)创建一个有指定模式的无标题对话框。11.2.2JDialog上表列举了JDialog三个常用的构造方法,这三个构造方法都需要接收一个Frame类型的对象,表示对话框所有者。如果该对话框没有所有者,参数owner可以传入null。第3个构造方法中,参数modal用来指定JDialog窗口是模态还是非模态,如果modal值设置为true,对话框就是模态对话框,反之则是非模态对话框,如果不设置modal的值,默认为false,也就是非模态对话框。11.2.2JDialog接下来通过一个案例学习JDialog对话框的创建。1importjava.awt.*;2importjava.awt.event.*;3importjavax.swing.*;4publicclassExample02{5 publicstaticvoidmain(String[]args){6//建立两个按钮7 JButtonbtn1=newJButton("模态对话框");8 JButtonbtn2=newJButton("非模态对话框");9 JFramef=newJFrame("DialogDemo");10 f.setSize(300,250);11 f.setLocation(300,200);12 f.setLayout(newFlowLayout());//为内容面板设置布局管理器

11.2.2JDialog13 //在Container对象上添加按钮14 f.add(btn1);15 f.add(btn2);16 //设置单击关闭按钮默认关闭窗口17 f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);18 f.setVisible(true);19 finalJLabellabel=newJLabel();20//定义一个JDialog对话框21 finalJDialogdialog=newJDialog(f,"Dialog"); 22dialog.setSize(220,150);//设置对话框大小23 dialog.setLocation(350,250);//设置对话框位置24 dialog.setLayout(newFlowLayout());//设置布局管理器25 finalJButtonbtn3=newJButton("确定");//创建按钮对象26 dialog.add(btn3);//在对话框的内容面板添加按钮

11.2.2JDialog27 //为"模态对话框"按钮添加单击事件28 btn1.addActionListener(newActionListener(){29 publicvoidactionPerformed(ActionEvente){30 //设置对话框为模态31 dialog.setModal(true);32 //如果JDialog窗口中没有添加了JLabel标签,就把JLabel标签加上33 if(dialog.getComponents().length==1){34 dialog.add(label);35 }36 //否则修改标签的内容37 label.setText("模式对话框,点击确定按钮关闭");38 //显示对话框39 dialog.setVisible(true);40 }41 });

11.2.2JDialog 42 //为"非模态对话框"按钮添加单击事件 43 btn2.addActionListener(newActionListener(){ 44 publicvoidactionPerformed(ActionEvente){ 45 //设置对话框为非模态 46 dialog.setModal(false); 47 //如果JDialog窗口中没有添加了JLabel标签,就把JLabel标签加上 48 if(dialog.getComponents().length==1){ 49 dialog.add(label); 50 } 51 //否则修改标签的内容 52 label.setText("非模式对话框,点击确定按钮关闭"); 53 //显示对话框 54 dialog.setVisible(true); 55 } 56 });

11.2.2JDialog57 //为对话框中的按钮添加单击事件58 btn3.addActionListener(newActionListener(){59 publicvoidactionPerformed(ActionEvente){60 dialog.dispose();61 }62 });63 }64}11.2.2JDialog程序运行结果如下图。单击【模态对话框】按钮,弹出模态对话框。11.2.2JDialog在模态对话框中,用户只能操作当前对话框,其他对话框都会处于一种“冰封”的状态,不能进行任何操作,直到用户单击对话框中的“确定”按钮,把该对话框关闭后,才能继续其他操作。在模态对话框中单击【确定】按钮关闭模态对话框,然后在运行结果图中单击【非模态对话框】按钮,弹出非模态对话框,如右图。11.3布局管理器组件在容器中的位置和尺寸是由布局管理器决定的,每当需要重新调整屏幕大小时,都要用到布局管理器。Swing常用的布局管理器有4种,分别是FlowLayout(流式布局管理器)、BorderLayout(边界布局管理器)、GridLayout(网格布局管理器)、GridBagLayout(网格包布局管理器)。Swing容器在创建时都会使用一种默认的布局管理器,在程序中可以通过调用容器对象的setLayout()方法设置布局管理器,通过布局管理器自动进行组件的布局管理。11.3.1FlowLayoutFlowLayout属于流式布局管理器,是最简单的布局管理器。在这种布局下,容器会将组件按照添加顺序从左向右放置。当到达容器的边界时,自动将组件放到下一行的开始位置。这些组件可以左对齐、居中对齐(默认方式)或右对齐的方式排列。11.3.1FlowLayoutFlowLayout类的常用方法及变量如下表。方法及常量类型功能描述publicFlowLayout()构造方法组件默认居中对齐,水平、垂直间距默认为5个单位publicFlowLayout(intalign)构造方法指定组件相对于容器的对齐方式,水平、垂直间距默认为5个单位publicFlowLayout(intalign,inthgap,intvgap)构造方法指定组件的对齐方式和水平、垂直间距publicstaticfinalintCENTER常量居中对齐publicstaticfinalintLEADING常量与容器的开始端对齐方式一样publicstaticfinalintLEFT常量左对齐publicstaticfinalintRIGHT常量右对齐11.3.1FlowLayout上表列出了FlowLayout的三个构造方法及四个常量。构造方法中的参数align决定组件在每行中相对于容器边界的对齐方式,可以使用FlowLayout类中提供的常量作为参数传递给构造方法;参数hgap和参数vgap分别设定组件之间的水平和垂直间隙,可以填入一个任意数值。FlowLayout类的常量中,FlowLayout.LEFT表示左对齐、FlowLayout.RIGHT表示右对齐、FlowLayout.CENTER表示居中对齐。11.3.1FlowLayout接下来通过一个案例学习FlowLayout布局管理器的用法。1importjavax.swing.*;2importjava.awt.*;3classExample03{4publicstaticvoidmain(String[]args){5JFrameframe=newJFrame("helloworld");6//设置窗体中的布局管理器为FlowLayout,所有的组件居中对齐,水平和垂直间距为37frame.setLayout(newFlowLayout(FlowLayout.CENTER,3,3));11.3.1FlowLayout8JButtonbutton=null;9for(inti=0;i<9;i++){10button=newJButton("按钮"+i);11frame.add(button);12}13frame.setSize(280,250);14frame.setVisible(true);15}16}11.3.1FlowLayout程序运行结果如下图。11.3.1FlowLayout在上述代码中,使用流式布局管理器对按钮进行管理。在这个过程中,第5行代码创建了一个JFrame窗口frame并,在创建窗体对象的同时定义了窗体对象的标题为“helloworld”,第7行代码通过JFrame的setLayout属性将该窗口的布局管理器设置为FlowLayout。在第8~12行代码中,定义了一个JButton的按钮,然后使用for循环向窗口中添加9个按钮。通过运行结果可以看出,frame窗口中的按钮按照流式布局进行排列。11.3.1FlowLayoutFlowLayout布局管理器的特点就是可以将所有组件像流水一样依次进行排列,不需要用户明确的设定,但是在灵活性上相对差了点。例如,将上图中的窗体拉伸变宽,按钮的大小和按钮之间的间距将保持不变,但按钮相对于容器边界的距离会发生变化,窗体拉伸变宽效果如右图。11.3.2BorderLayoutBorderLayout(边界布局管理器)是一种较为复杂的布局方式,它将窗体划分为五个区域,分别是东(EAST)、南(SOUTH)、西(WEST)、北(NORTH)、中(CENTER)。组件可以被放置在这五个区域中的任意一个区域中。BorderLayout的布局效果如右图。11.3.2BorderLayoutBorderLayout将窗体划分为五个区域,其中箭头是指改变容器大小时,各个区域需要改变的方向。也就是说,在改变窗体大小时,NORTH和SOUTH区域高度不变,宽度调整;WEST和EAST区域宽度不变,高度调整;CENTER会相应进行调整。11.3.2BorderLayout当向BorderLayout管理的窗体中添加组件时,需要调用add(Componentcomp,Objectconstraints)方法,其中,参数comp表示要添加的组件,参数constraints是一个Object类型的对象,用于指定组件添加方式以及添加位置。向add()方法传参时,可以使用BorderLayout类提供的5个常量,它们分别是EAST、SOUTH、WEST、NORTH和CENTER。11.3.2BorderLayoutBorderLayout的常用方法及常量如下表。方法及常量类型功能描述publicBorderLayout()构造方法构造没有间距的布局器publicBorderLayout(intalign,inthgap,intvgap)构造方法构造有水平和垂直间距的布局器publicstaticfinalStringEAST常量将组件设置在东区域publicstaticfinalStringWEST常量将组件设置在西区域publicstaticfinalStringSOUTH常量将组件设置在南区域publicstaticfinalStringNORTH常量将组件设置在北区域publicstaticfinalStringCENTER常量将组件设置在中区域11.3.2BorderLayout接下来通过一个案例演示BorderLayout布局管理器对组件布局的效果。1importjavax.swing.*;2importjava.awt.*;3classBorderLayoutDemoextendsJFrame{4//构造函数,初始化对象值5publicBorderLayoutDemo(){6//设置为边界布局,组件间横向、纵向间距均为5像素7setLayout(newBorderLayout(5,5));8setFont(newFont("Helvetica",Font.PLAIN,14));9//将按钮添加到窗口中10getContentPane().add("North",newJButton(BorderLayout.NORTH));

11.3.2BorderLayout11getContentPane().add("East",newJButton(BorderLayout.EAST));12getContentPane().add("West",newJButton(BorderLayout.WEST));13getContentPane().add("Center",newJButton(BorderLayout.CENTER));14}15publicstaticvoidmain(Stringargs[]){16BorderLayoutDemof=newBorderLayoutDemo();17f.setTitle("边界布局");18f.pack();19f.setVisible(true);20f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);21f.setLocationRelativeTo(null);//让窗体居中显示22}23}11.3.2BorderLayout程序运行结果如下图。11.3.2BorderLayout上述代码中,第7行代码为Frame容器设置了BorderLayout布局管理器(也可以不用设置,Frame默认使用BorderLayout布局管理器),第10~14行代码在容器的东、南、西、北、中五个区域各放置了1个按钮。11.3.2BorderLayoutBorderLayout的优点就是可以限定各区域的边界,当用户改变容器窗口大小时,各个组件的相对位置不变。但需要注意的是,向BorderLayout管理的容器添加组件时,如果不指定添加到哪个区域,则默认添加到CENTER区域,并且只能放置一个组件,如果向一个区域中添加多个组件时,后放入的组件会覆盖先放入的组件。11.3.3GridLayoutGridLayout布局管理器是以网格的形式管理容器中组件布局的。GridLayout使用纵横线将容器分成n行m列大小相等的网格,每个网格中放置一个组件。添加到容器中的组件首先放置在第1行第1列(左上角)的网格中,然后在第1行的网格中从左向右依次放置其他组件。一行放满之后,继续在下一行中从左到右放置组件。GridLayout管理方式与FlowLayou类似,但与FlowLayout不同的是,使用GridLayout管理的组件将自动占据网格的整个区域。11.3.3GridLayoutGridLayout的常用构造方法如下表。方法声明功能描述GridLayout()默认只有一行,每个组件占一列GridLayout(introws,intcols)指定容器的行数和列数GridLayout(introws,intcols,inthgap,intvgap)指定容器的行数和列数以及组件之间的水平、垂直间距11.3.3GridLayout列出了GridLayout的三个构造方法,其中,参数rows代表行数,cols代表列数,hgap和vgap规定水平和垂直方向的间隙。水平间隙指的是网格之间的水平距离,垂直间隙是指网格之间的垂直距离。11.3.3GridLayout接下来通过一个案例演示GridLayout布局的用法。1importjava.awt.*;2publicclassExample05{3 publicstaticvoidmain(String[]args){4 Framef=newFrame("GridLayout");//创建一个名为GridLayout的窗体5 f.setLayout(newGridLayout(3,3));//设置该窗体为3*3的网格6 f.setSize(300,300);//设置窗体大小7 f.setLocation(400,300);8 //下面的代码是循环添加9个按钮到GridLayout中9 for(inti=1;i<=9;i++){10 Buttonbtn=newButton("btn"+i);11 f.add(btn);//向窗体中添加按钮12 }13 f.setVisible(true);14 }15}11.3.3GridLayout程序运行结果如下图。11.3.4GridBagLayoutGridBagLayout是最灵活、最复杂的布局管理器。GridBagLayout与GridLayout布局管理器类似,不同的是,GridBagLayout允许网格中的组件大小各不相同,而且允许一个组件跨越一个或者多个网格。11.3.4GridBagLayout使用GridBagLayout布局管理器的步骤如下:(1)创建GridbagLayout布局管理器,设置容器采用该布局管理器。具体示例如下:GridBagLayoutlayout=newGridBagLayout();container.setLayout(layout);11.3.4GridBagLayout(2)创建GridBagContraints对象,并设置该对象的相关属性(设置布局约束条件)。具体示例如下:GridBagConstraintsconstraints=newGridBagConstraints();constraints.gridx=1; //设置网格的左上角横向索引constraints.gridy=1; //设置网格的左上角纵向索引constraints.gridwidth=1; //设置组件横向跨越的网格constraints.gridheight=1; //设置组件纵向跨越的网格11.3.4GridBagLayout(3)调用GridBagLayout对象的setConstraints()方法,建立GridBagConstraints对象和受控组件之间的关联。具体示例如下:layout.setConstraints(component,constraints);(4)向容器中添加组件。具体示例如下:container.add(conponent);GridBagConstraints对象可以重复使用。如果改变布局,只需要改变GridBagConstraints对象的属性即可。如果要向容器中添加多个组件,则重复(2)、(3)、(4)步骤。11.3.4GridBagLayout从上面的步骤可以看出,使用GridBagLayout布局管理器的关键在于GridBagConstraints对象。GridBagConstraint类才是控制容器中每个组件布局的核心类,在GridBagConstraints类中有很多用于设置约束条件的属性。11.3.4GridBagLayoutGridBagConstraints类的常用属性如下表。属性作用gridx和gridy设置组件所在网格的横向和纵向索引(即所在的行和列)。如果将gridx和gridy的值设置为GridBagConstraints.RELATIVE(默认值),表示当前组件紧跟在上一个组件后面。gridwidth和gridheight设置组件横向、纵向跨越几个网格,两个属性的默认值都是1。如果把这两个属性的值设为GridBagConstraints.REMAINER表示组件在当前行或列上为最后一个组件。如果把这两个属性的值设为GridBagConstraints.RELATIVE,表示组件在当前行或列上为倒数第二个组件。11.3.4GridBagLayout属性作用fill如果组件的显示区域大于组件需要的大小,设置组件改变方式,该属性接收以下几个属性值:NONE:默认,不改变组件大小。HORIZONTAL:使组件水平方向足够长以填充显示区域,但是高度不变,VERTICAL:使组件垂直方向足够高以填充显示区域,但长度不变。BOTH:使组件足够大,以填充整个显示区域。weightx和weighty设置组件占领容器中水平方向和垂直方向多余空白的比例(也称为权重)。假设容器的水平方向放置三个组件,组件的weightx属性值分别为1、2、3,当容器宽度增加60个像素时,这三个容器分别增加10、20、和30的像素。weightx和weighty属性的默认值是0,即不占领多余的空间。11.3.4GridBagLayout如果希望组件的大小随着容器的增大而增大,必须同时设置GridBagConstraints对象的fill属性和weightx、weighty属性。注意11.3.4GridBagLayout接下来通过一个案例演示GridBagLayout的用法。1importjava.awt.*;2classLayoutextendsFrame{3 publicLayout(Stringtitle){4 GridBagLayoutlayout=newGridBagLayout();5 GridBagConstraintsc=newGridBagConstraints();6 this.setLayout(layout);7 c.fill=GridBagConstraints.BOTH; //设置组件横向纵向可以拉伸8 c.weightx=1; //设置横向权重为19 c.weighty=1; //设置纵向权重为110 this.addComponent("btn1",layout,c);11 this.addComponent("btn2",layout,c);12 this.addComponent("btn3",layout,c);

11.3.4GridBagLayout13 c.gridwidth=GridBagConstraints.REMAINDER; 14 this.addComponent("btn4",layout,c);15 c.weightx=0; //设置横向权重为016 c.weighty=0; //设置纵向权重为017 addComponent("btn5",layout,c);18 c.gridwidth=1; //设置组件跨一个网格(默认值)19 this.addComponent("btn6",layout,c);20 c.gridwidth=GridBagConstraints.REMAINDER; 21 this.addComponent("btn7",layout,c);22 c.gridheight=2; //设置组件纵向跨两个网格23 c.gridwidth=1; //设置组件横向跨一个网格24 c.weightx=2; //设置横向权重为225 c.weighty=2; //设置纵向权重为226 this.addComponent("btn8",layout,c); 11.3.4GridBagLayout27 c.gridwidth=GridBagConstraints.REMAINDER;28 c.gridheight=1;29 this.addComponent("btn9",layout,c);30 this.addComponent("btn10",layout,c);31 this.setTitle(title);32 this.pack();33 this.setVisible(true);34 }35 //增加组件的方法36 privatevoidaddComponent(Stringname,GridBagLayoutlayout,37 GridBagConstraintsc){

11.3.4GridBagLayout38 Buttonbt=newButton(name); //创建一个名为name的按钮39 layout.setConstraints(bt,c);40 this.add(bt); //增加按钮41 }42}43publicclassExample06{44 publicstaticvoidmain(String[]args){45 newLayout("GridBagLayout");46 }47}11.3.4GridBagLayout程序运行结果如下图。11.3.4GridBagLayout在上述代码中,第10~30行代码向GridBagLayout管理的窗口中添加10个按钮。由于每次添加按钮的时候都需要调用该布局的setConstraints()方法,将GridBagConstraints对象与按钮组件相关联,因此,可以将这段起到关联作用的代码抽取到addComponent()方法当中,简化书写。第10~14行代码在添加button1~button4按钮和第26~30行代码在添加button8~button10按钮时,都将权重weightx和weighty的值设置为大于0,因此在拉伸窗口时,这些按钮都会随着窗口增大。第17~21行代码在添加button5~button7按钮时,将权重值设置为0,这样它们的高度在拉伸时没有变化,但长度受上下组件的影响,还是会随窗口变大。11.4.1事件处理机制Swing组件中的事件处理专门用于响应用户的操作,例如,响应用户的鼠标单击、按下键盘等操作。在Swing事件处理的过程中,主要涉及到三类对象:●事件源(EventSource):事件发生的场所,通常是产生事件的组件,如窗口、按钮、菜单等。●事件对象(Event):封装了GUI组件上发生的特定事件(通常就是用户的一次操作)。●监听器(Listener):负责监听事件源上发生的事件,并对各种事件做出相应处理(监听器对象中包含事件处理器)。11.4.1事件处理机制上面提到的事件源、事件对象、监听器在整个事件处理过程中都起着非常重要的作用,它们彼此之间有着非常紧密的联系。接下来用一个图例来描述事件处理的工作流程。11.4.1事件处理机制事件源是一个组件,当用户进行一些操作时,例如,按下鼠标或者释放键盘等,都会触发相应的事件,如果事件源注册了监听器,则触发的相应事件将会被处理。11.4.1事件处理机制接下来通过一个案例演示Swing中的事件处理。1importjava.awt.event.*;2importjavax.swing.*;3//自定义事件监听器类4classMyListenerimplementsActionListener{5 //实现监听器方法,对监听事件进行处理6 publicvoidactionPerformed(ActionEvente){7 System.out.println("用户点击了JButton按钮组件");8 }9}11.4.1事件处理机制10publicclassExample07{11 privatestaticvoidcreateAndShowGUI(){12 JFramef=newJFrame("JFrame窗口");13 f.setSize(200,100);14 //创建一个按钮组件,作为事件源15 JButtonbtn=newJButton("按钮");16 //为按钮组件事件源添加自定义监听器17 btn.addActionListener(newMyListener());

11.4.1事件处理机制18 f.add(btn);19 f.setVisible(true);20 f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);21 }22 publicstaticvoidmain(String[]args){23 //使用SwingUtilities工具类调用createAndShowGUI()方法并显示GUI程序24 SwingUtilities.invokeLater(Example07::createAndShowGUI);25 }26}11.4.1事件处理机制程序运行结果如下图。在左图中单击【按钮】组件,查看控制台,显示输出结果如下图。11.4.1事件处理机制上述代码中,第15行代码定义了一个btn的JButton的按钮,在第18行代码中将btn添加到JFrame窗口中,同时在第17行代码中使用addActionListener()方法为JButton按钮组件添加了一个自定义事件监听器,当单击JButton按钮组件时,自定义的事件监听器,进行事件处理。11.4.1事件处理机制从上面的程序可以看出,实现Swing事件处理的主要步骤如下:(1)创建事件源:除了一些常见的按钮、键盘等组件可以作为事件源外,还可以使用JFrame窗口在内的顶级容器作为事件源。(2)自定义事件监听器:根据要监听的事件源创建指定类型的监听器进行事件处理。监听器是一个特殊的Java类,必须实现XxxListener接口。根据组件触发的动作进行区分,例如,WindowListener用于监听窗口事件,ActionListener用于监听动作事件。11.4.1事件处理机制(3)为事件源注册监听器:使用addXxxListener()方法为指定事件源添加特定类型的监听器。当事件源上发生监听事件后,就会触发绑定的事件监听器,由监听器中的方法对事件进行相应处理。11.4.2Swing常用事件处理1.窗体事件大部分GUI应用程序都需要使用Window窗体对象作为最外层的容器,可以说窗体对象是所有GUI应用程序的基础,应用程序中通常都是将其他组件直接或者间接地添加到窗体中。11.4.2Swing常用事件处理当对窗体进行操作时,例如,窗体的打开、关闭、激活、停用等,这些动作都属于窗体事件。Java提供了一个WindowEvent类用于表示窗体事件。在应用程序中,当对窗体事件进行处理时,首先需要定义一个实现了WindowListener接口的类作为窗体监听器,然后通过addWindowListener()方法将窗体对象与窗体监听器进行绑定。11.4.2Swing常用事件处理接下来通过一个案例实现对窗体事件的监听。1importjava.awt.event.*;2importjavax.swing.*;3publicclassExample08{4 privatestaticvoidcreateAndShowGUI(){5 JFramef=newJFrame("WindowEvent");6 f.setSize(400,300);7 f.setLocation(300,200);8 f.setVisible(true);9f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);10 //使用内部类创建WindowListener实例对象,监听窗体事件11 f.addWindowListener(newWindowListener(){12 publicvoidwindowOpened(WindowEvente){13 System.out.println("windowOpened窗体打开事件");14 }

11.4.2Swing常用事件处理 15 publicvoidwindowIconified(WindowEvente){ 16 System.out.println("windowIconified窗体图标化事件"); 17 } 18 publicvoidwindowDeiconified(WindowEvente){ 19 System.out.println("windowDeiconified窗体取消图标化事件"); 20 } 21 publicvoidwindowDeactivated(WindowEvente){ 22 System.out.println("windowDeactivated窗体停用事件"); 23 } 24 publicvoidwindowClosing(WindowEvente){ 25 System.out.println("windowClosing窗体正在关闭事件"); 26 } 27 publicvoidwindowClosed(WindowEvente){ 28 System.out.println("windowClosed窗体关闭事件"); 29 }

11.4.2Swing常用事件处理30 publicvoidwindowActivated(WindowEvente){31 System.out.println("windowActivated窗体激活事件");32 }33 });34 }35 publicstaticvoidmain(String[]args){36 //使用SwingUtilities工具类调用createAndShowGUI()方法并显示GUI程序37 SwingUtilities.invokeLater(Example08::createAndShowGUI);38 }39}11.4.2Swing常用事件处理程序运行结果如下图。11.4.2Swing常用事件处理上述代码中,第11~33行代码通过WindowListener对操作窗口的窗体事件进行监听,当接收到特定的操作后,就将所触发事件的名称打印出来。对图11-16所示的窗体事件源进行事件操作,分别执行最小化、单击任务栏图标、单击关闭按钮时,窗口事件监听器就会对相应的操作进行监听并响应,响应结果如下图。11.4.2Swing常用事件处理2.鼠标事件在图形用户界面中,用户会经常使用鼠标进行选择、切换界面等操作,这些操作被定义为鼠标事件,包括鼠标按下、鼠标松开、鼠标单击等。Java提供了一个MouseEvent类描述鼠标事件。处理鼠标事件时,首先需要通过实现MouseListener接口定义监听器(也可以通过继承适配器MouseAdapter类定义监听器),然后调用addMouseListener()方法将监听器绑定到事件源对象。11.4.2Swing常用事件处理接下来通过一个案例学习如何监听鼠标事件。1importjava.awt.*;2importjava.awt.event.*;3importjavax.swing.*;4publicclassExample09{5 privatestaticvoidcreateAndShowGUI(){6 JFramef=newJFrame("MouseEvent");7 f.setLayout(newFlowLayout()); //为窗口设置布局8 f.setSize(300,200);9 f.setLocation(300,200);10 f.setVisible(true);11f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

11.4.2Swing常用事件处理 12 JButtonbut=newJButton("Button"); //创建按钮对象 13 f.add(but); //在窗口添加按钮组件 14 //为按钮添加鼠标事件监听器 15 but.addMouseListener(newMouseListener(){ 16 publicvoidmouseReleased(MouseEvente){ 17 System.out.println("mouseReleased-鼠标放开事件"); 18 } 19 publicvoidmousePressed(MouseEvente){ 20 System.out.println("mousePressed-鼠标按下事件"); 21 } 22 publicvoidmouseExited(MouseEvente){ 23 System.out.println("mouseExited—鼠标移出按钮区域事件"); 24 }

11.4.2Swing常用事件处理25 publicvoidmouseEntered(MouseEvente){26 System.out.println("mouseEntered—鼠标进入按钮区域事件");27 }28 publicvoidmouseClicked(MouseEvente){29 System.out.println("mouseClicked-鼠标完成单击事件");30 }31 });32 }33 publicstaticvoidmain(String[]args){34 //使用SwingUtilities工具类调用createAndShowGUI()方法并显示GUI程序35 SwingUtilities.invokeLater(Example09::createAndShowGUI);36 }37}11.4.2Swing常用事件处理程序运行结果如下图。11.4.2Swing常用事件处理上述代码中,第15~31行代码通过MouseEvent对鼠标事件进行监听,当接收到特定的操作后,就将所触发事件的名称打印出来。在图11-18中,用鼠标对窗口上的按钮进行操作,先把鼠标移进按钮区域,接着单击按钮然后释放,再移出按钮区域,控制台的输出信息如下图。11.4.2Swing常用事件处理MouseEvent类中定义了很多常量来识别鼠标操作,包括鼠标左键单/双击、滚轮操作等。如下面的代码所示:publicvoidmouseClicked(MouseEvente){ if(e.getButton()==MouseEvent.BUTTON1){ System.out.println("鼠标左击事件"); } if(e.getButton()==MouseEvent.BUTTON3){ System.out.println("鼠标右击事件"); } if(e.getButton()==MouseEvent.BUTTON2){ System.out.println("鼠标中键单击事件"); }} 11.4.2Swing常用事件处理3.键盘事件键盘操作也是最常用的用户交互方式,例如,键盘按下、释放等,这些操作被定义为键盘事件。Java提供了一个KeyEvent类表示键盘事件,处理KeyEvent事件的监听器对象需要实现KeyListener接口或者继承KeyAdapter类,然后调用addKeyListener()方法将监听器绑定到事件源对象。11.4.2Swing常用事件处理接下来通过一个案例学习如何监听键盘事件。1importjava.awt.*;2importjava.awt.event.*;3importjavax.swing.*;4publicclassExample10{5 privatestaticvoidcreateAndShowGUI(){6 JFramef=newJFrame("KeyEvent");7 f.setLayout(newFlowLayout());8 f.setSize(400,300);9 f.setLocation(300,200);10 JTextFieldtf=newJTextField(30);//创建文本框对象11 f.add(tf);//在窗口中添加文本框组件12 f.setVisible(true);13 f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

11.4.2Swing常用事件处理14//为文本框添加键盘事件监听器15 tf.addKeyListener(newKeyAdapter(){16 publicvoidkeyPressed(KeyEvente){17 //获取对应的键盘字符18 charkeyChar=e.getKeyChar();19 //获取对应的键盘字符代码20 intkeyCode=e.getKeyCode();21 System.out.print("键盘按下的字符内容为:"+keyChar+"");22 System.out.println("键盘按下的字符代码为:"+keyCode);23 }24 });25 }

11.4.2Swing常用事件处理26 publicstaticvoidmain(String[]args){27 //使用SwingUtilities工具类调用createAndShowGUI()方法并显示GUI程序28 SwingUtilities.invokeLater(Example10::createAndShowGUI);29 }30}11.4.2Swing常用事件处理程序运行结果如下图。11.4.2Swing常用事件处理上述代码中,第10行代码使用JTextComponent类的子类JtextField定义文本框,这里需要注意的是,JtextField类只允许编辑单行文本。在运行结果中的文本框中键入字符时,便触发了键盘事件。程序会执行代码第16~23行的keyPressed()方法。通过调用KeyEvent类的getKeyChar()方法获取键盘键入的字符,通过调用getKeyCode()方法获取输入字符对应的整数值。11.4.2Swing常用事件处理在运行结果图中,依次从键盘输入a、1、2、3字符,程序会在控制台将按键对应的名称和键值(keyCode)打印出来,控制台输出结果如下图。11.4.2Swing常用事件处理4.动作事件动作事件与前面3种事件有所不同,它不代表某类事件,只是表示一个动作发生了。例如,在关闭一个文件时,可以通过键盘关闭,也可以通过鼠标关闭。在这里读者不需要关心使用哪种方式关闭文件,只要是对关闭按钮进行操作,就会触发动作事件。11.4.2Swing常用事件处理在Java中,动作事件用ActionEvent类表示,处理ActionEvent事件的监听器对象需要实现ActionListener接口。监听器对象在监听动作时,不会像鼠标事件一样处理鼠标的移动和单击的细节,而是去处理类似于“按钮按下”这样“有意义”的事件。11.5Swing常用组件前面几个小节讲解了Swing中的容器,以及开发过程中需要用到的布局管理器和事件处理机制,完成这些内容的学习后,还需要学习Swing中的组件,这样才能实现完整的GUI程序。11.5.1面板组件Swing组件中不仅具有JFrame和JDialog这样的顶级容器,还提供了一些面板组件(也称之为中间容器)。面板组件不能单独存在,只能放置在顶级窗口容器中。最常见的面板组件有两种,分别是JPanel和JScrollPane。11.5.1面板组件1.JPanelJPanel面板组件是一个无边框,不能被移动、放大、缩小或者关闭的面板,它的默认布局管理器是FlowLayout。也可以使用JPanel带参数的构造函数JPanel(LayoutManagerlayout)或者setLayout()成员方法设置JPanel布局管理器。JPanel面板组件类并没有包含多少特殊的组件操作方法,大多数都是从父类(如Container)继承过来的,使用也非常简单。11.5.1面板组件2.JScrollPaneJScrollPane是一个带有滚动条的面板,面板上只能添加一个组件。如果想向JScrollPane面板中添加多个组件,应该先将这多个组件添加到某个组件中,然后再将这个组件添加到JScrollPane中。11.5.1面板组件JScrollPane的常用构造方法如下表。方法声明功能描述JScrollPane()创建一个空的JScrollPane面板。JScrollPane(Componentview)创建一个显示指定组件的JScrollPane面板,一旦组件的内容超过视图大小就会显示水平或垂直滚动条。JScrollPane(Componentview,intvsbPolicy,inthsbPolicy)创建一个显示指定容器、并具有指定滚动条策略的JScrollPane。参数vsbPolicy和hsbPolicy分别表示垂直滚动条策略和水平滚动条策略。11.5.1面板组件如果在构造方法中没有指定显示组件和滚动条策略,可以调用JScrollPane提供的成员方法进行设置,JScrollPane设置面板滚动策略的方法如下表。方法声明功能描述voidsetHorizontalBarPolicy(intpolicy)指定水平滚动条策略,即水平滚动条何时显示在滚动面板上。voidsetVerticalBarPolicy(intpolicy)指定垂直滚动条策略,即垂直滚动条何时显示在滚动面板上。voidsetViewportView(Componentview)设置在滚动面板显示的组件。11.5.1面板组件关于上述介绍的JScrollPane面板组件滚动策略的设置方法,ScrollPaneConstants接口声明了多个常量属性,可以用来设置不同的滚动策略。JscrollPane的滚动属性如下表。方法声明功能描述VERTICAL_SCROLLBAR_AS_NEEDED当填充的组件视图超过客户端窗口大小时,自动显示水平和竖直滚动条(JscrollPane组件的默认值)。HORIZONTAL_SCROLLBAR_AS_NEEDEDVERTICAL_SCROLLBAR_ALWAYS无论填充的组件视图大小,始终显示水平和竖直滚动条。HORIZONTAL_SCROLLBAR_ALWAYSVERTICAL_SCROLLBAR_NEVER无论填充的组件视图大小,始终不显示水平和竖直滚动条。HORIZONTAL_SCROLLBAR_NEVER11.5.1面板组件接下来通过一个案例演示面板组件的基本用法。1importjava.awt.*;2importjavax.swing.*;3publicclassExample11{4 privatestaticvoidcreateAndShowGUI(){5 //1、创建一个JFrame容器窗口6 JFramef=newJFrame("PanelDemo");7 f.setLayout(newBorderLayout());8 f.setSize(350,200);9 f.setLocation(300,200);10 f.setVisible(true);11 f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);12 //2、创建JScrollPane滚动面板组件13 JScrollPanescrollPane=newJScrollPane();

11.5.1面板组件 14 //设置水平滚动条策略--滚动条需要时显示 15 scrollPane.setHorizontalScrollBarPolicy 16 (ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); 17 //设置垂直滚动条策略--滚动条一直显示 18 scrollPane.setVerticalScrollBarPolicy 19 (ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); 20 //定义一个JPanel面板组件 21 JPanelpanel=newJPanel(); 22 //在JPanel面板中添加四个按钮 23 panel.add(newJButton("按钮1")); 24 panel.add(newJButton("按钮2")); 25 panel.add(newJButton("按钮3")); 26 panel.add(newJButton("按钮4"));

11.5.1面板组件27 //设置JPanel面板在滚动面板JScrollPane中显示28 scrollPane.setViewportView(panel);29 //向JFrame容器窗口中添加JScrollPane滚动面板组件30 f.add(scrollPane,BorderLayout.CENTER);31 }32 publicstaticvoidmain(String[]args){33 //使用SwingUtilities工具类调用createAndShowGUI()方法并显示GUI程序34 SwingUtilities.invokeLater(Example11::createAndShowGUI);35 }36}11.5.1面板组件程序运行结果如下图。11.5.1面板组件上述代码中,第4~31行定义了createAndShowGUI()方法,在createAndShowGUI()方法中,第6~11行代码创建了一个名为f的容器窗口;第13行代码创建了名为scrollPane滚动面板组件;第

温馨提示

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

评论

0/150

提交评论