《LESSON10(GUI设计).ppt》由会员分享,可在线阅读,更多相关《LESSON10(GUI设计).ppt(63页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第十章GUIGUI应用程序设计应用程序设计1接口(interface)接口就是方法定义和常量值的集合。从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和抽象方法的定义,而没有变量和方法的实现。2接口的作用通过接口可以实现不相关类的相同行为,而不需要考虑这些类之间的层次关系。通过接口可以指明多个类需要实现的方法。通过接口可以了解对象的交互界面,而不需了解对象所对应的类。3接口的定义public interface interfaceName extends listOfSuperInterface /常量定义和方法定义4接口定义举例interface Collection int MA
2、X_NUM=100;void add(Object obj);void delete(Object obj);Object find(Object obj);int currentCount();5接口的实现用implements子句来表示一个类使用某个接口。在类体中可以使用接口中定义的常量,而且必须实现接口中定义的所有方法。一个类可以实现多个接口,在implements子句中用逗号分隔。6class FIFOQueue implements Collectionvoid add(Object obj)void delete(Object obj)Object find(Object obj)
3、int currentCount接口实现举例7本章内容Java抽象窗口工具集(AWT)Java组件Java容器布局管理器及其使用GUI事件处理创建菜单JFC和Swing介绍8抽象窗口工具集(AWT)AWT-AbstractWindow Toolkit GUI-Graphical User InterfaceAWT中定义了多种类和接口,用于在Java Application/Applet中进行GUI设计java程序要显示的GUI组件必须是抽象类Component或MenuComponent的子类9java.awt 包java.awt包提供了基本的java程序GUI设计工具。ComponentCo
4、ntainerLayoutManagerAWTEventMenuComponent10AWT包包的的类类层层次次结结构构11组件(Component)Java的图形用户界面的最基本组成部分是组件,组件是一个可以以图形化的方式显示在屏幕上并能与用户进行交互的对象,例如一个按钮,一个标签等。组件不能独立地显示出来,必须将组件放在一定的容器中才可以显示出来。12Component类抽象类Component是所有Java GUI组件的共同父类。Component类规定了所有GUI组件的基本特性,该类中定义的方法实现了作为一个GUI部件所应具备的基本功能。Component类(及其子类)中常用的属性和对
5、应的操作属性的方法见下页表格 13Component及其子类常用属性和方法属性名称属性名称 设置属性的方法设置属性的方法 获取属性的方法获取属性的方法背景颜色背景颜色setBackground(Color)Color getBackground()边界边界setBounds(Rectangle)setBounds(int,int,int,int)Rectangle getBounds()光标光标setCursor(Cursor)Cursor getCursor()字体字体setEnabled(boolean)Font getFont()前景色前景色setFont(Font)Color getF
6、oreground()地区地区setLocale(Locale)Locale getLocale()位置位置setLocation(Point)setLocation(int,int)Pont getLocation()Point getLocationOnScreen()部件名称部件名称setName(String)String getName()尺寸尺寸setSize(Dimension)Dimension getSize()可见性可见性setVisible(boolean)boolean getVisible()14AWT基本组件图15容 器(Container)容器(Container
7、)实际上是Component的子类,因此容器类对象本身也是一个组件,具有组件的所有性质,另外还具有容纳其它组件和容器的功能。容器类对象可使用方法add()添加组件两种主要的容器类型Window:可自由停泊的顶级窗口Panel(面板):可作为容器容纳其它组件,但不能独立存在,必须被添加到其它容器中(如Window 或 Applet)16组件定位Java组件在容器中的位置和尺寸由布局管理器决定如要人工控制组件在容器中的大小位置,可取消布局管理器,然后使用Component类的下述成员方法:setLocation()setSize()setBounds()17Frame类Frame类是抽象类Wind
8、ow的子类Frame对象显示效果是一个“窗口”,带有标题和尺寸重置角标默 认 初 始 化 为 不 可 见 的,可 使 用setVisible(true)方法使之变为可见默认的布局管理器是BorderLayout可使用setLayout()方法改变其默认布局管理器18Frame类类继承层次继承层次java.lang.Object|+-java.awt.Component|+-java.awt.Container|+-java.awt.Window|+-java.awt.Frame19Frame 应用举例 import java.awt.*;public class FrameExample pr
9、ivate Frame f;public FrameExample()f=new Frame(Hello Out There!);public void launchFrame()f.setSize(170,170);f.setBackground(Color.blue);f.setVisible(true);public static void main(String args)FrameExample guiWindow=new FrameExample();guiWindow.launchFrame();20Panel类 提供容纳组件的空间 可以采用和所在容器不同的布局管理器 Panel
10、类的继承层次java.lang.Object|+-java.awt.Component|+-java.awt.Container|+-java.awt.Panel21FrameWithPanel应用举例import java.awt.*;public class FrameWithPanel private Frame f;private Panel pan;public FrameWithPanel(String title)f=new Frame(title);pan=new Panel();public void launchFrame()f.setSize(200,200);f.set
11、Background(Color.blue);f.setLayout(null);/取消默认的布局管理器取消默认的布局管理器 pan.setSize(100,100);pan.setBackground(Color.yellow);f.add(pan);f.setVisible(true);public static void main(String args)FrameWithPanel guiWindow=new FrameWithPanel(Frame with Panel);guiWindow.launchFrame();22布局管理器为了使我们生成的图形用户界面具有良好的平台无关性,
12、Java语言中,提供了布局管理器这个工具来管理组件在容器中的布局,而不使用直接设置组件位置和大小的方式。每个容器都有一个布局管理器,当容器需要对某个组件进行定位或判断其大小尺寸时,就会调用其对应的布局管理器。23容器布局(Container Layouts)FlowLayout (流)BorderLayout (边界)GridLayout (栅格)CardLayout (卡片)24默认布局管理器WindowPanelFrameDialogAppletBorderLayoutFlowLayoutComponentContainer25FlowLayout布局管理器FlowLayout是Panel
13、类的默认布局管理器FlowLayout布局对组件逐行定位,行内从左到右,一行排满后换行默认对齐方式为居中对齐不改变组件的大小,按组件原有尺寸显示组件,可在构造方法中设置不同的组件间距、行距及对齐方式26FlowLayout 举例import java.awt.*;public class FlowExample private Frame f;private Button button1,button2,button3;public FlowExample()f=new Frame(Flow Layout);button1=new Button(Ok);button2=new Button(O
14、pen);button3=new Button(Close);public void launchFrame()f.setLayout(new FlowLayout();f.add(button1);f.add(button2);f.add(button3);f.setSize(100,100);f.setVisible(true);public static void main(String args)FlowExample guiWindow=new FlowExample();guiWindow.launchFrame();27FlowLayout 的构造方法new FlowLayout
15、(FlowLayout.RIGHT,20,40);右对齐,组件之间水平间距20个像素,竖直间距40个像素;new FlowLayout(FlowLayout.LEFT);左对齐,水平和竖直间距为缺省值:5;new FlowLayout();使用缺省的居中对齐方式,水平和竖直间距为缺省值:5;28BorderLayout 布局管理器BorderLayout是Frame类的默认布局管理器BorderLayout将整个容器的布局划分成东、西、南、北、中五个区域,组件只能被添加到指定的区域29BorderLayout 布局管理器如不指定组件的加入部位,则默认加入到Center区域每个区域只能加入一个组
16、件,如加入多个,则先前加入的组件会被遗弃BorderLayout型布局容器尺寸缩放原则北、南两个区域只能在水平方向缩放(宽度可调整)东、西两个区域只能在垂直方向缩放(高度可调整)中部可在两个方向上缩放30BorderLayout举例import java.awt.*;public class BorderExample private Frame f;private Button bn,bs,bw,be,bc;public BorderExample()f=new Frame(Border Layout);bn=new Button(B1);bs=new Button(B2);bw=new B
17、utton(B3);be=new Button(B4);bc=new Button(B5);public void launchFrame()f.add(bn,BorderLayout.NORTH);/f.add(bn,“North”);f.add(bs,BorderLayout.SOUTH);/f.add(bs,“South”);f.add(bw,BorderLayout.WEST);f.add(be,BorderLayout.EAST);f.add(bc,BorderLayout.CENTER);f.setSize(200,200);f.setVisible(true);public st
18、atic void main(String args)BorderExample guiWindow2=new BorderExample();guiWindow2.launchFrame();31GridLayout 布局管理器GridLayout型布局管理器将布局划分成规则的矩形网格,每个单元格区域大小相等.组件被添加到每个单元格中,先从左到右添满一行后换行,再从上到下.在GridLayout构造方法中指定分割的行数和列数.new GridLayout(3,3);32GridLayout举例import java.awt.*;public class GridExample private
19、 Frame f;private Button b1,b2,b3,b4,b5,b6,b7;public GridExample()f=new Frame(Grid Example);b1=new Button(1);b2=new Button(2);b3=new Button(3);b4=new Button(4);b5=new Button(5);b6=new Button(6);b7=new Button(“7);public void launchFrame()f.setLayout(new GridLayout(3,3);f.add(b1);f.add(b2);f.add(b3);f.
20、add(b4);f.add(b5);f.add(b6);f.add(b7);f.pack();f.setVisible(true);public static void main(String args)GridExample grid=new GridExample();grid.launchFrame();33CardLayout 布局管理器CardLayout布局管理器能够帮助用户处理两个以至更多的成员共享同一显示空间,就好象一叠卡片摞在一起。注意:在一张卡片中只能显示一个组件,因此可以使用容器嵌套方法显示多个组件。34复杂的布局管理器举例import java.awt.*;public
21、 class ComplexLayoutExample private Frame f;private Panel p;private Button bw,bc;private Button bfile,bhelp;public ComplexLayoutExample()f=new Frame(GUI example 3);bw=new Button(West);bc=new Button(Work space region);bfile=new Button(File);bhelp=new Button(Help);public void launchFrame()f.add(bw,Bor
22、derLayout.WEST);f.add(bc,BorderLayout.CENTER);p=new Panel();p.add(bfile);p.add(bhelp);f.add(p,BorderLayout.NORTH);f.pack();/使使f尺寸紧凑化尺寸紧凑化 f.setVisible(true);public static void main(String args)ComplexLayoutExample gui=new ComplexLayoutExample();gui.launchFrame();35布局管理器总结(1)FrameFrame是一个顶级窗口。Frame的缺
23、省布局管理器为BorderLayout。PanelPanel无法单独显示,必须添加到某个容器中。Panel的缺省布局管理器为FlowLayout。当把Panel作为一个组件添加到某个容器中后,该Panel仍然可以有自己的布局管理器。因此,可以利用Panel使得BorderLayout中某个区域显示多个组件。36布局管理器总结(2)在程序中安排组件的位置和大小时,应注意:容器中的布局管理器负责各个组件的大小和位置,因此用户无法在这种情况下设置组件的这些属性。如果试图使用Java语言提供的setLocation(),setSize(),setBounds()等方法,则都会被布局管理器覆盖。如果用户
24、确实需要亲自设置组件大小或位置,则应取消该容器的布局管理器,方法为:setLayout(null);37布局管理器总结(3)setLayout(null)方法可以设置容器的布局管理器为空,即没有布局管理器。此时用户必须亲手为容器中的每个组件设置大小和显示位置,否则将无法看到这些组件。如果用户不设置布局管理器,那么该程序的显示效果将会与平台相关。38如何创建菜单1.首先创建一个MenuBar对象,并将其置于一个可容纳菜单的容器(如Frame对象)中。2.创建一个或多个Menu对象,并将它们添加到先前创建的MenuBar对象中。3.创建一个或多个MenuItem对象,再将其加入到各Menu对象中3
25、9创建 MenuBarimport java.awt.*;public class TestGreeting public static void main(String args)Frame f=new Frame(MenuBar);MenuBar mb=new MenuBar();f.setMenuBar(mb);f.setSize(200,150);f.setVisible(true);40创建 Menuimport java.awt.*;public class TestGreeting public static void main(String args)Frame f=new F
26、rame(Menu);MenuBar mb=new MenuBar();f.setMenuBar(mb);Menu m1=new Menu(File);Menu m2=new Menu(Edit);Menu m3=new Menu(Help);mb.add(m1);mb.add(m2);mb.setHelpMenu(m3);f.setSize(150,120);f.setVisible(true);41创建 MenuItempublic static void main(String args)Frame f=new Frame(Menu);MenuBar mb=new MenuBar();f
27、.setMenuBar(mb);Menu m1=new Menu(File);Menu m2=new Menu(Edit);Menu m3=new Menu(Help);mb.add(m1);mb.add(m2);mb.setHelpMenu(m3);MenuItem mi1=new MenuItem(New);MenuItem mi2=new MenuItem(Save);MenuItem mi3=new MenuItem(Load);MenuItem mi4=new MenuItem(Quit);m1.add(mi1);m1.add(mi2);m1.add(mi3);m1.addSepar
28、ator();m1.add(mi4);f.setSize(150,170);f.setVisible(true);42创建 CheckBoxMenuItempublic static void main(String args)Frame f=new Frame(Menu);MenuBar mb=new MenuBar();f.setMenuBar(mb);Menu m1=new Menu(File);Menu m2=new Menu(Edit);Menu m3=new Menu(Help);mb.add(m1);mb.add(m2);mb.setHelpMenu(m3);MenuItem m
29、i2=new MenuItem(Save);m1.add(mi2);CheckboxMenuItem mi5=new CheckboxMenuItem(Persistent);m1.add(mi5);f.setSize(150,170);f.setVisible(true);43GUIGUI事件处理事件处理Java事件和事件处理事件源、事件监听器、事件类型事件监听器接口和事件适配器44什么是事件事件(Event)一个对象,它描述了发生什么事情 事件源(Event source)产生事件的组件事件监听器或事件处理者(Event handler)能够接收、解析和处理事件,实现和用户交互的方法。Ac
30、tionEventactionPerformed(ActionEvent e)Some event handlerThe user clicks on the button45事件处理模型1如果关注某个组件产生的事件,则可以在该组件上注册适当的事件处理者-事件监听器。AWT的组件类中提供了注册和注销监听器的方法。addActionListener(ActionListener l)removeActionListener(ActionListener l)46事件处理模型2Java GUI设计中,通过注册监听器的方式对所关注的事件源进行监控。注册监听器时应指明该监听器监控(感兴趣)的事件种类。
31、当事件源发生了某种类型的事件时,只触发事先已就该种事件类型注册过的监听器。47事件处理举例(1)import java.awt.*;public class TestButton private Frame f;private Button b;public TestButton()f=new Frame(Test);b=new Button(Press Me!);b.setActionCommand(ButtonPressed);public void launchFrame()b.addActionListener(new ButtonHandler();f.add(b,BorderLay
32、out.CENTER);f.pack();f.setVisible(true);public static void main(String args)TestButton guiApp=new TestButton();guiApp.launchFrame();48事件处理举例(2)import java.awt.event.*;public class ButtonHandler implements ActionListener public void actionPerformed(ActionEvent e)System.out.println(Action occurred);Sy
33、stem.out.printl(Buttons command is:+e.getActionCommand();49Java事件分类50各种组件可产生的事件51Java GUI事件及相应监听器接口(1)事件类型事件类型监听器接口监听器接口监听器接口中的方法监听器接口中的方法ActionActionListeneractionPerformed(ActionEvent)ItemItemListeneritemStateChanged(ItemEvent)MouseMouseListenermousePressed(MouseEvent)mouseReleased(MouseEvent)mous
34、eEntered(MouseEvent)mouseExited(MouseEvent)mouseClicked(MouseEvent)Mouse MotionMouseMotionListenermouseDragged(MouseEvent)mouseMoved(MouseEvent)KeyKeyListenerkeyPressed(KeyEvent)keyReleased(KeyEvent)keyTyped(KeyEvent)FocusFocusListenerfocusGained(FocusEvent)focusLost(FocusEvent)52Java GUI事件及相应监听器接口(
35、2)事件类型监听器接口监听器接口中的方法AdjustmentAdjustmentListeneradjustmentValueChanged(AdjustmentEvent)ComponentComponentListenercomponentMoved(ComponentEvent)componentHidden(ComponentEvent)componentResized(ComponentEvent)componentShown(ComponentEvent)WindowWindowListenerwindowClosing(WindowEvent)windowOpened(Windo
36、wEvent)windowIconified(WindowEvent)windowDeiconified(WindowEvent)windowClosed(WindowEvent)windowActivated(WindowEvent)windowDeactivated(WindowEvent)ContainerContainerListenercomponentAdded(ContainerEvent)componentRemoved(ContainerEvent)TextTextListenertextValueChanged(TextEvent)53多重监听器一般情况下,事件源可以产生多
37、种不同类型的事件,因而可以注册(触发)多种不同类型的监听器。一个事件源组件上可以注册多个监听器,针对同一个事件源的同一种事件也可以注册多个监听器,一个监听器可以被注册到多个不同的事件源上。54多重监听器举例(1)import java.awt.*;import java.awt.event.*;public class TwoListener implements MouseMotionListener,MouseListener private Frame f;private TextField tf;public TwoListener()f=new Frame(Two listeners
38、 example);tf=new TextField(30);public void launchFrame()Label label=new Label(Click and drag the mouse);f.add(label,BorderLayout.NORTH);/向向Frame中添加组件中添加组件 f.add(tf,BorderLayout.SOUTH);f.addMouseMotionListener(this);/将将this对象作为监听器注册到对象作为监听器注册到f上上 f.addMouseListener(this);f.setSize(300,200);f.setVisib
39、le(true);/未完,接下页未完,接下页55多重监听器举例(2)public void mouseMoved(MouseEvent e)String s=Mouse dragging:X=+e.getX()+Y=+e.getY();tf.setText(s);public void mouseEntered(MouseEvent e)String s=The mouse entered;tf.setText(s);public void mouseExited(MouseEvent e)String s=The mouse has left the building;tf.setText(
40、s);/未使用的接口中的方法,也必须实现未使用的接口中的方法,也必须实现 public void mouseDragged(MouseEvent e)public void mousePressed(MouseEvent e)public void mouseClicked(MouseEvent e)public void mouseReleased(MouseEvent e)public static void main(String args)TwoListener two=new TwoListener();two.launchFrame();56事件适配器(Event Adapter)
41、为简化编程,针对大多数事件监听器接口定义了相应的实现类-事件适配器类,在适配器类中,实现了相应监听器接口中所有的方法,但不做任何事情。在定义监听器类时就可以继承事件适配器类,并只重写所需要的方法。ComponentAdapter(组件适配器组件适配器)ContainerAdapter(容器适配器容器适配器)FocusAdapter(焦点适配器焦点适配器)KeyAdapter(键盘适配器键盘适配器)MouseAdapter(鼠标适配器鼠标适配器)MouseMotionAdapter(鼠标运动适配器鼠标运动适配器)WindowAdapter(窗口适配器窗口适配器)57事件适配器用法举例1impor
42、t java.awt.*;import java.awt.event.*;public class TestWindow implements ActionListener private Frame f;private Button b;public TestWindow()f=new Frame(Test);b=new Button(Press Me!);b.setActionCommand(ButtonPressed);public void launchFrame()b.addActionListener(this);f.add(b,BorderLayout.CENTER);f.add
43、WindowListener(new WindowHandler();f.pack();f.setVisible(true);58事件适配器用法举例2public void actionPerformed(ActionEvent e)System.out.println(Action occurred);System.out.println(Buttons command is:+e.getActionCommand();public static void main(String args)TestWindow guiApp=new TestWindow();guiApp.launchFra
44、me();class WindowHandler extends WindowAdapter public void windowClosing(WindowEvent e)System.exit(1);59控制显示效果Color类Color类将颜色按照sRGB标准格式进行封装,该格式中红、绿、蓝三原色的取值范围都是0255。Color类定义了多个构造方法,常用的有:public Color(int r,int g,int b)public Color(int r,int g,int b,int a)/a-透明度参数Color c=new Color(200,170,90);Color d=n
45、ew Color(200,170,90,120);在GUI设计中使用Color类Button b=new Button(“Test”);Color c=new Color(200,170,90);b.setBackground(c)60JFC体系结构Sun公司在JDK1.2中提供了一个新的GUI 开发包,称为JFC(Java Foundation Class)。它覆盖了若干公司相应的GUI 类,使它们统一起来,并具有比AWT更精美的显示。61Swing 工具集简介Swing是第二代GUI开发工具集AWT采用了与特定平台相关的实现,而绝大多数Swing组件却不是 Swing是构筑在AWT上层的一组GUI组件的集合,为保证可移植性,它完全用Java语言编写 和AWT相比,Swing提供了更完整的组件,引入了许多新的特性和能力 62Swing类层次63