490 likes | 789 Views
基于 Swing çš„ 图形化用户界é¢. Java 图形处ç†ï¼ˆä¸Šæ¬¡è¯¾å†…容) 利用 Swing 构建 GUI( å›¾å½¢ç”¨æˆ·ç•Œé¢ ) 的方法 GUI 事件处ç†æ¨¡åž‹ Swing 组件 ( 下次课内容 ). Java 图形用户界é¢æ¦‚è¿°. 图形用户界é¢ï¼ˆ Graphics User Interface ,简称 GUI ):使用 图形 çš„æ–¹å¼ï¼Œå€ŸåŠ© èœå• 〠按钮 ç‰æ ‡å‡†ç•Œé¢å…ƒç´ å’Œ é¼ æ ‡æ“作 ,帮助用户方便地å‘计算机系统 å‘出指令 , å¯åŠ¨æ“作 ,并将系统è¿è¡Œçš„结果åŒæ · 以图形方å¼æ˜¾ç¤ºç»™ç”¨æˆ· 。. Java 图形用户界é¢æ¦‚è¿°. Java ä¸è®¾è®¡å’Œå®žçŽ°å›¾å½¢ç”¨æˆ·ç•Œé¢çš„工作主è¦æœ‰ï¼š
E N D
基于Swing的图形化用户界面 Java图形处理(上次课内容) • 利用Swing构建GUI(图形用户界面)的方法 • GUI事件处理模型 • Swing组件(下次课内容)
Java图形用户界面概述 图形用户界面(Graphics User Interface,简称GUI):使用图形的方式,借助菜单、按钮等标准界面元素和鼠标操作,帮助用户方便地向计算机系统发出指令,启动操作,并将系统运行的结果同样以图形方式显示给用户。
Java图形用户界面概述 Java中设计和实现图形用户界面的工作主要有: 1.创建组件(Component):创建组成界面的各种元素,如按钮、文本框等。 2. 指定布局(Layout):根据具体需要排列组件的位置关系。 3. 响应事件(Event):定义图形用户界面的事件和各界面元素对不同事件的响应,从而实现图形用户界面与用户的交互功能。
Java图形用户界面概述 Java中构成用户界面的各种元素和成分可以分为三类:容器、控制组件和用户自定义成分。 1. 容器 容器是用来组织其他界面成份和元素的单元。一般说来,一个应用程序的图形用户界面首先对应于一个复杂的容器,如一个窗口。这个容器内部将包含许多界面成份和元素,这些界面元素本身又可以是一个容器,这个容器将再进一步包含它的界面成份和元素,依次类推就构成一个复杂的图形界面系统。
Java图形用户界面概述 容器的主要作用和特点有: (1)容器有一定的范围。一般容器都是矩形的,容器范围边界可以用边框框出来,有些则没有可见的标记。 (2)容器有一定的位置。这个位置可以是屏幕四角的绝对位置,也可以是相对于其他容器边框的相对位置。 (3)容器通常都有一个背景,这个背景覆盖全部容器,可以透明,也可以指定一幅特殊的图案,使界面生动化和个性化。 (4)容器中可以包含其他的许多界面成份和元素。当容器被打开显示时,它上面的成份和元素也同时显示出来;当容器被关闭和隐藏时,它所包含的成份和元素也一起被隐藏。 (5)容器可以按一定的规则来安排它所包含的元素,如这些元素的相对位置关系、它们的前后排列关系等。 (6)容器可能被包含在其他容器之中。
Java图形用户界面概述 2.控制组件(简称组件) 与容器不同,控制组件是图形用户界面的最小单位之一,它里面不再包含其他的元素。控制组件的作用是完成与用户的一次交互,包括接受用户的一个命令,接受用户的一个文本输入,向用户显示一段文本或一个图形等。
Java图形用户界面概述 3.用户自定义成分 除了标准的图形界面元素,编程人员还可以根据用户需要设计一些用户自定义的图形界面成份,例如绘制一些几何图形,使用标志图案等(上次课内容)。用户自定义成份由于不能像标准界面元素一样被系统识别和承认,所以通常只能起到装饰、美化等作用,而不能响应用户的动作,不具有交互功能。
Java图形用户界面概述 • Java1.0中用来生成图形用户界面的包是java.awt, • 简称抽象窗口工具集,即AWT(Abstract Window Toolkit) • 它的设计目标是:希望构建一个通用的GUI,使得利用它编写的程序能够运行在所有的平台上,以实现Sun公司提出的口号“一次编写,随处运行” • 在Java1.2中,Sun公司推出了新的用户界面库:Swing。相对AWT来说,Swing功能更强大、使用更方便,它的出现使得Java的图形用户界面上了一个台阶
Java图形用户界面概述 但是,Swing并没有代替AWT。在Java1.1中,AWT事件处理模型有了根本改变。Swing使用的仍然是Java1.1的事件处理模型。 总之:AWT是Swing的基础,Swing在界面构造方法、事件处理机制等方面与AWT基本一致,但它比AWT提供的组件更丰富! (AWT 214, Swing 216)
基于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)
常用容器 • 组成GUI的组件(如:按钮、标签、对话框等)不能独立使用,必须放在容器内 • 一个容器可以容纳多个组件,并使他们成为一个整体 • Swing中常用的3中容器是Jframe,Jpanel和Japplet,他们对应于AWT中的Frame,Panel和Applet
Swing GUI容器的结构 Swing GUI由顶层容器-中间容器-基本组件构成 • 至少有一个顶层容器,它提供了所包含组件需要的绘制与事件处理功能。多数情况下,顶层容器是Jframe, Jdialog或Japplet的实例 • 中间层容器由通用容器构成,主要是为了化简组件的布局,常用的组件为Jpanel, JScrollPane, JTabbedPan等 • 基本组件是直接向用户展示信息或获取用户输入的组件
顶层容器 • 顶层容器包括一个内容面板(Content Pane),该面板中直接或者间接包含了该容器中的组件 • 顶层容器中还可以增加一个菜单条。该菜单条一般放在顶层容器中,但在内容面板之外 JFrame Frame HelloSwing Menu Bar Content Pane Menu Bar Content Pane
顶层容器 • Swing组件不能直接添加到顶层容器中(AWT组件可以) • 必须添加到顶层容器的内容面板上 • 为了方便组件位置的规划,一般建立一个中间层容器(如Jpanel),存放所有要放在该内容面板上的组件 • 然后将该中间层容器放在顶层容器的内容面板中(或者将该面板设置为顶层容器的内容面板) JFrame Frame HelloSwing Menu Bar Content Pane Menu Bar Content Pane JPanel JLabel
顶层容器 • 对Jframe添加组件的两种方式 • 1. 用getContentPane()方法获得Jframe的内容面板,再用add()方法向其中加入组件 getContentPane().add(new Jlabel(“Hello”))
顶层容器 • 2. 建立一个中间容器,Jpanel或者JDesktopPane,把组件添加到中间容器中,再用setContentPane()方法把该容器设置为Jframe的内容面板 Jpanel contentPane = new Jpanel(); Jbutton b =new Jbutton(“确定”); contentPane.add(b); … frame.setContentPane(contentPane);
顶层容器 • Jframe是最常用的的顶层容器,一般作为JavaApplication的主窗口 • 如果需要创建依赖于另一个窗口的窗口,可以使用对话框Jdialog • 如果要在一个窗口中建立另外一个窗口,可以使用内部窗口类JIternalFrame
顶层容器 • Jframe的创建与设置 • 构造方法(创建) JFrame(); Jframe(String title); • 创建的窗口初始默认不显示,使用setVisible(true)来显示
顶层容器 • 设置单击关闭窗口按钮操作 Public void setDefaultCloseOperation(int operation) 可选的参数: • WindowConstants.DO_NOTHING_ON_CLOSE: 不做任何动作 • WindowConstants.HIDE_ON_CLOSE:隐藏窗口 • WindowConstants.DISPOSE_ON_CLOSE:关闭窗口,释放资源 • JFrame.EXIT_ON_CLOSE:退出应用程序
顶层容器 • 窗口的修饰设置 • Static void setDefaultLookAndFeelDecorated (boolean defaultLookAndFeelDecorated) • 指定窗口是否使用当前Look&Feel提供的窗口修饰(包括窗口的边框、标题以及用来关闭与最小化窗口的按钮) • 也可以修改(P220)
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
通用容器JPanel • JPanel是存放轻型组件的通用容器 • 默认情况下是透明的,可以使用setSpaque()方法进行设置 • JPanel的对象可以作为定层容器的内容面板使用 • 可以设置JPanel的布局管理,并向其中添加组件
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 的示例
布局管理 • 布局管理负责对容器内的组件进行管理。确定容器的布局策略及容器内组件的排列顺序、组件大小和位置,以及当窗口移动或调整大小后组件如何变化等 • 每个容器都有一个默认的布局管理器,该布局管理器可以通过setLayout()来改变 • Java提供了下列布局管理器 1. FlowLayout 流式布局管理器 2. BorderLayout 边界布局管理器 3. GridLayout网格布局管理器 4. GridBagLayout网格包布局管理器 5. BoxLayout箱式布局管理器(Swing中新加的)
布局管理 1. FlowLayout流式布局管理器 • 它是Panel和Applet的默认布局管理器。容器内的组件采用从左到右,从上到下逐行摆放 • 构造方法: • FlowLayout() • 组件居中摆放,组件之间水平和垂直间距为5个像素 • FlowLayout(int align) • 组件按参数指定的对齐方式摆放,组件之间水平和垂直距离5个像素 • 参数align的取值必须是FlowLayout.LEFT, FlowLayout.RIGHT, FlowLayout.CENTER
布局管理 • FlowLayout(int align, int hgap, int vgap) • 组件按参数指定的对齐方式摆放 • 组件之间水平距离由hgap指定 • 垂直距离由vgap指定 使用方法: SetLayout(new FlowLayout(FlowLayout.LEFT, 10,20))
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 示例
布局管理 2. BorderLayout边界布局管理 • BorderLayout是Window,Dialog和Frame的默认布局管理器 • BorderLayout布局管理器将容器分为5个区:East, West, South, North和Center • BorderLayout的构造方法: • BorderLayout() • 组件之间没有水平间隙与垂直间隙 • BorderLayout(int hgap, int vgap) • 指定组件之间的水平和垂直间隙
布局管理 • 使用方法 • SetLayOut(new BorderLayout(10,20)) • 当用户改变容器窗口大小时,各组件的相对位置不变,但组件的大小改变 • 向容器中加入组件时,要指定摆放的位置,否则组件将不能显示 • 两个添加方法: • Public Component add(String name, Component comp) • Public void add(Component comp, Object constraints) 例8-5
布局管理 3. GridLayout网格布局管理 • GridLayout布局管理器把容器分成n行m列同样大小的网格单元 • 每个网格单元可以容纳一个组件,并且次组件将充满网格单元 • 组件按照从左到右,从上到下的顺序填充
布局管理 • 构造方法: • GridLayout() • 容器划分为1行1列的网格 • GridLayout(int row, int cols) • 容器划分为指定行数、列数的网格 • GridLayout(int rows, int cols, int hgap, int vgap) • 容器划分为指定数目的网格,并制定组件间的水平垂直距离 • 例8-6
布局管理 4. CardLayout卡片布局管理器 • CardLayout可以使两个或更多的组件共享一个显示空间 • CardLayout把这些组件像一系列卡片一样叠放,一个时刻只有最上面的是可见的 • 构造方法: • CardLayout() • 组件与左右上下界之间没有间隙 • CardLayout(int hgap, int vgap) • 参数hgap指定组件距离左右边界的间隙 • 参数vgap指定组件距离上下边界的间隙
布局管理 • 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) • 显示指定名称的组件
布局管理 • 向一个由CardLayout管理的容器添加组件时,必须使用Container类的add()方法 public component add(String name, Component com) • 例8-7
布局管理 5. GridBagLayout网格包布局管理器 • GridBagLayout是网络包布局管理器,它是最灵活、最复杂的布局管理器 • GridBagLayout所管理的每个组件都与一个GridBagConstraints类的对象相关。这个约束对象指定了组建的显示区域在网格中的位置,以及在其显示区域中应该如何摆放组件 • 另外, GridBagLayout还要考虑每个组件的最小和首选尺寸以确定组件的大小
布局管理 • GridBagConstraints对象的定制是通过设置一个或者多个GridBagConstraints的变量来实现的: • gridx,gridy • 指定组件左上角在网格中的行与列 • gridwidth, gridheight • 指定组件显示区域所占的列数与行数 • fill • 指定组件填充网格的方式 • ipadx,ipady • 指定组件显示区域的内部填充
布局管理 • insets • 指定组件显示区域的外部填充 • anchor • 指定组件在显示区域的摆放位置 • weightx, weighty • 用来指定在容器大小改变是,增加或减少的孔家如何在组件间进行分配 • 例8-8
布局管理 6. BoxLayout箱式布局管理器 (例8-9 ) • 箱式布局管理器将组件垂直摆放在一列或水平摆放的一行中 • 具体由BoxLayout.X_AXIS和BoxLayout.Y_AXIS指定 7. 无布局管理器 • 当处理一些手工绘制图形时,需要自己来设置图形的位置,因而不需要使用系统提供的布局管理器。这是通过调用setLayout(null)方法,不采用任何布局管理器 • 需要使用setLocation(), setSize(),setBounds()等方法手工设置组件大小和位置(这些方法会导致平台相关,不建议使用)
GUI中的事件处理 • GUI中事件处理的一般工程: • 当用户在界面上利用鼠标或键盘进行操作时, • 检测GUI的操作系统将所发生的时间传送给GUI应用程序, • 应用程序根据时间的类型做出相应的反应 Java GUI事件处理模型主要是关于在程序获得事件后, 采用怎样的结构和机制对事件进行处理和响应 基于Swing的GUI中,仍然采用AWT的事件处理模型
GUI中的事件处理 • 事件处理模型中的3类对象 • 事件 • 当用户在界面上执行一个操作,如敲键盘、拖动或者单击鼠标,都产生了事件 • 事件源 • 产生事件的组件就是一个事件源。如在一个Button上单击鼠标时,将产生一个ActionEvent类型的事件,这个Button就是事件源 • 事件处理器 • 事件处理器是一个方法,该方法接收一个事件对象,对其进行解释,并做出相应的处理
GUI中的事件处理 • 委托式的事件处理机制的实现包括两部分: (1)定义监听器类 • 声明监听器类:在负责事件处理的类的声明中指定要实现的监听器接口 Public class MyClass implements ActionListener{ …} MyClass将成为处理ActionEven事件的监听类,它的对 象可以作为Button等组件的监听注册器 • 实现监听器中的接口,即在监听器类中实现监听器接口中所有的方法 Public class MyClass implements ActionListener{ Public void actionPerformed(ActionEvent e){ … //响应某个动作的代码} }
GUI中的事件处理 • 委托式的事件处理机制的实现包括两部分: (2)注册监听器 通过调用组件的addXXXListener()方法,在组件上将监听器类的实例注册为监听器,如 someComponent.addXXXListener(new Myclass());
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); } } • 委托式的事件处理机制的实现实例(单击按钮事件响应)
// 定义ActionEvent监听器类 class ButtonHandler implements ActionListener { public void actionPerformed(ActionEvent e) { System.out.println("Action occurred"); System.out.println("Button's label is:" + e.getActionCommand()); } }
GUI中的事件处理 • 事件类与事件处理接口 • Java中定义了很多事件类和事件处理接口,多数事件类在java.awt.event包中,还有一些在API中 java.util.EventObject ActionEvent AdjustmentEvent ComponentEvent ItemEvent TextEvent Java.awt.AWTEvent ContainerEvent FocusEvent InputEvent WindowEvent KeyEvent MouseEvent AWT事件类层次图
GUI中的事件处理 • 对应于AWT每种类型的事件,都定义了相应的事件处理接口 • P236表8-1列出了AWT事件类、对应的监听接口与适配器类,以及监听接口中所包含的方法 • P237-241 AWT事件处理示例 • 监听多事件的监听器 • 多监听器实例
GUI中的事件处理 • 事件适配器 • 有些AWT事件监听器接口如MouseListener和WindowsListener都包含五六个方法,在定义监听器类时,不管这些方法是否使用,都要将这些方法列出并实现,这给程序开发者带来了不便 • 为此,Java为每个包含两个以上方法的监听器接口提供了事件适配器类,这些适配器实现了相应的监听器接口,但所有方法体都是空的
GUI中的事件处理 • Swing中新增的事件及其监听器接口 • Swing仍然使用AWT的基于监听器的事件处理机制。因此Swing中基本的事件处理需要使用java.awt.event包中的类 • 另外,java.swing.event包中也增加了一些新的事件及其监听器接口 (具体P243)
练习 • 课本上所有的例子