Java语言程序设计-图形用户界面设计(2) 2018/11/6 Java语言程序设计-图形用户界面设计(2) 教师:段鹏飞
1、内部类与匿名类的特点 2、编写事件程序的流程 3、能够编写事件处理程序 2018/11/6 知识点 1、内部类与匿名类的特点 2、编写事件程序的流程 3、能够编写事件处理程序
试验时间:改到第12周周一12:00-16:00 设计实现一个window版计算器 实验 要求: 1)参考Windows中的计算器; 2)使用面向对象的思想,应用继承和多态; 2)将最后的界面截图贴在实验报告上。
容器的嵌套 一个JPanel容器,包含一个JLabel标签 一个JPanel容器, 包含了确定和取消按钮。
每个布局管理器都有自己特定的用途。 布局类型的选用 要按行和列显示几个同样大小的组件,GridLayout 会比较适合。 要在尽可能大的空间里显示一个组件,就要选择 BorderLayout 。 当需要在水平和垂直方向上把组件排列整齐时,需要选用GridBagLayout 。 FlowLayout 流式布局 可以让组件全部显示在窗体或者容器上,按照组件添加的先后顺序显示,排列满一行之后自动排列到下一行,缺点是:改变容器大小,组件相对位置会发生变化 BorderLayout 麻将布局 使用绝对的东南西北中位置来放置组件,有点是:容器形状变化,组件相对位置不会变化,缺点是,如直接使用,则只能放置5个组件 GirdLayout 网格布局 用户可以按照自己的需要,将容器划分为等大的网格,优点是:不受组件数量的限制,缺点是:每个组件会占据网格全部的大小,自身的尺寸无法体现 BoxLayout 盒式布局 通过横向放置或者纵向放置的盒子以及横纵向支撑来布局,界面相对美观 null 空布局,用户可以将组件按照自己所需的任意位置摆放,缺点是:如不借助工具,则需要很详细计算组件位置及其大小
联合使用布局管理器 容器的嵌套 一个包含了多个组件的容器本身可以作为一个组件加到另一个容器中去,容器中再添加容器,这样就形成了容器的嵌套。 多面板技术 将窗口分割成多个独立的面板,每个面板独立布局(即为每个面板分别设置不同的布局管理器),然后再使用另一种布局管理器来组织这些面板。
边界 界面上的组件较多时,需要从视觉上将组件分隔。 通用办法是为面板设置边界,再将组件添加到该面板中。 边界风格包括:低斜面、凸斜面、蚀刻、直线、不光滑、空。 NCEPU
创建所需的边界后,把边界对象添加到组件中。 Panel1.setBorder(border); 创建边界需要调用BorderFactory的静态方法。 Border border = BorderFactory.createEmptyBorder(); 创建所需的边界后,把边界对象添加到组件中。 Panel1.setBorder(border); 当需要给边界增加标题以提示时,可以使用BorderFactory的createTitledBorder方法: //初始化带标题的空边界。 Border border = BorderFactory.createEmptyBorder(); Border titled = BorderFactory.createTitledBorder (border, "Border types"); BorderFactory提供了以下方法: ------------------------------------------------------- static Border creatBevelBorder(int type)建立一个立体的边界,并由参数type指定为凹陷或突起,type可为 BevelBorder.LOWERED表示凹陷,或是BevelBorder.RAISED表示突起。 static Border createBevelBorder(int type,Color highlight,Color shadow)建立一个立体的边界,并指定突边与阴 影的颜色。 static Border createBevelBorder(int type,Color highlightOuter,Color highlightInner,Color shadowOuter ,Color shadowInner)建立一个立体的边界,并指定内外部的突边与阴影的颜色。 static CompoundBorder createCompoundBorder()建立一个复合边界。 static CompoundBorder createCompoundBorder(Border outsideBorder,Border insideBorder)建立一个复合边界,并指定它 的内外边界。 static Border createEmptyBorder()建立一个空的边界。 static Border createEmptyBorder(int top,int left,int bottom,int right)建立一个空的边界,并指定上下左右 的宽度,在这些宽度中不能作绘图的效果。 static Border createEtchedBorder()建立一个四周有凹痕的边界。 static Border createEtchedBorder(Color highlight,Color shadow)建立一个四周有凹痕的边界,并指定突边与阴影 的颜色。 static Border createLineBorder(Color color) 建立一个线务边界,并指定线条的颜色。 static Border createLineBorder(Color color,int thicness) 建立一个线务边界,并指定线条的颜色与宽度。 static Border createLoweredBevelBorder()建立一个具有凹陷效果的边界,意义与 createBevelBorder(BevelBorder.LOWERED)相同。 static MatteBorder createMatteBorder(int top,int left,int bottom,int right,Color color)建立一个垫子边界,这跟 createEmptyBorder有点像,但可以指定边界颜色。 static MatteBorder createMatteBorder(int top,int left,int bottom,int right,Icon tileIcom)建立一个垫子边界,并 指定边界的花纹。 static Border createRaisedBevelBorder()建立一个具有突起效果的边界,意义与createBevelBorder(BevelBorder. RAISED)相同。 static TitledBorder createTitledBorder(Border border)建立一个标题边界,但没有标题名称。 static TitledBorder createTitledBorder(Border border,String title)建立一个标题边界,并指定标题名称,标题默认位 置是TitledBorder.DEFAULT_JUSTIFICATION与TitledBorder.DEFAULT_POSITION,也就是左上方。 static TitledBorder createTitledBorder(Border border,String title,int titleJustification,int titlePosition) 建立一个标题边界,并指定标题名称与标题位置,参数titleJustification可为: TitledBorder.LEFT TitledBorder.CENTER TitledBorder.RIGHT TitledBorder.DEFAULT_JUSTIFICATION(leading) 参数titlePosition可为: TitedBorder.ABOVE_TOP TitledBorder.TOP(sittin on the top line) TitledBorder.BELOW_TOP TitledBorder.ABOVE_BOTTOM TitledBorder.BOTTOM(sitting on the bottom line) TitledBorder.BELOW_BOTTOM TitledBorder.DEFAULT_POSITION(top) static TitledBorder createTitledBorder(Border border,String title,int titleJustification,int titlePosition, Font titleFont)建立一个标题边界,并指定标题名称,标题位置与字体。 static TitledBorder createTitledBorder(Border border,String title,int titleJustification,int titlePosition, Font titleFont,Color titleColor)建立一个标题边界,并指定标题名称,标题位置、字体与标题颜 色。 static TitledBorder createTitledBorder(String title)建立一个标题边界,并指定标题名称,其他为默认值。 BorderDemo.java import javax.swing.border.*; import javax.swing.*; import java.awt.*; import java.awt.event.*; public class BorderDemo{ public static void main(String[] args){ JFrame f=new JFrame("BorderDemo"); Container content=f.getContentPane(); JLabel label=new JLabel(); //label.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));//凹陷效果 //label.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));//突起效果 //凹陷效果,并设置突出与阴影的颜色 //label.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED,Color.red,Color.blue)); //凹陷效果,并设置内外部突出与阴影的颜色 //label.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED,Color.red,Color.blue,Color.yellow,Color.green)); /*EmptyBorder:建立一个空的边界,可指定边界的宽度,这在区隔组件之间的距离时可能用到。 *EtchedBorder:建立一个四周有凹痕的边界,也可以指定突边与阴影的颜色. */ //label.setBorder(BorderFactory.createEtchedBorder()); //设置四周有凹痕的边界,并指定内外部的突边与阴影的颜色 //label.setBorder(BorderFactory.createEtchedBorder(Color.red,Color.blue)); //LineBorder:建立一个线条边界,并可以指定线条的颜色与宽度。 //label.setBorder(BorderFactory.createLineBorder(Color.blue,5)); //MatteBorder:建立一个Matte边界,这个方法与createEmptyBorder()有点像,但可以指定边界颜色 //或利用Icon产生边界花纹. //label.setBorder(BorderFactory.createMatteBorder(5,5,5,5,Color.green)); //label.setBorder(BorderFactory.createMatteBorder(25,25,25,25,new ImageIcon(".\\icons\\star.gif"))); /*CompoundBorder: 建立一个复合边界,并可以指定它的内外边界,例如我们可以指定它的外边界为LineBorder, *它的内边界为MatteBorder。 */ //label.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createLineBorder(Color.blue,5), // BorderFactory.createMatteBorder(20,20,18,18,new ImageIcon(".\\icons\\star.gif")))); //TitleBorder:建立一个标题边界,我们可以指定边界的标题名称、标题位置、字体与标题颜色。 //label.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.blue,5),"Line Border" // ,TitledBorder.LEFT,TitledBorder.TOP)); label.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.blue,5),"Line Border" ,TitledBorder.LEFT,TitledBorder.ABOVE_TOP,new Font("SansSerif",Font.ITA_LIC,14),Color.red)); content.add(label); f.setSize(200,150); f.show(); f.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); } }
边界的实例 import javax.swing.*; import javax.swing.border.*; class borderE { public static void main(String[] args) { JPanel p1=new JPanel(); Border border=BorderFactory.createLoweredBevelBorder(); Border borderTitled= BorderFactory.createTitledBorder(border,"打印范围"); p1.setBorder(borderTitled); JFrame f=new JFrame(); f.add(p1); f.setSize(200,200); f.setVisible(true); }
在设计和实现图形用户界面的过程中, 主要完成两个任务: 回顾 - Java的GUI设计 在设计和实现图形用户界面的过程中, 主要完成两个任务: 创建窗口并在窗口中添加各种组件,指定组件的属性和它们在窗口中的位置,从而构成图形界面的外观效果 定义图形界面的事件和各种组件对不同事件的响应,从而实现图形界面与用户的交互
一般可按照下列流程进行 回顾 - Java的GUI设计 引入Java图形组件包 AWT、Swing 选择“外观和感觉” 设置窗体属性 设置组件布局 向窗体中添加组件 对组件进行事件处理 鼠标获得专利 – 40周年 微软win3.0(GUI) – 约20年
“交互”的实现 回顾 –实现GUI步骤示意 如何判断“按钮”变化 如何实现按下以后 的工作 窗体: Frame类对象 下拉菜单: Menu类对象 文本框: TextField类对象 “交互”的实现 如何判断“按钮”变化 如何实现按下以后 的工作 鼠标、键盘是人对计算机的输入(键盘、鼠标、按钮、菜单的等); 程序后台处理是机器的对用户输入的处理; 显示的变化是机器的反馈; 共同构成了“人-机”交互,习惯上称之为“交互事件”。 举例,word的右键弹出菜单、选中文本等。 “今天学习Java“人-机”交互的机制和实现”。 按钮: Button类对象 内容面板: Panel类对象
内容提要 内部类 事件定义 交互处理方式 事件机制 程序实现
Java中的内部类 写法是否正确? 内部类是附属于外部类的实例的,它们只能与外部类的实例一起存在。 内部类的方法可以直接访问外部类的私有变量和方法
事件概述 事件的定义 日常生活:电话铃响、门铃响、汽车启动 计算机:鼠标点击、键盘按键、窗口关闭、窗口移动、 窗口最大化、拖动、鼠标经过等
处理“人-机”交互的两种方式 两种处理方式进行比较的内容 交互处理方式分析 查询处理方式 事件处理机制 如何“查询” C等传统语言的方式 主要用于Dos等命令行环境下程序设计 事件处理机制 Java、Visual C++的方式 主要用于Windows程序和多线程程序设计 两种处理方式进行比较的内容 如何“查询” 软件设计人员的需要完成的工作 此页要改! 1.以往命令行(C语言)程序处理,不是现在windows那样同时运行多道程序, 独占资源运行,采用if…then..else…方式,判断“如果发生A则..;否则…”;如果 可能发生很多事件,则嵌套很深。”scanf时只处理键盘输入,而不处理鼠标“ 不足:这个”判断事件-选择处理方法-进行处理“ 2.Windows环境下软件,
看护小宝宝“换尿布”的方式 比 较 程序设计的思路:查询 -> 报告 两种方式比较 - 如何“查询” 传统方法:每过一会就摸摸... 如果尿布湿了,换新的 新方法:尿布自动报警器(湿敏电阻) 比 较 工作方式: 由 “监测->处理” 变为 “提醒告知” 新方法优点:提高并发度、效率 新方法缺点:提高了复杂度 (价格...) 程序设计的思路:查询 -> 报告
老板来了 员工如何实现老板来公司的监控?
“查询”方式下软件设计者要完成的工作 两种方式比较 - “程序员的工作” 例. 如何处理鼠标的多种操作 实现方式 设计工作 缺点 “查询” 对操作类型逐个比较 设计工作 判断发生交互种类 设计“处理”代码 “交互”和”处理”代码的组织方式 缺点 需编程判断交互类型 “交互”和”处理“的 代码交织在一起 While (true) do{ /*查询鼠标操作*/ } if (用户单击了鼠标左键) Then {进行方式一处理} else if (用户单击了鼠标右键) Then {进行方式二处理} else if (用户双击了鼠标左键) Then {进行方式三处理} 此页要改! 1.以往命令行(C语言)程序处理,不是现在windows那样同时运行多道程序, 独占资源运行,采用if…then..else…方式,判断“如果发生A则..;否则…”;如果 可能发生很多事件,则嵌套很深。”scanf时只处理键盘输入,而不处理鼠标“ 不足:这个”判断事件-选择处理方法-进行处理“ 2.Windows环境下软件, else . . .
老板来了 公司 ② 打电话 公司前台 确定好电话内容 通知员工 ③ 拨号 ④ 给老板检查 ① 来公司 老板
事件处理 事件处理过程 GUI界面 ② 创建 Java运行时系统 事件对象 事件处理(监听)对象 ③ 传递 ④ 回馈 ① 触发 事件源
事件概述 用户和程序的交互原理 用 户 GUI 程 序 ① 触发事件 ② 处理事件
事件驱动流程图 事件概述 开 始 处理事件 创建图形用户界面(GUI) 否 有事件处理程序 ? 等待事件 是 用指定程序 处理该事件 是 关闭程序事件 ? 结 束 处理事件 是 否 处理事件 有事件处理程序 ? 返 回 是 否 用指定程序 处理该事件
事件的构成 事件概述 以“用户点击按钮”事件来说明事件三要素: GUI界面 Java运行时系统 事件源button ① 点击 ② 创建 事件对象 事件处理(监听)对象 ③ 传递 ④ 回馈 ① 点击
2.1 事件机制的几个概念 事件源 描述人机交互中事件的来源 (EventSource) 通常是Java图形包中组件 事 件 事件源产生的交互内容,如“按下鼠标” (ActionEvent) 在 java.awt.event包中定义的类 事件监听器 接收事件并进行处理,由程序员编写 (ActionListener) 对应处理所监听事件源产生的事件 监听器接口 编写“事件监听器”的“规定” – “抽象方法” 必须在监听器类中实现这些方法完成事件处理 监听器注册 将事件监听器对象绑定到事件源,进行监听
事件程序实现
事件处理过程 AWT、SWING 事件对象 事件源 监听器注册 监听器 监听器接口 ActionEvent e 事件对象 事件源 监听器注册 监听器 监听器接口 class ButtonListener implements ActionListener { public void actionPerformed( ) { /** 按钮事件所进行的具体工作 **/ }
事件类型 典型触发动作 2.2 常用事件类 ActionEvent 按钮、列表双击、单击菜单项目 KeyEvent 键盘的输入 MouseEvent 鼠标拖动、移动、单击、按下、释放或者进入、退出组件的事件 ComponentEvent 组件被隐藏、移动、尺寸调整或变为不可见的事件 FocusEvent 组件获得或失去焦点的事件 InputEvent 复选框和列表项单击、控件的选择和可选菜单项的选择事件 TextEvent 文本区域或者文本区域的值的改动 WindowEvent 窗口激活、失去活动窗口、最小化、最小化、打开、关闭或者退出的事件
AWT:事件类包含在java.awt.event中 Swing:事件类包含在javax.swing.event中 java.util.EventObject类是所有事件类的父类 粉色标记为“高级事件” 蓝色标记为“低级事件”
事件类的继承层次关系 “事件”的编程实现: 基于Java封装的系统类 详细内容见软件包 java.awt.event
2.3 事件监听器 如何编程实现监听器 ? 每一个事件类都有唯一的事件处理方法接口, 例如,对于处理鼠标事件“ActionEvent”类的对应 接口为“ActionListener” 每一个接口中都已经规定了一个空的抽象方法 在该方法中编码实现自己想做的的工作 事件监听器设计进行的两步工作 1.实现监听器 2.绑定到组件
Java语言中没有提供专门的事件监听器类,而是提供包含事件处理方法的监听器接口 事件监听器接口 Java语言中没有提供专门的事件监听器类,而是提供包含事件处理方法的监听器接口 针对不同的事件类,提供了不同的事件监听器接口 例如:与键盘事件KeyEvent对应的监听器接口为:KeyListener public interface KeyListener extends EventListener { public void keyPressed(KeyEvent ev); public void keyReleased(KeyEvent ev); public void keyTyped(KeyEvent ev); } 说 明: java.util.EventListener是所有事件监听器接口的父接口; 在KeyListener接口中定义了三个抽象方法: (1)当键盘按键被按下时,将调用keyPressed()方法来处理事件; (2)当键盘按键弹起时,将调用keyReleased()方法来处理事件; (3)当键盘按键被敲击(按下并迅速弹起)时,将调用keyTyped()方法来处理事件。 注:事件监听器接口是系统已经定义好的,用户不需要自行定义。
事件类型 典型动作 2.3 常用事件监听器类 ActionListener 处理按钮、列表双击、单击菜单项目 KeyListener 处理键盘的输入 MouseListener 处理鼠标拖动、移动、单击、按下、释放或者进入、退出组件的事件 ComponetListener 处理组件被隐藏、移动、尺寸调整或者变为不可见的事件 FocusListener 处理组件获得或失去焦点的事件 TextListener 处理文本区域或者文本区域的值的改动 WindowListener 处理窗口激活、失去活动窗口、最小化、最小化、打开、关闭或者退出的事件
如何编程实现监听器 ? 2.3 事件监听器 专业训练 医 生 掌握医疗技术 普通人 监听器类 实现指定接口 指定抽象方法 自编类 如何编程实现监听器 ? 医 生 专业训练 掌握医疗技术 普通人 监听器类 实现指定接口 指定抽象方法 自编类 事件监听器设计进行的两步工作 1.实现监听器 2.绑定到组件
“事件源-监听器-抽象方法”对应 事件类型 监听器名称 抽象方法 (必须实现) ActionListener ActionEvent ActionListener actionPerformed(ActionEvent) KeyEvent (键盘事件) KeyListener (键盘监听器) 按 下 释 放 按+放 MouseEvent (鼠标事件) MouseMotionListener (鼠标移动监听器) 移 动 拖 动 MouseListener (鼠标按键监听器) 进 入 退 出 . . . keyPressed(keyEvent) keyReleased(keyEvent) keyTyped(keyEvent) mouseMoved(MouseEvent) mouseDragged(MouseEvent) mousePressed(mouseEvent) mouseReleased(mouseEvent) mouseEntered(mouseEvent) mouseExited(mouseEvent)
事件模型组件 例:定义KeyEvent监听器类 public class 监听器类名 implements KeyListener { public void keyPressed(KeyEvent ev) System.out.println(“键盘被按下!”); } public void keyReleased(KeyEvent ev) public void keyTyped(KeyEvent ev)
通过观察 “addxxxListener” 方法的名称, 可以很容易地知道其能够处理的事件类型 事件监听器.续 如何将监听器绑定到组件 ? 每个组件都提供了用于绑定监听器的方法 通过观察 “addxxxListener” 方法的名称, 可以很容易地知道其能够处理的事件类型 绑 定 “binding”
注册事件监听器 注册监听器语法: 注销监听器语法: 事件源对象 . addXxxListener (XxxListener对象); 事件源对象 . removeXxxListener (XxxListener对象);
单事件源的“多个事件” 学生可发生多种事件 学生的生活中,可能发生... 开导帮助 讲 解 “噗!” “哎呦...” 生病了 学习困难 生活困难 讲 解 开导帮助
分析: “单事件源-多事件”处理 学 生 事件源 事 件 监听器 治 疗 开导帮助 讲 解 左键 单击 鼠标 监听 鼠标操作 键入 文本 学习问题 生活困难 生 病 教 师 辅导员 医 生 治 疗 开导帮助 讲 解 事件源 文本框 左键 单击 鼠标 监听 鼠标操作 键入 文本 按键 监听 输入文本 变换 焦点 监听 焦点变换 事 件 监听器 具体工作
getSource()方法得到发生点击事件的按钮对象。 if(e.getSource == btnOK) … 事件处理 getSource()方法得到发生点击事件的按钮对象。 if(e.getSource == btnOK) … getActionCommand()方法得到被点击按钮的文字。 if(e.getActionCommand().equals(“确定“))
按钮事件处理示例 import javax.swing.*; import java.awt.event.*; public class MyFrame extends JFrame implements ActionListener{ JButton btnOK,btnCancel; JLabel lab; MyFrame(String s){ super(s);setSize(200,200);this.setLocationRelativeTo(null); JPanel pan = new JPanel();setContentPane(pan); btnOK = new JButton("OK"); btnOK.addActionListener(this); btnCancel = new JButton("Cancel"); btnCancel.addActionListener(this); lab = new JLabel(" "); pan.add(btnOK); pan.add(btnCancel); pan.add(lab); this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); setVisible( true ); } public void actionPerformed(ActionEvent e){ if(e.getSource()==btnOK) lab.setText("点击了确定按钮"); if(e.getActionCommand() .equals("Cancel")) lab.setText("点击了取消按钮");
事件处理 实现事件处理的步骤 创建事件监听器类 创建事件监听器对象 注册事件监听器
匿名类的方式实现事件处理
匿名类 匿名类的定义 顾名思义就是未被命名的类 匿名类的特征 在程序中只使用(即:被实例化)一次
事件适配器类的特征 事件适配器类 适配器类就是一个特殊的事件监听器类 Java语言只针对包含多个抽象方法的监听器接口,提供了相应的XXXAdapter(适配器) 比如:WindowListener接口的适配器类是WindowAdapter
程序功能需求 解决方法 程序设计.例一 绘制一个窗体 窗体内绘制一个按钮,名为“点我” 按下按钮时,在命令行打印信息 打印内容为 “我知道你按下按钮啦!” 解决方法 设计自己的带有按钮的窗体类 (派生自Java.awt.Frame类) 设计自己的按钮事件监听器类 (实现ActionListener接口、并完成ActionPerformed方法) 创建按钮事件监听器类对象,并绑定到“按钮”上 (调用按钮类的 addActionListener方法)
事件处理例1.代码 设计自己的窗体类 按钮 事件源 注册监听器 主类 监听器类 import java.awt.*; import java.awt.event.*; class ButtonListener implements ActionListener { public void actionPerformed ( ActionEvent e ) { System.out.println ( “我知道你按下按钮啦“ ); } 按钮 窗体 主类 监听器 监听器类 class myButtonFrame extends Frame { Button btn; myButtonFrame(String s) { //构造函数 super(s); this.setSize(200,120); /* 创建按钮*/ btn = new Button("点击"); this.add(btn); // 事件监听器创建和注册 ButtonListener bl = new ButtonListener(); btn.addActionListener(bl); } 设计自己的窗体类 按钮 事件源 注册监听器 public class ActionEventTest { // 主类 public static void main(String args[]){ myButtonFrame frm = new myButtonFrame("ActionEventTest"); frm.show(); // 显示窗体 } 主类
程序设计. 例一. 运行结果
菜单组件 菜单和对话框 不能将菜单组件直接添加到一般的容器中 不能使用布局管理器对它们进行布局 AWT提供的菜单机制是这样的:一个容器包含一个菜单条,一个菜单条中包含多个菜单,一个菜单中包含多个菜单或菜单项 和菜单相关的组件有四个:MenuBar, Menu, MenuItem, CheckboxMenuItem.
菜单条(MenuBar) 一个菜单条组件是一个水平容器,并作为所有菜单树的根。 一个窗体中只可以显示一个菜单条。 菜单条不能注册任何监听者。 例如: Frame fr = new Frame(); MenuBar mb = new MenuBar(); f.setMenuBar(mb)
菜单(Menu) 菜单组件提供了一个基本的下拉式菜单,它可以加入到一个菜单条或者另一个菜单中。 例如: MenuBar mb = new MenuBar(); Menu mu1 = new Menu(“File”); Menu mu2 = new Menu(“Edit”); mb.add(mu1); mb.add(mu2); f.setMenuBar(mb);
菜单项(MenuItem) 菜单项组件通常被加入到菜单中,以构成一个完整的菜单。 通常,将一个ActionListener注册到一个菜单项对象中,接收和处理选中菜单项的事件。 例如: Menu mu = new Menu(“File”); MenuItem mi1 = new MenuItem(“New”); MenuItem mi2 = new MenuItem(“Load”); mu.add(mi1); mu.add(mi2);
本节课我们学习了 经验与建议 事件机制的功能 (Why: 为什么需要…) 事件机制架构和流程 (What:什么是…) 事件机制的编程实现 (How: 怎么创建…) 经验与建议 “最有用” 的Java资料 – JDK API手册 “最有效” 的学习方法 – 亲手编程、调试
作业与练习 如何来制作图形界面?它需要引入哪些包 在java中,什么是事件?简述处理事件的机制。 什么是布局管理器,它有什么作用? 请编写一个窗口来实现BorderLayout的布局。 请说明FlowLayout布局方式的特点? GridLayout布局的特点有哪些?
2018/11/6 谢谢