1 / 49

基于 Swing 的 图形化用户界面

基于 Swing 的 图形化用户界面. Java 图形处理(上次课内容) 利用 Swing 构建 GUI( 图形用户界面 ) 的方法 GUI 事件处理模型 Swing 组件 ( 下次课内容 ). Java 图形用户界面概述. 图形用户界面( Graphics User Interface ,简称 GUI ):使用 图形 的方式,借助 菜单 、 按钮 等标准界面元素和 鼠标操作 ,帮助用户方便地向计算机系统 发出指令 , 启动操作 ,并将系统运行的结果同样 以图形方式显示给用户 。. Java 图形用户界面概述. Java 中设计和实现图形用户界面的工作主要有:

lethia
Télécharger la présentation

基于 Swing 的 图形化用户界面

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 基于Swing的图形化用户界面 Java图形处理(上次课内容) • 利用Swing构建GUI(图形用户界面)的方法 • GUI事件处理模型 • Swing组件(下次课内容)

  2. Java图形用户界面概述 图形用户界面(Graphics User Interface,简称GUI):使用图形的方式,借助菜单、按钮等标准界面元素和鼠标操作,帮助用户方便地向计算机系统发出指令,启动操作,并将系统运行的结果同样以图形方式显示给用户。

  3. Java图形用户界面概述 Java中设计和实现图形用户界面的工作主要有: 1.创建组件(Component):创建组成界面的各种元素,如按钮、文本框等。 2. 指定布局(Layout):根据具体需要排列组件的位置关系。 3. 响应事件(Event):定义图形用户界面的事件和各界面元素对不同事件的响应,从而实现图形用户界面与用户的交互功能。

  4. Java图形用户界面概述 Java中构成用户界面的各种元素和成分可以分为三类:容器、控制组件和用户自定义成分。 1. 容器 容器是用来组织其他界面成份和元素的单元。一般说来,一个应用程序的图形用户界面首先对应于一个复杂的容器,如一个窗口。这个容器内部将包含许多界面成份和元素,这些界面元素本身又可以是一个容器,这个容器将再进一步包含它的界面成份和元素,依次类推就构成一个复杂的图形界面系统。

  5. Java图形用户界面概述 容器的主要作用和特点有: (1)容器有一定的范围。一般容器都是矩形的,容器范围边界可以用边框框出来,有些则没有可见的标记。 (2)容器有一定的位置。这个位置可以是屏幕四角的绝对位置,也可以是相对于其他容器边框的相对位置。 (3)容器通常都有一个背景,这个背景覆盖全部容器,可以透明,也可以指定一幅特殊的图案,使界面生动化和个性化。 (4)容器中可以包含其他的许多界面成份和元素。当容器被打开显示时,它上面的成份和元素也同时显示出来;当容器被关闭和隐藏时,它所包含的成份和元素也一起被隐藏。 (5)容器可以按一定的规则来安排它所包含的元素,如这些元素的相对位置关系、它们的前后排列关系等。 (6)容器可能被包含在其他容器之中。

  6. Java图形用户界面概述 2.控制组件(简称组件) 与容器不同,控制组件是图形用户界面的最小单位之一,它里面不再包含其他的元素。控制组件的作用是完成与用户的一次交互,包括接受用户的一个命令,接受用户的一个文本输入,向用户显示一段文本或一个图形等。

  7. Java图形用户界面概述 3.用户自定义成分 除了标准的图形界面元素,编程人员还可以根据用户需要设计一些用户自定义的图形界面成份,例如绘制一些几何图形,使用标志图案等(上次课内容)。用户自定义成份由于不能像标准界面元素一样被系统识别和承认,所以通常只能起到装饰、美化等作用,而不能响应用户的动作,不具有交互功能。

  8. Java图形用户界面概述 • Java1.0中用来生成图形用户界面的包是java.awt, • 简称抽象窗口工具集,即AWT(Abstract Window Toolkit) • 它的设计目标是:希望构建一个通用的GUI,使得利用它编写的程序能够运行在所有的平台上,以实现Sun公司提出的口号“一次编写,随处运行” • 在Java1.2中,Sun公司推出了新的用户界面库:Swing。相对AWT来说,Swing功能更强大、使用更方便,它的出现使得Java的图形用户界面上了一个台阶

  9. Java图形用户界面概述 但是,Swing并没有代替AWT。在Java1.1中,AWT事件处理模型有了根本改变。Swing使用的仍然是Java1.1的事件处理模型。 总之:AWT是Swing的基础,Swing在界面构造方法、事件处理机制等方面与AWT基本一致,但它比AWT提供的组件更丰富! (AWT 214, Swing 216)

  10. 基于Swing的GUI构建方法 import javax.swing.*; import java.awt.event.*; public class HelloWorldSwing { public static void main(String[] args) { JFrame frame = new JFrame("HelloWorldSwing"); final JLabel label = new JLabel("Hello World!"); frame.getContentPane().add(label); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(200,70); frame.setVisible(true); } } • Simple Example (HelloWorldSwing.java)

  11. 常用容器 • 组成GUI的组件(如:按钮、标签、对话框等)不能独立使用,必须放在容器内 • 一个容器可以容纳多个组件,并使他们成为一个整体 • Swing中常用的3中容器是Jframe,Jpanel和Japplet,他们对应于AWT中的Frame,Panel和Applet

  12. Swing GUI容器的结构 Swing GUI由顶层容器-中间容器-基本组件构成 • 至少有一个顶层容器,它提供了所包含组件需要的绘制与事件处理功能。多数情况下,顶层容器是Jframe, Jdialog或Japplet的实例 • 中间层容器由通用容器构成,主要是为了化简组件的布局,常用的组件为Jpanel, JScrollPane, JTabbedPan等 • 基本组件是直接向用户展示信息或获取用户输入的组件

  13. 顶层容器 • 顶层容器包括一个内容面板(Content Pane),该面板中直接或者间接包含了该容器中的组件 • 顶层容器中还可以增加一个菜单条。该菜单条一般放在顶层容器中,但在内容面板之外 JFrame Frame HelloSwing Menu Bar Content Pane Menu Bar Content Pane

  14. 顶层容器 • Swing组件不能直接添加到顶层容器中(AWT组件可以) • 必须添加到顶层容器的内容面板上 • 为了方便组件位置的规划,一般建立一个中间层容器(如Jpanel),存放所有要放在该内容面板上的组件 • 然后将该中间层容器放在顶层容器的内容面板中(或者将该面板设置为顶层容器的内容面板) JFrame Frame HelloSwing Menu Bar Content Pane Menu Bar Content Pane JPanel JLabel

  15. 顶层容器 • 对Jframe添加组件的两种方式 • 1. 用getContentPane()方法获得Jframe的内容面板,再用add()方法向其中加入组件 getContentPane().add(new Jlabel(“Hello”))

  16. 顶层容器 • 2. 建立一个中间容器,Jpanel或者JDesktopPane,把组件添加到中间容器中,再用setContentPane()方法把该容器设置为Jframe的内容面板 Jpanel contentPane = new Jpanel(); Jbutton b =new Jbutton(“确定”); contentPane.add(b); … frame.setContentPane(contentPane);

  17. 顶层容器 • Jframe是最常用的的顶层容器,一般作为JavaApplication的主窗口 • 如果需要创建依赖于另一个窗口的窗口,可以使用对话框Jdialog • 如果要在一个窗口中建立另外一个窗口,可以使用内部窗口类JIternalFrame

  18. 顶层容器 • Jframe的创建与设置 • 构造方法(创建) JFrame(); Jframe(String title); • 创建的窗口初始默认不显示,使用setVisible(true)来显示

  19. 顶层容器 • 设置单击关闭窗口按钮操作 Public void setDefaultCloseOperation(int operation) 可选的参数: • WindowConstants.DO_NOTHING_ON_CLOSE: 不做任何动作 • WindowConstants.HIDE_ON_CLOSE:隐藏窗口 • WindowConstants.DISPOSE_ON_CLOSE:关闭窗口,释放资源 • JFrame.EXIT_ON_CLOSE:退出应用程序

  20. 顶层容器 • 窗口的修饰设置 • Static void setDefaultLookAndFeelDecorated (boolean defaultLookAndFeelDecorated) • 指定窗口是否使用当前Look&Feel提供的窗口修饰(包括窗口的边框、标题以及用来关闭与最小化窗口的按钮) • 也可以修改(P220)

  21. import java.awt.*; import java.awt.event.*; import javax.swing.*; public class JFrameDemo { public static void main(String s[]) { // 指定使用当前的Look&Feel装饰窗口。必须在创建窗口前设定。 JFrame.setDefaultLookAndFeelDecorated(true); // 创建并设定关闭窗口操作。 JFrame frame = new JFrame("JFrameDemo"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 创建一个JLable并加到窗口中。 JLabel emptyLabel = new JLabel(""); emptyLabel.setPreferredSize(new Dimension(175, 100)); frame.getContentPane().add(emptyLabel, BorderLayout.CENTER); // 显示窗口。 frame.pack(); frame.setVisible(true); } } 创建了 一个带 有空 Jlable 的 JFrame

  22. 通用容器JPanel • JPanel是存放轻型组件的通用容器 • 默认情况下是透明的,可以使用setSpaque()方法进行设置 • JPanel的对象可以作为定层容器的内容面板使用 • 可以设置JPanel的布局管理,并向其中添加组件

  23. import java.awt.*; import javax.swing.*; public class FrameWithPanel extends JFrame { public static void main(String args[]) { FrameWithPanel fr = new FrameWithPanel("Hello !"); fr.setSize(200, 200); fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel pan = new JPanel(); pan.setSize(200, 100); pan.setBackground(Color.yellow); pan.setLayout(new GridLayout(2, 1)); pan.add(new JButton("确定")); fr.setContentPane(pan); fr.setVisible(true); } public FrameWithPanel(String str) { super(str); } } 创建Jpanel 的示例

  24. 布局管理 • 布局管理负责对容器内的组件进行管理。确定容器的布局策略及容器内组件的排列顺序、组件大小和位置,以及当窗口移动或调整大小后组件如何变化等 • 每个容器都有一个默认的布局管理器,该布局管理器可以通过setLayout()来改变 • Java提供了下列布局管理器 1. FlowLayout 流式布局管理器 2. BorderLayout 边界布局管理器 3. GridLayout网格布局管理器 4. GridBagLayout网格包布局管理器 5. BoxLayout箱式布局管理器(Swing中新加的)

  25. 布局管理 1. FlowLayout流式布局管理器 • 它是Panel和Applet的默认布局管理器。容器内的组件采用从左到右,从上到下逐行摆放 • 构造方法: • FlowLayout() • 组件居中摆放,组件之间水平和垂直间距为5个像素 • FlowLayout(int align) • 组件按参数指定的对齐方式摆放,组件之间水平和垂直距离5个像素 • 参数align的取值必须是FlowLayout.LEFT, FlowLayout.RIGHT, FlowLayout.CENTER

  26. 布局管理 • FlowLayout(int align, int hgap, int vgap) • 组件按参数指定的对齐方式摆放 • 组件之间水平距离由hgap指定 • 垂直距离由vgap指定 使用方法: SetLayout(new FlowLayout(FlowLayout.LEFT, 10,20))

  27. import java.awt.*; import javax.swing.*; public class FlowLayoutWindow extends JFrame { public FlowLayoutWindow() { setLayout(new FlowLayout()); add(new JLabel("Buttons:")); add(new JButton("Button 1")); add(new JButton("2")); add(new JButton("Button 3")); add(new JButton("Long-Named Button 4")); add(new JButton("Button 5")); } public static void main(String args[]) { FlowLayoutWindow window = new FlowLayoutWindow(); window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); window.setTitle("FlowLayoutWindow Application"); window.pack();// 窗口的大小设置为适合组件最佳尺寸与布局所需的空间。 window.setVisible(true); } } FlowLayout 示例

  28. 布局管理 2. BorderLayout边界布局管理 • BorderLayout是Window,Dialog和Frame的默认布局管理器 • BorderLayout布局管理器将容器分为5个区:East, West, South, North和Center • BorderLayout的构造方法: • BorderLayout() • 组件之间没有水平间隙与垂直间隙 • BorderLayout(int hgap, int vgap) • 指定组件之间的水平和垂直间隙

  29. 布局管理 • 使用方法 • SetLayOut(new BorderLayout(10,20)) • 当用户改变容器窗口大小时,各组件的相对位置不变,但组件的大小改变 • 向容器中加入组件时,要指定摆放的位置,否则组件将不能显示 • 两个添加方法: • Public Component add(String name, Component comp) • Public void add(Component comp, Object constraints) 例8-5

  30. 布局管理 3. GridLayout网格布局管理 • GridLayout布局管理器把容器分成n行m列同样大小的网格单元 • 每个网格单元可以容纳一个组件,并且次组件将充满网格单元 • 组件按照从左到右,从上到下的顺序填充

  31. 布局管理 • 构造方法: • GridLayout() • 容器划分为1行1列的网格 • GridLayout(int row, int cols) • 容器划分为指定行数、列数的网格 • GridLayout(int rows, int cols, int hgap, int vgap) • 容器划分为指定数目的网格,并制定组件间的水平垂直距离 • 例8-6

  32. 布局管理 4. CardLayout卡片布局管理器 • CardLayout可以使两个或更多的组件共享一个显示空间 • CardLayout把这些组件像一系列卡片一样叠放,一个时刻只有最上面的是可见的 • 构造方法: • CardLayout() • 组件与左右上下界之间没有间隙 • CardLayout(int hgap, int vgap) • 参数hgap指定组件距离左右边界的间隙 • 参数vgap指定组件距离上下边界的间隙

  33. 布局管理 • CardLayout常用的方法: • public void first (Container parent) • 显示第一张卡片 • public void next (Container parent) • 显示下一张卡片(如果当前是最后一张,则显示第一张) • public void previous (Container parent) • 显示前一张卡片 • public void last (Container parent) • 显示最后一张卡片 • public void show (Container parent, String name) • 显示指定名称的组件

  34. 布局管理 • 向一个由CardLayout管理的容器添加组件时,必须使用Container类的add()方法 public component add(String name, Component com) • 例8-7

  35. 布局管理 5. GridBagLayout网格包布局管理器 • GridBagLayout是网络包布局管理器,它是最灵活、最复杂的布局管理器 • GridBagLayout所管理的每个组件都与一个GridBagConstraints类的对象相关。这个约束对象指定了组建的显示区域在网格中的位置,以及在其显示区域中应该如何摆放组件 • 另外, GridBagLayout还要考虑每个组件的最小和首选尺寸以确定组件的大小

  36. 布局管理 • GridBagConstraints对象的定制是通过设置一个或者多个GridBagConstraints的变量来实现的: • gridx,gridy • 指定组件左上角在网格中的行与列 • gridwidth, gridheight • 指定组件显示区域所占的列数与行数 • fill • 指定组件填充网格的方式 • ipadx,ipady • 指定组件显示区域的内部填充

  37. 布局管理 • insets • 指定组件显示区域的外部填充 • anchor • 指定组件在显示区域的摆放位置 • weightx, weighty • 用来指定在容器大小改变是,增加或减少的孔家如何在组件间进行分配 • 例8-8

  38. 布局管理 6. BoxLayout箱式布局管理器 (例8-9 ) • 箱式布局管理器将组件垂直摆放在一列或水平摆放的一行中 • 具体由BoxLayout.X_AXIS和BoxLayout.Y_AXIS指定 7. 无布局管理器 • 当处理一些手工绘制图形时,需要自己来设置图形的位置,因而不需要使用系统提供的布局管理器。这是通过调用setLayout(null)方法,不采用任何布局管理器 • 需要使用setLocation(), setSize(),setBounds()等方法手工设置组件大小和位置(这些方法会导致平台相关,不建议使用)

  39. GUI中的事件处理 • GUI中事件处理的一般工程: • 当用户在界面上利用鼠标或键盘进行操作时, • 检测GUI的操作系统将所发生的时间传送给GUI应用程序, • 应用程序根据时间的类型做出相应的反应 Java GUI事件处理模型主要是关于在程序获得事件后, 采用怎样的结构和机制对事件进行处理和响应 基于Swing的GUI中,仍然采用AWT的事件处理模型

  40. GUI中的事件处理 • 事件处理模型中的3类对象 • 事件 • 当用户在界面上执行一个操作,如敲键盘、拖动或者单击鼠标,都产生了事件 • 事件源 • 产生事件的组件就是一个事件源。如在一个Button上单击鼠标时,将产生一个ActionEvent类型的事件,这个Button就是事件源 • 事件处理器 • 事件处理器是一个方法,该方法接收一个事件对象,对其进行解释,并做出相应的处理

  41. GUI中的事件处理 • 委托式的事件处理机制的实现包括两部分: (1)定义监听器类 • 声明监听器类:在负责事件处理的类的声明中指定要实现的监听器接口 Public class MyClass implements ActionListener{ …} MyClass将成为处理ActionEven事件的监听类,它的对 象可以作为Button等组件的监听注册器 • 实现监听器中的接口,即在监听器类中实现监听器接口中所有的方法 Public class MyClass implements ActionListener{ Public void actionPerformed(ActionEvent e){ … //响应某个动作的代码} }

  42. GUI中的事件处理 • 委托式的事件处理机制的实现包括两部分: (2)注册监听器 通过调用组件的addXXXListener()方法,在组件上将监听器类的实例注册为监听器,如 someComponent.addXXXListener(new Myclass());

  43. GUI中的事件处理 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class TestButton { public static void main(String args[]) { JFrame f = new JFrame("Test"); f.setSize(200, 100); f.setLayout(new FlowLayout(FlowLayout.CENTER)); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JButton b = new JButton("Press Me!"); b.addActionListener(new ButtonHandler()); // 注册点击鼠标事件监听器。 f.add(b); f.setVisible(true); } } • 委托式的事件处理机制的实现实例(单击按钮事件响应)

  44. // 定义ActionEvent监听器类 class ButtonHandler implements ActionListener { public void actionPerformed(ActionEvent e) { System.out.println("Action occurred"); System.out.println("Button's label is:" + e.getActionCommand()); } }

  45. GUI中的事件处理 • 事件类与事件处理接口 • Java中定义了很多事件类和事件处理接口,多数事件类在java.awt.event包中,还有一些在API中 java.util.EventObject ActionEvent AdjustmentEvent ComponentEvent ItemEvent TextEvent Java.awt.AWTEvent ContainerEvent FocusEvent InputEvent WindowEvent KeyEvent MouseEvent AWT事件类层次图

  46. GUI中的事件处理 • 对应于AWT每种类型的事件,都定义了相应的事件处理接口 • P236表8-1列出了AWT事件类、对应的监听接口与适配器类,以及监听接口中所包含的方法 • P237-241 AWT事件处理示例 • 监听多事件的监听器 • 多监听器实例

  47. GUI中的事件处理 • 事件适配器 • 有些AWT事件监听器接口如MouseListener和WindowsListener都包含五六个方法,在定义监听器类时,不管这些方法是否使用,都要将这些方法列出并实现,这给程序开发者带来了不便 • 为此,Java为每个包含两个以上方法的监听器接口提供了事件适配器类,这些适配器实现了相应的监听器接口,但所有方法体都是空的

  48. GUI中的事件处理 • Swing中新增的事件及其监听器接口 • Swing仍然使用AWT的基于监听器的事件处理机制。因此Swing中基本的事件处理需要使用java.awt.event包中的类 • 另外,java.swing.event包中也增加了一些新的事件及其监听器接口 (具体P243)

  49. 练习 • 课本上所有的例子

More Related