《编写图形界面应用程序.ppt》由会员分享,可在线阅读,更多相关《编写图形界面应用程序.ppt(73页珍藏版)》请在三一办公上搜索。
1、1,第九章 编写图形界面应用程序,9.1关于Swing9.2Swing组件和容器9.3布局管理器9.4 事件处理 9.5 绘画与动画显示,2,9.1 关于Swing,1.Swing:是第二代GUI开发工具 它建立在AWT之上,但用新版本的组件替代了旧版本的组件。它提供了许多新的组件和相关的API,第九章 编写图形界面应用程序,3,9.1 关于Swing,2.The Swing API 发布在:JDK1.2 JFC1.1(for use with JDK1.1)3.The Swing API 功能是强大的,灵活的和广泛的。例如 JFC 1.1 有 15 public packages。我们经常用
2、的有两个包:javax.swing javax.swing.event注:AWT components 在 java.awt package 中,第九章 编写图形界面应用程序,4,9.2 Swing组件和容器,9.2.1 样题分析:9.2.2 Swing Components 分类9.2.3 顶层容器9.2.4 Frame9.2.6 Dialog9.2.7 panel9.2.8 创建菜单:9.2.9 JComponent Class,第九章 编写图形界面应用程序,5,9.2 Swing组件和容器,SwingApplication 创建了四个常用的 Swing components:a fram
3、e,or main window(JFrame)a panel(JPanel)a button(JButton)a label(JLabel),第九章 编写图形界面应用程序,9.2.1.样题分析:,6,9.2 Swing组件和容器,容器与组件包含继承关系图表:,第九章 编写图形界面应用程序,7,9.2 Swing组件和容器,9.2.2 Swing Components 分类:顶层容器:中间容器:原子组件见显示样本,第九章 编写图形界面应用程序,8,9.2 Swing组件和容器,9.2.3 顶层容器java 提供了三个顶层容器:JFrame,JDialog,和 JApplet。,第九章 编写图形
4、界面应用程序,9,9.2 Swing组件和容器,9.2.3 顶层容器特点:显示在屏幕上的每个组件都必须在一个包含继承中。每一个包含继承都有一个顶层容器作为它的根。每一个一个顶层容器都有一个content pane,它包含了顶层容器中的所有组件菜单在顶层容器中,但在content pane 之外。,第九章 编写图形界面应用程序,10,9.2 Swing组件和容器,9.2.3 顶层容器包含继承图如下:,第九章 编写图形界面应用程序,11,9.2 Swing组件和容器,9.2.3 顶层容器在Content Pane 中添加组件 有两种方式:topLevelContainer.getContentPa
5、ne().add(yellowLabel,BorderLayout.CENTER);或:JPanel contentPane=new JPanel();topLevelContainer.setContentPane(contentPane);,第九章 编写图形界面应用程序,12,9.2 Swing组件和容器,9.2.3 顶层容器2.添加菜单条 JMenuBar cyanMenuBar=new JMenuBar();frame.setJMenuBar(cyanMenuBar);,第九章 编写图形界面应用程序,13,9.2 Swing组件和容器,9.2.4 Frame是一个带有标题和可变大小边框
6、的窗口。任何一个图形界面应用程序都必须至少有一个JFrame.见例题:FrameDemo.java TopLevelDemo.java.,第九章 编写图形界面应用程序,14,9.2 Swing组件和容器,9.2.7 panel为其它组件提供一个容器。便于组织和显示组件。还可以包含子panel见例题:MyPanel.java,第九章 编写图形界面应用程序,15,9.2 Swing组件和容器,9.2.8 创建菜单:步骤:1.创建一个 MenuBar 对象,将其加入一个菜单容器,例如:Frame.2.创建 一个或多个Menu 对象,将其加入menu bar 对象.3.创建 一个或多个MenuItem
7、 objects,对象,将其加入相应的menu object.,第九章 编写图形界面应用程序,16,9.2 Swing组件和容器,9.2.8 创建菜单:JFrame f=new JFrame(Menu);JMenuBar mb=new JMenuBar();JMenu m1=new JMenu(File);JMenu m2=new JMenu(Edit);JMenu m3=new JMenu(Help);mb.add(m1);mb.add(m2);f.setMenuBar(mb);JMenuItem mi1=new JMenuItem(New);JMenuItem mi2=new JMenuI
8、tem(Save);JMenuItem mi3=new JMenuItem(Load);JMenuItem mi4=new JMenuItem(Quit);m1.add(mi1);m1.add(mi2);m1.add(mi3);m1.addSeparator();m1.add(mi4);,第九章 编写图形界面应用程序,17,9.2 Swing组件和容器,9.2.9 JComponent Class 除了顶层容器,Swing中所有组件(中间容器和原子组件)都从Jcomponent类中继承。例如:JPanel,JScrollPane,JButton,JTable(以J开头的组件类)。Compone
9、ntContainerJComponent,第九章 编写图形界面应用程序,18,9.2 Swing组件和容器,9.2.9 JComponent Class JComponent Class API:它从Component and Container 继承了许多方法,同时也提供了一些新的方法。它为它的继承者提供了如下常用功能:Customizing Component Appearance Setting Component State Handling Events Painting Components Dealing with the Containment Hierarchy Layin
10、g Out Components Getting Size and Position Information Specifying Absolute Size and Position 具体方法见表,第九章 编写图形界面应用程序,19,9.3 布局管理器,FlowLayout BorderLayout BoxLayout GridLayout GridBagLayout,第九章 编写图形界面应用程序,20,9.3 布局管理器,使用布局管理器的一般原则:当创建 JPanel 或 添加 components 到一个 content pane 时,需要考虑使用布局管理器。其他的中间容器不需要考虑布局
11、管理器。,第九章 编写图形界面应用程序,21,9.3 布局管理器,BorderLayout是顶层容器(JFrame,JDialog,和 JApplet)的默认布局管理器。有五个位置组件:,第九章 编写图形界面应用程序,22,9.3 布局管理器,BorderLayout见例题:BorderWindow.java,第九章 编写图形界面应用程序,23,9.3 布局管理器,BorderLayout当调整窗口大小时:,第九章 编写图形界面应用程序,24,9.3 布局管理器,.FlowLayoutpanel 类的默认布局管理器。组件按照加入的先后循序从左向右排列,一行排满后之后就下转到下一行继续从左至右排
12、列 每一行中的组件都居中排列 使用components的preferred sizes,第九章 编写图形界面应用程序,25,9.3 布局管理器,.FlowLayout当调整窗口大小时:,第九章 编写图形界面应用程序,26,9.3 布局管理器,.FlowLayout见例题:FlowWindow.java,第九章 编写图形界面应用程序,27,9.3 布局管理器,.GridLayout基本布局策略是把容器的空间划分成若干行乘若干列的网格区域,组件就位于这些划分出来的小区域中。所有的区域大小一样。组件按从左到右,从上到下的方法加入。用构造函数划分出网格的行数和列数,new GridLayout(行数,
13、列数)。,第九章 编写图形界面应用程序,28,9.3 布局管理器,.GridLayout当调整窗口大小时:,第九章 编写图形界面应用程序,29,9.3 布局管理器,.GridLayout见例题:GridWindow.java.,第九章 编写图形界面应用程序,30,9.3 布局管理器,4.BoxLayout 组件按从左到右或从上到下的方法加入考虑components的对齐and minimum,preferred,and maximum sizes 见例题:BoxWindow.java,第九章 编写图形界面应用程序,31,9.3 布局管理器,4.BoxLayout X alignments 和m
14、aximum size X alignment of 0.0(Component.LEFT_ALIGNMENT)X alignment of 0.5(Component.CENTER_ALIGNMENT).X alignment of 1.0(Component.RIGHT_ALIGNMENT),第九章 编写图形界面应用程序,32,9.3 布局管理器,4.BoxLayout 使用隐形Components作为填充。,第九章 编写图形界面应用程序,33,9.3 布局管理器,4.BoxLayout 使用隐形Components作为填充。Rigid area Box.createRigidArea(s
15、ize)container.add(firstComponent);container.add(Box.createRigidArea(new Dimension(5,0);container.add(secondComponent);,第九章 编写图形界面应用程序,34,9.3 布局管理器,4.BoxLayout 使用隐形Components作为填充。Glue:horizontal Box.createHorizontalGlue()vertical Box.createVerticalGlue()container.add(firstComponent);container.add(Box
16、.createHorizontalGlue();container.add(secondComponent);,第九章 编写图形界面应用程序,35,9.3 布局管理器,4.BoxLayout 组件对齐一般来说:所有top-to-bottom BoxLayout object 应该有相同的 X alignment。所有left-to-right Boxlayout应该有相同的 Y alignmentsetAlignmentX和setAlignmentY 可以实现对齐。大部分组件是center X and Y alignment,而buttons,combo boxes,labels,and me
17、nu items 是LEFT_ALIGNMENT,第九章 编写图形界面应用程序,36,9.3 布局管理器,4.BoxLayout 例子:button1.setAlignmentY(Component.BOTTOM_ALIGNMENT);button2.setAlignmentY(Component.BOTTOM_ALIGNMENT);,第九章 编写图形界面应用程序,37,9.3 布局管理器,4.BoxLayout 例子:label.setAlignmentX(Component.CENTER_ALIGNMENT);,第九章 编写图形界面应用程序,38,9.3 布局管理器,GridBagLayo
18、ut是在GridLayout的基础上发展起来的 为每个组件指定其包含的网格个数 组件可以保留原来的大小 可以以任意顺序加入容器的任意位置,第九章 编写图形界面应用程序,39,9.3 布局管理器,GridBagLayout,第九章 编写图形界面应用程序,40,9.3 布局管理器,GridBagLayout通过创建一个gridBagConstraints实例为组件设置布局参数:gridx,gridy gridwidth,gridheight fillipadx,ipady insets anchorCENTER(the default),NORTH,NORTHEAST,EAST,SOUTHEAST
19、,SOUTH,SOUTHWEST,WEST,and NORTHWEST.weightx,weighty,第九章 编写图形界面应用程序,41,9.3 布局管理器,GridBagLayout见例题:GridBagWindow.java如果没有设fill 参数:,第九章 编写图形界面应用程序,如果没有组件设weightx参数:,42,9.3 布局管理器,综合例子:,第九章 编写图形界面应用程序,43,9.3 布局管理器,综合例子:,第九章 编写图形界面应用程序,44,9.3 布局管理器,综合例子:,第九章 编写图形界面应用程序,45,9.4 事件处理,概念实现事件处理的方法Adapters Clas
20、sesInner Classes anonymous inner classSwing Components 支持的Listeners Listener API 总结:,第九章 编写图形界面应用程序,46,9.4 事件处理,第九章 编写图形界面应用程序,1.概念Events:是一个事件对象,描述了发生的事件和时间源。它一般是EventObject 类的子类对象。Event sources:产生事件的对象。典型的是组件。Event handlers:是一个方法,用来接收事件对象,分析并处理事件,实现用户交互。,47,9.4 事件处理,1.概念An event 能够送给多个 event handl
21、ers一个Event handler可以监听多个组件产生的事件。,第九章 编写图形界面应用程序,48,9.4 事件处理,2.实现事件处理的方法:首先创建一个处理事件的类,该类要么执行一个listener interface,要么继承一个执行listener interface的类。public class MyClass implements ActionListener 将事件处理类的实例做为一个listener 加到一个或多个组件中。someComponent.addActionListener(instanceOfMyClass);编写实现 listener interface中的方法。
22、.public void actionPerformed(ActionEvent e)./code that reacts to the action.,第九章 编写图形界面应用程序,49,9.4 事件处理,例题:例题1:Beeper.java例题2:MultiListener.java,第九章 编写图形界面应用程序,50,9.4 事件处理,第九章 编写图形界面应用程序,说明:EventObject 类定义了一个非常有用的方法:Object getSource(),51,9.4 事件处理,3.Adapters Classes 很多listener interfaces 包含多个方法。例如:Mo
23、useListener interface 包含五个方法::mousePressed,mouseReleased,mouseEntered,mouseExited,and mouseClicked.见例题:TwoListener.javaAdapter作用:每个拥有超过一个方法的Listener接口都可拥有Adapter,每个Adapter为每个接口方法提供默认的方法。,第九章 编写图形界面应用程序,52,9.4 事件处理,3.Adapters Classes 这样我们可以通过继承adapter,只重写我们感兴趣的方法,来定义 我们的listener classes。例子:import jav
24、a.awt.*;import java.awt.event.*;public class MouseClickHandler extends MouseAdapter public void mouseClicked(MouseEvent e)/Do stuff with the mouse click.,第九章 编写图形界面应用程序,53,9.4 事件处理,4.Inner Classes 例如:public class MyClass extends Applet.someObject.addMouseListener(new MyAdapter();.class MyAdapter ext
25、ends MouseAdapter public void mouseClicked(MouseEvent e)./Event handler implementation goes here.,第九章 编写图形界面应用程序,54,9.4 事件处理,anonymous inner class/An example of using an anonymous inner class.public class MyClass extends Applet.someObject.addMouseListener(new MouseAdapter()public void mouseClicked(M
26、ouseEvent e)./Event handler implementation goes here.);.见例题:SwingApplication.java,第九章 编写图形界面应用程序,55,9.4 事件处理,第九章 编写图形界面应用程序,6.Swing Components 支持的Listeners Swing Components 支持的Listeners:因为所有Swing components 继承 AWT Component class,所以都支持如下listenercomponent listener,focus listener,key listener,mouse ev
27、ents,mouse-motion events 我们尽可能不要写低层事件Swing Components 支持的其它Listeners:见eventsandcomponents.html,56,9.4 事件处理,7.Listener API 总结:见:EventAPI.html,第九章 编写图形界面应用程序,57,9.5 绘画与动画显示,9.5.1 java 是如何实现绘画的9.5.2 用户自定义绘画9.2.3 绘制简单图形和文字9.2.4 使用图象9.2.5 实现动画,第九章 编写图形界面应用程序,58,9.5 绘画与动画显示,9.5.1 java 是如何实现绘画的Painting开始于顶
28、层容器,按包含继承关系依次进行。例如:,第九章 编写图形界面应用程序,59,9.5 绘画与动画显示,9.5.1 java 是如何实现绘画的,第九章 编写图形界面应用程序,60,9.5 绘画与动画显示,9.5.2 用户自定义绘画首先确定选择继承哪个父类。常用的有:JPanel,Jlabel实现绘画的代码应该在paintComponent 方法中。可以为自定义的componet加一个border。,第九章 编写图形界面应用程序,61,9.5 绘画与动画显示,9.5.2 用户自定义绘画首先看一道例题:ImageDisplayer.java说明:super.paintComponent 用来画图的背景
29、,第九章 编写图形界面应用程序,62,9.5 绘画与动画显示,9.5.2 用户自定义绘画repaint 方法作用:请求安排重新画该componet.有两种形式:void repaint()见例题:PointPaint.javavoid repaint(int,int,int,int),第九章 编写图形界面应用程序,63,9.5 绘画与动画显示,9.5.2 用户自定义绘画repaint中定义的重画区域传递给paintComponent方法中的 Graphics对象。该对象通过getClipBounds 方法获得重画区域。例如:public void paintComponent(Graphics
30、 g)Rectangle clipRect=g.getClipBounds();if(clipRect!=null)/Top-leftmost point=(clipRect.x,clipRect.y)/Width,height=clipRect.width,clipRect.height else/Paint the entire component.,第九章 编写图形界面应用程序,64,9.5 绘画与动画显示,9.2.3 绘制简单图形和文字绘制图形:绘制文字:g.drawString例如:g.drawString(Hello World!,x,y);,第九章 编写图形界面应用程序,65,9
31、.5 绘画与动画显示,9.2.4 使用图象在AWT 中 图象用java.awt.Image 对象来表示。支持两种图象文件:GIF and JPEG 只要知道filename or URL,就可以使用 Applet or Toolkit 的getImage 方法。,第九章 编写图形界面应用程序,66,9.5 绘画与动画显示,第九章 编写图形界面应用程序,9.2.4 使用图象调用图象:使用 Toolkit class 的 getImage 方法:Image getImage(URL url)Image getImage(String filename)例如:Toolkit toolkit=Tool
32、kit.getDefaultToolkit();Image image1=toolkit.getImage(imageFile.gif);Image image2=toolkit.getImage(new URL(http:/,67,9.5 绘画与动画显示,第九章 编写图形界面应用程序,9.2.4 使用图象调用图象:使用 Applet 的 getImage 方法:Image getImage(URL url)Image getImage(URL url,String name)例如:Image image1=getImage(getCodeBase(),imageFile.gif);Image
33、 image2=getImage(getDocumentBase(),anImageFile.jpeg);Image image3=getImage(new URL(http:/,68,9.5 绘画与动画显示,9.2.4 使用图象显示图象:boolean drawImage(Image img,int x,int y,ImageObserver observer)boolean drawImage(Image img,int x,int y,int width,int height,ImageObserver observer)boolean drawImage(Image img,int x
34、,int y,Color bgcolor,ImageObserver observer)boolean drawImage(Image img,int x,int y,int width,int height,Color bgcolor,ImageObserver observer),第九章 编写图形界面应用程序,69,9.5 绘画与动画显示,9.2.5 实现动画使用Timer实现动画循环实现一个图象在屏幕上运动显示一系列图象,第九章 编写图形界面应用程序,70,9.5 绘画与动画显示,9.2.5 实现动画使用Timer实现动画循环凡是需要有规律的间歇地显示动画的程序,均需要编写动画循环。Ti
35、mer是实现动画循环的最好方法。,第九章 编写图形界面应用程序,71,9.5 绘画与动画显示,9.2.5 实现动画使用Timer实现动画循环创建和初始化TimerTimer(int,ActionListener)void setDelay(int)int getDelay()void setInitialDelay(int)int getInitialDelay()void setRepeats(boolean)boolean isRepeats()void setCoalesce(boolean)boolean isCoalesce(),第九章 编写图形界面应用程序,运行Timervoid start()void restart()void stop()boolean isRunning()见例题:AnimatorApplicationTimer.java,72,9.5 绘画与动画显示,9.2.5 实现动画2.显示一系列图象实现关键:在每次Timer间歇后重新运行时,通过repaint()方法画一个新的图片paintComponent(Graphics g)方法中画每次计算出一个新画图片来画。见例题:ImageSequenceTimer.java,第九章 编写图形界面应用程序,73,作 业,第九章作业,