Java教材课件08.ppt_第1页
Java教材课件08.ppt_第2页
Java教材课件08.ppt_第3页
Java教材课件08.ppt_第4页
Java教材课件08.ppt_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

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

文档简介

1、第8章 图形用户界面应用,Graphical User Interface GUI,2,教学目的要求,了解Java语言中图形用户界面的构造与设计。 掌握其实现的基本原理和方法,达到能够设计具有图形用户界面程序的目的。 掌握用AWT来设计图形用户界面的方法,尤其是组件、容器、布局管理器等概念。 学习AWT事件处理模型,掌握事件源、事件、事件处理者等概念,让程序能够响应用户的操作。最后了解AWT各个组件的用法及所采用的事件处理接口。 通过技能训练,熟练掌握Java语言中图形用户界面程序的编写。,3,本讲内容,8.1 AWT 和 Swing 简介 8.2 布局管理 Layout Manager 8.

2、3 事件处理模型 8.4 常用组件的应用,4,8. 1 AWT和 Swing简介,它支持图形用户界面编程的功能包括: 用户界面组件; 事件处理模型; 图形和图像工具, 包括形状、颜色和字体类;,抽象窗口工具包 AWT ( Abstract Window Toolkit ) 是 API为Java 程序提供的建立图形用户界面GUI (Graphical User Interface)工具集, AWT 可用于Java 的 applet 和 applications 中。,布局管理器,可以进行灵活的窗口布局而与特定窗口的尺寸和屏幕分辨率无关; 数据传送类,可以通过本地平台的剪贴板来进行剪切和粘贴。,5

3、,8. 1 AWT和 Swing简介,java.awt包中包含了一个完整的类集以支持GUI程序的设计(重量级构件),图8.1,6,8.1.1 java.awt包,java.awt包中提供了GUI设计所使用的类和接口,可从图8.1中看到主要类之间的关系。 java.awt包提供了基本的java程序的GUI设计工具。主要包括下述三个概念: 组件Component 容器Container 布局管理器 LayoutManager,7,8.1.2 组件和容器,Java的图形用户界面的最基本组成部分是组件(Component) 组件是一个可以以图形化的方式显示在屏幕上并能与用户进行交互的对象,例如一个按钮

4、,一个标签等。组件不能独立地显示出来,必须将组件放在一定的容器中才可以显示出来。,8,类java.awt.Component 是许多组件类的父类,Component 类中封装了组件通用的方法和属性,如图形的组件对象、大小、显示位置、前景色和背景色、边界、可见性等,因此许多组件类也就继承了Component 类的成员方法和成员变量,相应的成员方法包括: getComponentAt(int x, int y)getFont() getForeground()getName()getSize()paint(Graphics g)repaint()update()setVisible(boolean

5、 b)setSize(Dimension d)setName(String name) 等,9,容器(Container)也是一个类,实际上是 Component 的子类,因此容器本身也是一个组件,具有组件的所有性质,但是它的主要功能是容纳其它组件和容器。 布局管理器(LayoutManager):每个容器都有一个布局管理器,当容器需要对某个组件进行定位或判断其大小尺寸时,就会调用其对应的布局管理器。 为了使我们生成的图形用户界面具有良好的平台无关性,Java语言中,提供了布局管理器这个工具来管理组件在容器中的布局,而不使用直接设置组件位置和大小的方式。,10,8.1.2 组件和容器,在程序中

6、安排组件的位置和大小时,应该注意以下两点: 1容器中的布局管理器负责各个组件的大小和位置,因此用户无法在这种情况下设置组件的这些属性。如果试图使用Java 语言提供的setLocation(),setSize(),setBounds() 等方法,则都会被布局管理器覆盖。 2如果用户确实需要亲自设置组件大小或位置,则应取消该容器的布局管理器,方法为:setLayout(null);,11,8.1.3 常用容器,容器 java.awt.Container 是 Component 的子类,一个容器可以容纳多个组件,并使它们成为一个整体。容器可以简化图形化界面的设计,以整体结构来布置界面。所有的容器都

7、可以通过 add()方法向容器中添加组件。 有三种类型的容器:Window、Panel、ScrollPane,常用的有Panel, Frame, Applet。,12,8.1.3 常用容器-Frame,import javax.swing.*; import java.awt.*; public class MyFrame extends JFrame public static void main(String args ) MyFrame fr = new MyFrame(你好!);/构造方法 fr.setSize(200,200); /设置Frame的大小,缺省为(0,0) fr.set

8、Visible(true); fr.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); public void paint(Graphics g) super.paint(g); g.drawString(你好!,50,50); public MyFrame (String str) super(str); /调用父类的构造方法 ,1Frame例:,13,import java.awt.*; import java.awt.event.*; public class MyFrame extends Frame public static void

9、 main(String args ) MyFrame fr = new MyFrame(你好!);/构造方法 fr.setSize(200,200); /设置Frame的大小,缺省为(0,0) fr.setBackground(Color.red); fr.setVisible(true); fr.addWindowListener(new WindowAdapter() public void windowClosing(WindowEvent e) System.exit(0); ); ,public void paint(Graphics g) g.drawString(你好!,50,

10、50); public MyFrame (String str) super(str); /调用父类的构造方法 ,14,8.1.3 常用容器-Frame,一般我们要生成一个窗口,通常是用 Window 的子类Frame 来进行实例化,而不是直接用到 Window 类。Frame的外观就像我们平常在 windows 系统下见到的窗口,有标题、边框、菜单、大小等等。每个Frame的对象实例化以后,都是没有大小和不可见的,因此必须调用setSize( )来设置大小,调用setVisible(true)来设置该窗口为可见的。 另外,AWT 在实际的运行过程中是调用所在平台的图形系统,因此同样一段AWT

11、程序在不同的操作系统平台下运行所看到的图形系统是不一样的: 在windows下运行,则显示的窗口是windows风格的窗口;而在UNIX下运行时,则显示的是UNIX风格的窗口。,15,8.1.3 常用容器,Panel Frame是带标题和边框的最顶层窗体; Panel是个最简单的容器类,它提供空间让程序放其它组件,包括其它Panel。 Panel是面板,无边框,一般把几个Panel加到一个Frame上,16, 简介,AWT是 swing的基础。AWT设计的初衷是支持开发小应用程序的简单用户界面。例如 AWT 缺少剪贴板、打印支持、键盘导航等特性,而且原来的AWT甚至不包括弹出式菜

12、单或滚动窗格等基本元素。AWT 组件均属重量组件。swing 组件几乎都是轻量组件。与重量组件相比,没有本地的对等组件。,8.1.4 swing简介,17, 简介,swing是由100% 纯 Java实现的,swing 组件是用 Java实现的轻量级( light-weight)组件,没有本地代码,不依赖操作系统的支持,这是它与 AWT 组件的最大区别。 swing在不同的平台上表现一致,并且有能力提供本地窗口系统不支持的其它特性。,18, 简介,swing采用了一种MVC的设计范式,即模型-视图-控制(Model-View-Controller),其中模型用来保存

13、内容,视图用来显示内容,控制器用来控制用户输入。 在 AWT 组件中,由于控制组件外观的对等类与具体平台相关,使得AWT 组件总是只有与本机相关的外观。swing使得程序在一个平台上运行时能够有不同的外观。用户可以选择自己习惯的外观。,19, swing 组件的多样化,swing是AWT的扩展,它提供了许多新的图形界面组件。swing组件以J开头,除了有与AWT类似的按钮(JButton)、标签(JLabel)、复选框(JCheckBox)、菜单(JMenu)等基本组件外,还增加了一个丰富的高层组件集合,如表格(JTable)、树(JTree)。,20, 使用图标(

14、Icon),与AWT的部件不同,许多Swing组件如按钮、标签,除了使用文字外,还可以使用图标修饰自己。,static Button btn = new Button(加); static JButton jbtn = new JButton(new ImageIcon(add.png); ,21, swing程序结构简介,Swing的程序设计一般可按照下列流程进行:1 引入swing包2 选择外观和感觉3 设置顶层容器4 设置按钮和标签5 向容器中添加组件6 在组件周围添加边界7 进行事件处理,22,8.2 布局管理,java为了实现跨平台的特性并且获得动态的布局效果,java

15、将容器内的所有组件安排给一个“布局管理器”负责管理,如:排列顺序,组件的大小、位置,当窗口移动或调整大小后组件如何变化等功能授权给对应的容器布局管理器来管理,不同的布局管理器使用不同算法和策略,容器可以通过选择不同的布局管理器来决定布局。 布局管理器主要包括: FlowLayout,BorderLayout,GridLayout,CardLayout,GridBagLayout,23,8.2.1 布局管理器 - FlowLayout,1. FlowLayoutFlowLayout 是 Panel,Applet 的缺省布局管理器。其组件的放置规律是从上到下、从左到右进行放置,如果容器足够宽,第一

16、个组件先添加到容器中第一行的最左边,后续的组件依次添加到上一个组件的右边,如果当前行已放置不下该组件,则放置到下一行的最左边。 当容器的大小发生变化时,用 FlowLayout 管理的组件会发生变化,其变化规律是:组件的大小不变,但是相对位置会发生变化。例如上图中有三个按钮都处于同一行,但是如果把该窗口变窄,窄到刚好能够放下一个按钮,则第二个按钮将折到第二行,第三个按钮将折到第三行。按钮Open本来在按钮OK的右边,但是现在跑到了下面,所以说组件的大小不变,但是相对位置会发生变化。,24,8.2.1 布局管理器-FlowLayout,构造方法主要下面几种: FlowLayout(FlowLay

17、out.RIGHT,20,40);/*第一个参数表示组件的对齐方式,指组件在这一行中的位置是居中对齐、居右对齐还是居左对齐,第二个参数是组件之间的横向间隔,第三个参数是组件之间的纵向间隔,单位是象素。*/ FlowLayout(FlowLayout.LEFT); /居左对齐,横向间隔和纵向间隔都是缺省值5个象素 FlowLayout(); /缺省的对齐方式居中对齐,横向间隔和纵向间隔都是缺省值5个象素 例: Frame f = new Frame(); f.setLayout(new FlowLayout();f.add(new Button(button1);f.add(new Button

18、( button2);f.add(new Button( button3);,25,8.2.2布局管理器-BorderLayout,BorderLayout 是 Frame/JFrame, Window,Dialog 和 JApplet 默认使用的布局管理器。 BorderLayout布局管理器把容器分成5个区域:North,South,East,West 和 Center,每个区域只能放置一个组件。,东西南北中边界布局管理器,26,在使用BorderLayout的时候,如果容器的大小发生变化,其变化规律为:组件的相对位置不变,大小发生变化。例如容器变高了,则North、South区域不变,W

19、est、Center、East区域变高;如果容器变宽了,West、East区域不变,North、Center、South区域变宽。不一定所有的区域都有组件,如果四周的区域(West、East、North、South区域)没有组件,则由Center区域去补充,但是如果Center区域没有组件,则保持空白。,27,import java.awt.*; import java.awt.event.*; import javax.swing.*; public class BorderLayoutDemo extends JFrame implements ActionListener private

20、 JButton buttons; private final String names = 藏北方钮 Hide North, 藏南方钮 Hide South, 藏东方钮 Hide East, 藏西方钮 Hide West, 藏中央钮 Hide Center ; private BorderLayout layout;,28,/ 设置好图形用户界面 GUI 和事件处理器 public BorderLayoutDemo() super( BorderLayout Demo ); layout = new BorderLayout( 5, 5 ); /按钮横纵间隙均 5 像素 / 获得容器,并设置

21、好布局管理器 Container container = getContentPane(); container.setLayout( layout ); / 初始化按钮数组 buttons = new JButton names.length ;,29,for ( int count = 0; count names.length; count+ ) buttons count = new JButton( names count ); buttons count .addActionListener( this ); / place buttons in BorderLayout; ord

22、er not important container.add( buttons 0 , BorderLayout.NORTH ); container.add( buttons 1 , BorderLayout.SOUTH ); container.add( buttons 2 , BorderLayout.EAST ); container.add( buttons 3 , BorderLayout.WEST ); container.add( buttons 4 , BorderLayout.CENTER ); setSize( 500, 200 ); setVisible( true )

23、; / BorderLayoutDemo的构造方法完,30,/ 处理按钮事件 public void actionPerformed( ActionEvent event ) for ( int count = 0; count buttons.length; count+ ) if ( event.getSource() = buttons count ) buttons count .setVisible( false ); else buttons count .setVisible( true ); / 容器从新布局 layout.layoutContainer( getContent

24、Pane() ); public static void main( String args ) BorderLayoutDemo application = new BorderLayoutDemo(); application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); / 类 BorderLayoutDemo 定义完,31,8.2.3布局管理器-GridLayout,使容器中各个组件呈网格状布局,平均占据容器的空间。 Frame f = new Frame(GridLayout);f.setLayout(new GridLayout

25、(3,2); /容器平均分成3行2列共6格f.add(new Button(1); /添加到第一行的第一格f.add(new Button(2); /添加到第一行的下一格 .f.add(new Button(6); /添加到第二行的第三格,网格布局管理器,Li8_04.java,32,8.2.4 布局管理器-CardLayout,CardLayout布局管理器能够帮助用户处理两个以至更多的成员共享同一显示空间,它把容器分成许多层,每层的显示空间占据整个容器的大小,但是每层只允许放置一个组件,当然每层都可以利用Panel来实现复杂的用户界面。牌布局管理器(CardLayout)就象一副叠得整整齐

26、齐的扑克牌一样,有54张牌,但是你只能看见最上面的一张牌,每一张牌就相当于牌布局管理器中的每一层。,卡片(纸牌)布局管理器,33,import java.awt.*; public class Manager public static void main(String args) Frame f = new Frame(GUI); Button bw=new Button(West); Button bc=new Button(Work space region); f.add(bw,West); f.add(bc,Center); Panel p = new Panel(); f.add(

27、p,North); Button bfile= new Button(File); Button bhelp= new Button(Help); p.add(bfile); p.add(bhelp); f.pack(); f.setVisible(true); f.setSize(400,200); ,BorderLayout 是Frame默认的布局管理器,/建立一个子容器,34,8.2布局管理器小结:,Frame是一个顶级窗口。Frame 的 缺省布局管理器为BorderLayout。 Panel 无法单独显示,必须添加到某个容器中。 Panel 的缺省布局管理器为 FlowLayout。

28、 当把Panel 作为一个组件添加到某个容器中后,该 Panel 仍然可以有自己的布局管理器。因此,可以利用Panel 使得BorderLayout 中某个区域显示多个组件,达到设计复杂用户界面的目的 。 如果采用无布局管理器 setLayout(null),则必须使用setLocation(), setSize(), setBounds()等方法手工设置组件的大小和位置,此方法会导致平台相关。,35,8. 3 事件处理,要能够让图形界面接收用户的操作,就必须给各个组件加上事件处理机制。在事件处理的过程中,主要涉及三类对象: Event-事件,用户对界面操作在java语言上的描述,以类的形式出

29、现,例如键盘操作对应的事件类是KeyEvent。 Event Source-事件源,事件发生的场所,通常就是各个组件,例如按钮Button。 Event handler-事件处理者,接收事件对象并对其进行处理的对象。,36,事件及处理机制,组件(事件发生者)触发一个相应类型的事件 此事件由相应类型的Listener(事件监听者) 接收并处理,37,事件及处理机制,调用按扭的 addActionListener ( ) 方法,为该按扭指定监听者。,38,import java.awt.*; import java.awt.event.*; public class Li8_06 extends

30、Frame implements ActionListener Color c=Color.red,Color.green,Color.blue,Color.cyan,Color.gray,Color.pink; int index=0; static Li8_06 frm=new Li8_06(); static Button btn=new Button(请单击!); public static void main(String args) btn.addActionListener(frm); frm.setLayout(new FlowLayout(); frm.setTitle(事件

31、测试窗口); frm.setSize(300,200); frm.add(btn); frm.setVisible(true); public void actionPerformed(ActionEvent e) frm.setBackground(cindex+%c.length); frm.addWindowListener(new WindowAdapter() public void windowClosing(WindowEvent e) System.exit(0); ); ,/窗口适配器,39,40,import java.awt.*; import javax.swing.*

32、; import java.awt.event.*; import javax.imageio.*; import java.io.*; public class ButtonTest extends JFrame int index = 0; Image img = new Image20; Button btn= new Button20; String name= 仇海英-王慎,张桂林-刘军,王晓阳-刘赟, 王恒彬-刘嘉琦,张瑞娟-王泽,吴晖-田园园1,吴晖-田园园2, 吴晖-田园园3, 王淼-张文杰,许静文-冀斌斌,张永博-郭淼, 郑银光-马靖渊,郑银光-马靖渊1,郑银光-马靖渊2,

33、李尚-柳桂媛,崔智华-何慕婷,陈新芳-裘洁, 赵敬-万丽芳,张晓博-李国伟,王飞-锁春龙;,41,public ButtonTest() super( Button Test 按钮测试 ); Panel jp = new Panel(); jp.setLayout(new GridLayout(20,1); MyDrawing md = new MyDrawing(); for (int i=0; i20; i+) try imgi= ImageIO.read(new File(i+1) + .png); catch(IOException e) btni = new Button(namei

34、); btni.addActionListener(new ActionListener() public void actionPerformed(ActionEvent e) for (int j=0;j20;j+) if (e.getSource()= btnj) index = j; break; repaint(); ); jp.add(btni); ,42,Container container = getContentPane(); container.add(md,BorderLayout.CENTER); container.add( jp,BorderLayout.EAST

35、 ); setSize( 1150, 780 ); setVisible( true ); class MyDrawing extends JPanel /内部类 public void paint(Graphics g) g.drawImage(imgindex,0,0,this); /index 是外部类的属性 public static void main( String args ) ButtonTest ap = new ButtonTest(); ap.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); / end class Bot

36、tonTest,43,R_Slider = new JSlider( SwingConstants.HORIZONTAL, 0, 255, 255 );,44,r = new JLabel(红(RGB):0); R_Slider = new JSlider( SwingConstants.HORIZONTAL, 0, 255, 255 ); R_Slider.setMajorTickSpacing( 10 ); R_Slider.setPaintTicks( true ); R_Slider.addChangeListener(this); /注册拉条的变动监听器,建立一个水平的带刻度的拉条,

37、45,javax.swing.event 接口 ChangeListener,46,8.3.4 事件适配器,Java语言为一些 Listener 接口提供了适配器(Adapter)类。可以通过继承事件所对应的 Adapter 类,重写需要方法,无关方法不用实现。事件适配器为我们提供了一种简单的实现监听器的手段, 可以缩短程序代码。但是,由于java的单一继承机制,当需要多种监听器或此类已有父类时,就无法采用事件适配器了。,47,8.3.4 事件适配器,1事件适配器-EventAdapter下例中采用了鼠标适配器:import java.awt.*;import java.awt.event.*

38、;public class MouseClickHandler extends MouseAdaperpublic void mouseClicked(MouseEvent e) /只实现需要的方法 java.awt.event包中定义的事件适配器类包括以下几个:1ComponentAdapter( 组件适配器) 2ContainerAdapter( 容器适配器) 3FocusAdapter( 焦点适配器) 4KeyAdapter( 键盘适配器) 5MouseAdapter( 鼠标适配器) 6MouseMotionAdapter( 鼠标运动适配器)7WindowAdapter( 窗口适配器),

39、48,8.3.4 事件适配器,2. 用内部类实现事件处理内部类(inner class)是被定义于另一个类中的类,使用内部类的主要原因是由于: 一个内部类的对象可访问外部类的成员方法和变量,包括私有的成员。 实现事件监听器时,采用内部类、匿名类编程非常容易实现其功能。 编写事件驱动程序,内部类很方便。 注意:使用的内部类不能在静态方法(如main方法)中调用。,49,import java.awt.* ; import java.awt.event.*; public class InnerClass private Frame f; private TextField tf; public

40、InnerClass() f=new Frame(Inner classes example); tf=new TextField(30); public void launchFrame() Label label=new Label(按下并拖拉鼠标); f.add(label,BorderLayout.NORTH); f.add(tf,BorderLayout.SOUTH); /*参数为内部类对象*/ f.addMouseMotionListener(new MyMouseMotionListener(); f.setSize(300,200); f.setVisible(true); ,

41、Li8_08,50,class MyMouseMotionListener extends MouseMotionAdapter /*内部类开始*/ public void mouseDragged(MouseEvent e) String s=Mouse dragging: x=+e.getX()+Y=+e.getY(); tf.setText(s); public static void main(String args) InnerClass obj=new InnerClass(); obj.launchFrame(); obj.f.addWindowListener(new Wind

42、owAdapter() public void windowClosing(WindowEvent e) System.exit(0); ); ,51,3匿名类(Anonymous Class)当一个内部类的类声名仅在创建此类对象时用一次,而且要产生的新类需继承于一个已有的父类或实现一个接口,才能考虑用匿名类。由于匿名类本身无名,因此它也就不存在构造方法,它需要显示地调用一个无参的父类的构造方法,并且重写父类的方法。所谓的匿名就是该类连名字都没有,只是显示地调用一个无参的父类的构造方法。 addMouseListener(new MouseAdapter() public void mouseClicked(MouseEvent e) x=e.getX(); y=e.getY(); repaint(); );/匿名类结束,52,8.4 常用组件的应用,标签 (label) 是用户不能修改只能查看其内容的文本显示区域,它起到信息说明的作用,每个标签用一个Label类的对象表示。 按钮(Button)是最常用的

温馨提示

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

评论

0/150

提交评论