SwingT组件及事件处理.ppt_第1页
SwingT组件及事件处理.ppt_第2页
SwingT组件及事件处理.ppt_第3页
SwingT组件及事件处理.ppt_第4页
SwingT组件及事件处理.ppt_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

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

文档简介

第七讲 Swing组件及事件处理,教学目的: 1.掌握图形用户界面中各种基本组件的属性及使用方法; 2.掌握图形用户界面的事件处理机制。 教学内容: 本讲主要介绍Java GUI中各种组件的用法,及相应的事件处理机制。,重点: 1.各组件的属性及使用。 2.事件的处理方法。 难点: GUI中的事件处理机制。,补充知识,一、Java图形用户界面 图形用户界面(GUI,Graphical User Interface)是为应用程序提供一个图形化的界面,程序通过GUI与用户交互,GUI能使一个应用程序具有与众不同的“外观”与“感觉”。 二、重量级和轻量级组件介绍 容器(Container)是组件(Component)的抽象子类,在该类中允许装入其他的组件,要装入的组件也可以是容器,在这些窗口中还可以装入其他的组件,这样可以创建完整的层次结构。容器有助于在屏幕上布置GUI组件。最常用的容器是Panel和Frame。,补充知识,三、 java.awt中的各个类,四、图形组件类的继承关系(补充知识),Swing包中类的关系,javax.swing包中有四个最重要的类JApplet、JFrame、JDialog、JComponent。 JComponent类的子类都是轻组件,而JFrame、JApplet、JDialog都是重组件,即有同位体的组件,这样窗口(JFrame)、对话框(JDialog)、小应用程序(JApplet)可以和操作系统交互信息,轻组件必须在这些重量容器中绘制自己。 JComponent 类是java.awt包中容器类Container类的子类,因此所有的轻量组件也都是容器。,补充知识,五、窗口类 AWT提供了三个在屏幕上显示窗口的组件:Window、Frame和Dialog。这三个组件都用于显示窗口,而且相互之间的区别也不明显,因此有时候很难确定到底使用哪个组件更好。,补充知识,1、窗口(Window) java.awt.Window是三个窗口组件中最基本的组件,它实际上是Frame与Dialog组件的超类。窗口组件没有边界、标题栏与菜单栏,而且大小不可以调整。 常用窗口实现的界面包括:产品信息的封面(如Outlook等软件启动时,显示在屏幕中间且几秒后自动消失的封面窗口),提示帮助信息(如使用金山词霸等软件时,移动鼠标到某个英文单词上时自动弹出的解释信息)等。,补充知识,2、框架(Frame) java.awt.Frame是Window的一个子类,它是带有标题栏和边界的窗口,而且允许调整大小。另外,用户还可以为框架附加一个菜单栏。用户在程序设计过程中,当程序窗口需要图表化或者需要包含菜单栏时,则可以选择使用框架组件。 构造一个框架后,可以用add()方法来给框架添加组件。框架的缺省布局管理器属性是BorderLayout。可以用setLayout()方式来改变布局管理器属性。,补充知识,3、对话框(Dialog) java.awt.Dialog也是Window的扩展类。与框架相同的是,对话框也拥有边界与标题栏,而且也可以调整大小;而与框架不同的是,对话框不支持附加菜单栏,而且对话框可以模式化属性设置,这是窗口和框架都不允许的。因此,如果用户在程序设计过程中需要创建一个临时窗口与用户交换信息时,使用模式对话框是最方便的。,补充知识,另外,AWT中还提供了Dialog类的一个常用的扩展类FileDialog(文件对话框)。它可以为用户选择一个待打开或保存的文件。 文件对话框是文件选择设备的一个实现。它有自己的自由窗口以及窗口元素,并且允许用户浏览文件系统,以及为以后的操作选择一个特定的文件。,一、 JFrame类,javax.swing包中的JFrame类是java.awt包中Frame类的子类。因此JFrame类及其子类创建的对象是窗体。由于Frame是重量容器,因此JFrame类或子类创建的对象(窗体)也是重量容器。 不可以将组件直接添加到swing窗体中,应当加到窗体的内容面板容器中,程序可以通过调用getContentPane()方法获得窗体的内容面板。 程序要不可以设置窗体的布局,但可以设置内容面板的布局,默认布局为BorderLayout。(见例1),一、 JFrame类,一、 Frame常用方法 1JFrame() 该构造方法可以创建一个无标题的窗口,窗口的默认布局为BorderLayout布局。 2JFrame(String s) 该构造方法可以创建一个标题为s的窗口,窗口的默认布局为BorderLayout布局。 3public void setBounds(int a,int b,int width,int height) 窗口调用该方法可以设置出现在屏幕上时的初始位置是(a,b),即距屏幕左面a个像素、距屏幕上方b个像素;窗口的宽是width,高是height。,一、 JFrame类,4public void setSize(int width,int height) 设置窗口的大小,窗口在屏幕出现是默认位置是(0,0)。 5public void setVisible(boolean b) 设置窗口是可见还是不可见,窗口默认是不可见的。 6public void setResizable(boolean b) 设置窗口是否可调整大小,窗口默认是可调整大小的。,二、 JApplet类,JApplet类也是用来建立java小应用程序用的。JApplet是Javax.swing包中的类,它还是java.applet包中的Applet类的子类,因此JApplet对象也是一个重量容器。 它与Applet的区别主要是: 小程序容器中也含有一个内容面板,添加组件,设置布局的工作只能通过设置该内容面板来完成,不可以直接向小程序中添加组件,同样通过调用getContentPane()方法获得此面板。,三、 JDialog类,JDialog 是java.awt包中Dialog类的子类。JDialog类或子类创建的对象是也是重量容器,该对象必须依附一个JFrame对象。它的构造方法如下: Jdialog(Jframe f,String s) 同样对话框容器中也含有一个内容面板,添加组件,设置布局的工作只能通过设置该内容面板来完成,不可以直接向对话框中添加组件,同样通过调用getContentPane()方法获得此面板。,四、中间容器,虽然所有的轻量级组件都是容器,但仍有一些经常用来添加组件的轻量容器,相对于底层重量容器而言,习惯上称这些轻量容器为中间容器。 这些容器有: 1、JPanel 面板 2、JScrollPane 滚动面板 JscrollPane scroll=new JscrollPane(new JTextArea(),3、JSplitPane拆分窗格 JSplitPane(int a,boolean b,Component c,Component d) 参数a取值:HORIZONTAL_SPLIT(水平),VERTICAL_SPLIT(垂直)决定是水平还是垂直拆分容器。 参数b:决定当拆分线移动时,组件是否连续变化。 参数c、d:代表窗格上要放的两个组件。 4、JInternalFrame 内部窗格 JInternalFrame(String title,boolean resizable,boolean closable,boolean max,boolean min) 其中的参数决定窗体是否能调整大小、关闭、最大化、最小化。,注: 1、内部窗体和前面的中间容器有所不同,不能直接把组件加到容器中,而是要通过getContentPane()获得内容面板,然后将组件加到内容面板中。 2、内部窗体必须添加到JDesktopPane容器中才能显示,该容器是专门为内部窗体服务的。 3、内部窗体需要显示调用setVisible()、setSize()或setBound()才能使窗体可见和设置窗体大小。,五、事件处理机制,1、基本概念 (1)事件源:能够产生事件的对象都可以成为事件源,如文本框、按钮、下拉式列表等。也就是说,事件源必须是一个对象,而且这个对象必须是Java认为能够发生事件的对象。 (2)监视器:事件处理需要一个对象对事件源进行监视,以便对发生的事件作出处理。事件源通过调用相应的方法将某个对象作为自己的监视器。例如,对于文本框,这个方法是: addActionListener(监视器); 创建该监视器对象的类必须声明实现相应的接口 ,一个监听器对象是一个实现了专门的监听器接口的类的实例(对象)。,(3)处理事件的接口:在组件(文本框)获得输入焦点之后,如果用户按回车键,Java运行系统就自动用ActionEvent类创建了一个对象,即发生了ActionEvent事件 。当事件源发生事件时,监视器就自动调用执行被类实现的某个相应接口方法。 (4)Event handlers(事件处理器):接收事件对象、解释事件对象并处理用户交互的方法。 2、事件处理机制 事件由事件源产生,为了能处理相应类型的事件,事件源必须使用相应的方法获得监视器。当事件发生时,监视器使用接口中的方法对事件进行处理。,处理事件示意图,3、实现步骤 (1)对java.awt中组件实现事件处理必须使用java.awt.event包,所以在程序开始应加入import java.awt.event.*语句。 (2)定义事件处理器类(或实现事件处理方法),用该类创建对象。 (3)用如下语句设置事件监听者: 事件源.addXXListener(XXListener代表某种事件监听者)。,(4)当事件发生时, Java运行系统就自动用监听器类创建了一个对象,该类就调用相应的方法处理该事件,这样就可以处理图形用户界面中的对应事件了。要删除事件监听者可以使用语句: 事件源.removeXXListener; 详见例1。,补充: Java常用事件 _列表,六、布局,布局管理器会依据组件的加入顺序决定其摆放方式。组件的大小、形状、位置,在不同的布局管理器下有显著的不同。此外,布局管理器会自动适应小程序或应用程序窗口的大小,所以如果某个窗口的大小改变了,那么其上各个组件的大小、形状、位置都有可能发生改变。,六、布局,Java提供以下几种布局管理器:流布局(Fl-owLayout)、边界布局(BorderLayout)、网格布局(GridLayout)、网格包布局(GridBagLayout)、卡片布局(CardLayout)和手工布局。 Panel、Applet的默认布局为流布局, Window、Frame的默认布局为边界布局。容器可以使用方法:setLayout(布局对象);来设置自己的布局。,六、布局,1、FlowLayout布局 FlowLayout类创建的对象称做FlowLayout型布局。FlowLayout型布局是Panel型容器的默认布局,即Panel及其子类创建的容器对象,如果不专门为其指定布局,则它们的布局就是FlowLayout型布局。 如果一个容器使用这个FlowLayout型布局,组件按照加入的先后顺序从左向右排列,一行排满之后就转到下一行继续从左至右排列。,六、布局,六、布局,例1,FlowLayout flow=new FlowLayout(); flow.setAlignment(FlowLayout.LEFT); flow.setHgap(2); flow.setVgap(8); setLayout(flow);,六、布局,2、BorderLayout布局 BorderLayout 布局是Window型容器的默认布局,例如Frame、Dialog都是Window类的子类,它们的默认布局都是BorderLayout 布局。 如果一个容器使用这种布局,那么容器空间简单地划分为东、西、南、北、中五个区域,中间的区域最大。,六、布局,注意:在边界布局下add方法的使用方法: add(Component c, int position);,六、布局,其中参数position可取以下常量之一:BorderLayout.NORTH,BorderLayout.SOUTH,BorderLayout.EAST,BorderLayout.WEST,BorderLayout.CENTER。 例如:下面语句将按钮eastButton放置在东区: add(eastButton, BorderLayout.EAST); 由于组件放置的位置必须由参数指定,因此可按任何顺序向容器添加组件。,例2,Frame win=new Frame(“窗体“); win.add(bNorth,BorderLayout.NORTH); win.add(bSouth,BorderLayout.SOUTH); win.add(bEast,BorderLayout.EAST); win.add(bWest,BorderLayout.WEST); win.add(bCenter,BorderLayout.CENTER);,六、布局,3、CardLayout 布局 使用CardLayout 的容器可以容纳多个组件,但是实际上同一时刻容器只能从这些组件中选出一个来显示,就像一叠“扑克牌”每次只能显示最上面一张一样,这个被显示的组件将占据所有的容器空间,依次排序。,例3,CardLayout mycard; mycard=new CardLayout(); pCenter=new Panel(); pCenter.setLayout(mycard); mycard.first(pCenter); mycard.next(pCenter); mycard.last(pCenter);,六、布局,4、GridLayout布局 网格布局将容器划分成网格,这样各个组件就可以按行列放置到每个网格中,每个组件的大小一样(均分)。在向GridLayout添加组件时,其顺序是从网格的左上角开始,从左向右排列,直到排满一行,再从下一行开始从左向右依次排列。GridLayout类的构造函数如下:,六、布局,六、布局,GridLayout的布局策略是把容器划分成若干行乘若干列的网格区域,组件就位于这些划分出来的小格中。GridLayout比较灵活,划分多少网格由程序自由控制,而且组件定位也比较精确 由于GridLayout布局中每个网格都是相同大小并且强制组件与网格的大小相同,使得容器中的每个组件也都是相同的大小,显得很不自然。为了克服这个缺点,你可以使用容器嵌套。,例4,GridLayout grid; grid=new GridLayout(12,12); setLayout(grid); Label label=new Label1212; labelij.setBackground(Color.black);,六、布局,5、BoxLayout布局 盒式布局的容器将组件排列在一行或一列,这取决于创建盒式布局对象时,是否指定了是行排列还是列排列。 使用行(列)型盒式布局的容器将组件排列在一行(列),组件按加入的先后顺序从左(上)向右(下)排列,容器的两端是剩余的空间。和FlowLayou布局不同的是,使用行型盒式布局的容器只有一行(列),即使组件再多,也不会延伸到下一行(列),这些组件可能会被缩小大小,紧缩在这一行(列)中。,七、图形用户界面的各种组件介绍,1. 按钮(JButton) JButton 类负责创建按钮对象,与重量组件按钮Button相比,JBtton按钮具有更加丰富的外观。 主要构造方法: public JButton() public JButton(Icon icon) 主要实例方法: public void setText(String text) public void getText() public void addActionListener(ActionListener) 等详细内容见课本429页。,2标签(JLabel) JLabel 类负责创建标签对象,与重量组件标签Label相比,JLabel标签具有更加丰富的外观,例如我们可以创建带图标的标签。 3复选框(JCheckBox) JCheckBox 类负责创建复选框对象。与重量组件复选框Checkbox相比,JCheckBox复选框的名字不仅可以是字符串,而且它的样子可以是一个图标。,4. 单选按钮(JRadioButton) 单选按钮和复选框很类似,所不同的是:在若干个复选框中我们可以同时选中多个,而一组单选按钮同一时刻只能有一个被选中。 5 .下拉列表(JComboBox) 用户可以在下拉列表看到第一个选项和它旁边的箭头按钮,当用户单击箭头按钮时,对于下拉式列表事件源,可以发生ItemEvent事件。,6. 文本框(JTextField)、密码框JPasswordField、文本区(JTextArea) JTextField文本框、JTextArea文本区分别用于显示单行文本和多行文本。可以使用 setText(String)设置文本,getText()获取文本,文本区还可以使用append(String)向文本区追加文本,口令框可以使用setEchoChar(char c)设置回显字符等。 JTextField文本框还可以调用setHorizontalAlignment(int alignment)方法设置文本的对齐方式,其中alignment的有效值是JTextField.LEFT、JTextField.CENTER、JTextField.RIGHT 、JTextField.LEADING 、JTextField.TRAILING 。,7文件选择器(JFileChooser) 文件选择器是一个从文件系统中进行文件选择的界面。文件选择器事实上并不能打开或保存文件,它们只能替你得到要打开或保存的文件对象,要想真正实现打开或保存,必须还得使用输入、输出流。 8进度条 使用JProgressBar类创建进度条组件。该组件能用一种颜色动态地填充自己,以便显示某任务完成的百分比。,9表格(JTable) 表格组件以行和列的形式显示数据,允许对表格中的数据进行编辑。表格的模型功能强大、灵活并易于执行。,八、 Component类的常用方法,Component类是所有组件的父类,这一节介绍 Component类的常用方法 。 1、组件的颜色 public void setBackground(Color c) 设置组件的背景色。 public void setForeground(Color c) 设置组件的前景色。 public Color getBackground() 获取组件的背景色。 public Color getForeground() 获取组件的前景色。,2、组件的字体 public void setFont(Font f) 组件调用该方法设置组件上的字体。例如,文本组件调用该方法可以设置文本组件中的字体。 public Font getFont() 组件调用该方法获取组件上的字体。,3、组件的大小与位置 public void setSize(int width,int height) 组件调用该方法设置组件的大小,参数width指定组件的宽度,height指定组件的高度。 public void setLocation(int x,int y) 组件调用该方法设置组件在容器中的位置,包含该组件的容器都有默认的坐标系,容器的坐标系的左上角的坐标是(0,0),参数x,y指定该组件的左上角在容器的坐标系中的坐标,即组件距容器的左边界 x个像素,距容器的上边界 y 个像素。 public Dimension getSize() 组件调用该方法返回一个Dimension对象的引用,该对像实体中含有名字是width 和height的成员变量,方法返回的Dimension 对象的width的值就是组件的宽度、height的值就是当前组件的高度。,public Point getLocation() 组件调用该方法返回一个Point对象的引用,该对像实体中含有名字是x 和y的成员变量,方法返回的Point对象的x,y的值就是组件的左上角在容器的坐标系中的x坐标和y坐标。 public void setBounds(int x,int y,int width,int height) 组件调用该方法设置组件在容器中的位置和组件的大小。该方法相当于setSize方法和setLocation方法的组合。 public Rectangle getBounds() 组件调用该方法返回一个Rectangle对象的引用,该对象实体中含有名字是x、y、width 和height的成员变量,方法返回的Rectangle对象的x,y的值就是组件的左上角在容器的坐标系中的x坐标和y坐标,width和height的值就是当前组件的宽度和高度。,4、组件的激活与可见性 public void setEnabled(boolean b) 组件调用该方法可以设置组件是否可被激活,当参数b取值true时,组件可以被激活,当参数b取值false 时,组件不可激活。默认情况下,组件是可以被激活的。 public void setVisible(boolean) 设置组件在该容器中的可见性,当参数b取值true时,组件在容器中可见,当参数b取值false 时,组件在容器中不可见。除了Window型组件外,其它类型组件默认是可见的。,5、组件上的光标 public void setCursor(Cursor c) 设置鼠标指向组件时的光标形状。 可以使用 Cursor类的类方法直接获得一个光标对象,例如: Cursor c=Cursor. getPredefinedCursor (Cursor.HAND_CURSOR);,九、鼠标事件,任何组件上都可以发生鼠标事件,如:鼠标进入组件、退出组件、在组件上方单击鼠标、拖动鼠标等都触发组件发生鼠标事件,也就是说,组件可以成为发生鼠标事件的事件源。 1、MouseListener接口,使用MouseListener接口可以处理5种操作触发的鼠标事件: (1)在事件源上按下鼠标键。 (2)在事件源上释放鼠标键。 (3)在事件源上击鼠标键。 (4)鼠标进入事件源。 (5)鼠标退出事件源。 鼠标事件的类型是MouseEvent,即当发生鼠标事件时,MouseEvent类自动创建一个事件对象。,2、MouseListener接口中的方法: (1)mousePressed(MouseEvent) 负责处理在组件上按下鼠标触发的鼠标事件,当在组件上按下鼠标时,监视器将自动调用接口中的这个方法对事件作出处理。 (2)mouseReleased(MouseEvent) 负责处理在组件上释放鼠标触发的鼠标事件,当在组件上释放鼠标时,监视器将自动调用接口中的这个方法对事件作出处理。,(3)mouseEntered(MouseEvent) 负责处理鼠进入组件触发的鼠标事件,当鼠标进入组件上方时,监视器将自动调用接口中的这个方法对事件作出处理。 (4)mouseExited(MouseEvent) 负责处理鼠标离开组件触发的鼠标事件,当鼠标离开组件时,监视器自动调用接口中的这个方法对事件作出处理。 (5)mouseClicked(MouseEvent) 负责处理在组件上单击或连击鼠标触发的鼠标事件,当单击或连击鼠标时,监视器自动调用接口中的这个方法对事件作出处理。,3、MouseMotionListener接口 使用MouseMotionListener接口可以处理以下两种操作触发的鼠标事件: (1)在事件源上拖动鼠标。 (2)在事件源上移动鼠标。, MouseMotionListener接口中有如下方法: (1)mouseDragged(MouseEvent) 负责处理在组件上拖动鼠标触发的鼠标事件,当在组件上拖动鼠标时,监视器调用接口中的这个方法对事件作出处理。 (2)mouseMoved(MouseEvent) 负责处理在组件上运动鼠标触发的鼠标事件,当在组件上运动鼠标时,监视器调用接口中的这个方法对事件作出处理。,十、焦点事件,1、组件可以触发焦点事件。组件可以使用 public void addFocusListener(FocusListener listener)增加焦点事件监视器。 2、当组件获得焦点监视器后,如果组件从无输入焦点变成有输入焦点或从有输入焦点变成无输入焦点都会触发FocusEvent事件。创建监视器的类必须要实现FocusListener 接口,该接口

温馨提示

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

评论

0/150

提交评论