第9章 GUI_补充案例

更新时间:2023-03-08 10:08:45 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

博学谷——让IT教学更简单,让IT学习更有效

第九章 GUI

案例9-1 AWT事件处理机制

一、案例描述

1、 考核知识点

编号:00109002

名称:AWT事件处理机制

2、 练习目标

? 掌握如何使用AWT事件处理机制

3、 需求分析

事件处理机制专门用于响应用户的操作,比如,想要响应用户的点击鼠标、按下键盘等操作,就需要使用AWT的事件处理机制。为了让初学者熟悉AWT的事件处理机制,本案例将实现关闭一个窗口的功能。

4、 设计思路(实现原理)

1)编写类Example01

2)建立一个窗体,名为“第一个窗体”

3)定义一个类MyWindowListener实现事件监听器的接口WindowListener。 4)通过addWindowListener()方法为事件源注册事件监听器对象。

二、案例实现

import java.awt.*; import java.awt.event.*; public class Example01 {

public static void main(String[] args) { }

1

// 建立新窗体

Frame f = new Frame(\第一个窗体!\// 设置窗体的宽和高 f.setSize(300, 300); // 设置窗体的出现的位置 f.setLocation(300, 200); // 设置窗体可见 f.setVisible(true); // 为窗口组件注册监听器 f.addWindowListener(mw);

MyWindowListener mw=new MyWindowListener();

博学谷——让IT教学更简单,让IT学习更有效

}

// 创建MyWindowListener类实现WindowListener接口 class MyWindowListener implements WindowListener { }

// 监听器监听事件对象作出处理

public void windowClosing(WindowEvent e) { }

public void windowActivated(WindowEvent e) { }

public void windowClosed(WindowEvent e) { }

public void windowDeactivated(WindowEvent e) { }

public void windowDeiconified(WindowEvent e) { }

public void windowIconified(WindowEvent e) { }

public void windowOpened(WindowEvent e) { }

Window window = e.getWindow(); window.setVisible(false); // 释放窗口

window.dispose();

运行结果如图9-1所示。

图9-1 第一个窗体

点击窗体右上角的关闭按钮,窗体关闭。

三、案例总结

1、在AWT事件处理机制中几个比较重要的相关概念,具体如下所示: ? 事件对象(Event):封装了GUI组件上发生的特定事件(通常就是用户的一次操作)。 ? 事件源(组件):事件发生的场所,通常就是产生事件的组件。 ? 监听器(Listener):负责监听事件源上发生的事件,并对各种事件做出响应处理的对象(对象中包

2

博学谷——让IT教学更简单,让IT学习更有效

含事件处理器)。

? 事件处理器:监听器对象对接收的事件对象进行相应处理的方法。 2、事件对象、事件源、监听器、事件处理器在整个事件处理机制中都起着非常重要的作用,它们彼此之间有着非常紧密的联系,接下来用一个图例来描述事件处理的工作流程,如图9-2所示。

外部动作事件对象2.触发事件源上的事件3.产生并传递事件对象4.接收事件对象,激活事件处理器,实现预定功能事件源(组件)1.将监听器注册到事件源监听器(含处理器) 图9-2 事件处理流程图 图9-2中,事件源是一个组件,当用户进行一些操作时,如按下鼠标,或者释放键盘等,这些动作会触发相应的事件。如果事件源注册了事件监听器,则触发的相应事件将会被处理。

案例9-2 使用适配器类改进窗体关闭 一、案例描述

1、 考核知识点

编号:00109003

名称:AWT事件适配器

2、 练习目标

? 掌握如何使用AWT事件适配器。

3、 需求分析

JDK提供了一些适配器类,它们是监听器接口的默认实现类,这些实现类中实现了接口的所有方法,但方法中没有任何代码。程序可以通过继承适配器类来达到实现监听器接口的目的。为了让初学者熟悉AWT事件适配器,本案例将使用AWT事件适配器优化窗体关闭代码。

4、 设计思路(实现原理)

1)编写Example02类

2)建立一个窗体,名为“第一个窗体”

3)定义一个MyWindowListener类继承适配器类WindowAdapter。 4)重写适配器类中的windowClosing()方法

二、案例实现

import java.awt.*; import java.awt.event.*; public class Example02 {

3

博学谷——让IT教学更简单,让IT学习更有效

}

// 继承WindowAdapter类,重写windowClosing()方法 class MyWindowListener extends WindowAdapter { }

public void windowClosing(WindowEvent e) { }

Window window = (Window) e.getComponent(); window.dispose();

public static void main(String[] args) { }

// 建立新窗体

Frame f = new Frame(\第一个窗体!\// 设置窗体的宽和高 f.setSize(300, 300); // 设置窗体的出现的位置 f.setLocation(300, 200); // 设置窗体可见 f.setVisible(true); // 为窗口组件注册监听器

f.addWindowListener(new MyWindowListener());

运行结果如图9-3所示。

图9-3 运行结果

点击窗体右上角的关闭按钮,窗体关闭。

三、案例总结

在本案例中定义的MyWindowListener类继承了适配器类WindowAdapter,同样实现了关闭窗口的功能,却减少了很多代码。需要注意的是,几乎所有的监听器接口都有对应的适配器类,通过继承适配器类来实现监听器接口时,需要处理哪种事件,直接重写该事件对应的方法即可。由于适配器主要是为了减少不必要的代码,所以在方法数不超过3个时候,不需要继承适配器类。

4

博学谷——让IT教学更简单,让IT学习更有效

案例9-3 窗体事件 一、案例描述

1、 考核知识点

编号:00109004 名称:窗体事件

2、 练习目标

? 掌握窗体事件的处理

3、 需求分析

当对窗体进行操作时,比如窗体的打开、关闭、激活、停用等,这些动作都属于窗体事件,JDK中提供了一个类WindowEvent用于表示这些窗体事件。为了让初学者掌握窗体事件的处理,本案例将实现对窗体事件的监听。

4、 设计思路(实现原理)

1) 编写类Example03,创建一个窗体。 2) 创建WindowListener实例对象。

3) 通过addWindowListener()方法将窗体对象与窗体监听器绑定。 4)运行程序,对生成的窗体操作,观察控制台输出的内容。

二、案例实现

编写Example03类,代码如下所示:

import java.awt.*; import java.awt.event.*; public class Example03 {

public static void main(String[] args) {

final Frame f = new Frame(\窗体事件\f.setSize(400,300); f.setLocation(300,200); f.setVisible(true);

f.addWindowListener(new WindowListener() {

public void windowOpened(WindowEvent e) { }

public void windowActivated(WindowEvent e) {

}

public void windowIconified(WindowEvent e) { }

public void windowDeiconified(WindowEvent e) {

5

System.out.println(\窗体图标化\System.out.println(\窗体激活\System.out.println(\窗体打开\

// 使用内部类创建WindowListener实例对象,监听窗体事件

博学谷——让IT教学更简单,让IT学习更有效

4、 设计思路(实现原理)

1) 编写类Example06,创建一个名为“流式布局”的窗体。 2) 设置窗体中的布局管理器为FlowLayout。

3) 创建1个按钮,并为按钮添加点击事件,每点击一次按钮就再生成新的按钮。

二、案例实现

import java.awt.*; import java.awt.event.*; public class Example06 { }

public static void main(String[] args) { }

final Frame f = new Frame(\流式布局\创建一个名为流式布局的窗体

// 设置窗体中的布局管理器为FlowLayout,所有组件左对齐,水平间距为25,垂直间距为25 f.setLayout(new FlowLayout(FlowLayout.LEFT, 25, 25)); f.setSize(200, 300); // 设置窗体大小 f.setLocation(300, 200); // 设置窗体显示的位置 Button but1 = new Button(\创建第1个按钮

f.add(but1); // 把\第1个按钮\添加到f窗口 // 下面的代码是每点击一次“1”就向窗体中添加一个按钮

but1.addActionListener(new ActionListener() { // 动作事件为第1个按钮添加点击事件

private int num = 1; // 定义变量num,记录按钮的个数 public void actionPerformed(ActionEvent e) { }

f.add(new Button(++num));// 向窗体中添加新按钮

// f.setVisible(true); // 刷新窗体显示新按钮

});

f.setVisible(true); // 设置窗体可见

运行结果如图3-8所示。

11

博学谷——让IT教学更简单,让IT学习更有效

图9-9 运行结果

三、案例总结

1、FlowLayout布局管理器的特点就是可以将所有组件像流水一样依次进行排列,不需要用户明确的设定,但是在灵活性上相对差了点。

2、FlowLayout对象有三个构造方法,如下表所示。 方法声明 FlowLayout() FlowLayout(int align) 功能描述 组件默认居中对齐,水平、垂直间距默认为5个单位 指定组件相对于容器的对齐方式,水平、垂直间距默认为5个单位 FlowLayout(int align,int hgap,int vgap) 指定组件的对齐方式和水平、垂直间距 案例9-7 BorderLayout布局管理器 一、案例描述

1、 考核知识点

编号:00109009

名称:BorderLayout布局管理器

2、 练习目标

? 掌握BorderLayout布局管理器的使用

3、 需求分析

BorderLayout(边界布局管理器)是一种较为复杂的布局方式,它将容器划分为五个区域,分别是东(EAST)、南(SOUTH)、西(WEST)、北(NORTH)、中(CENTER)。为了让初学者熟悉BorderLayout布局,本案例演示一下BorderLayout布局管理器对组件布局的效果。

4、 设计思路(实现原理)

1) 编写类Example07,创建一个名为“边界布局”的窗体 2) 设置窗体中的布局管理器为BorderLayout

3) 创建5个按钮,分别用于填充BorderLayout的5个区域 4) 将创建好的按钮添加到窗体中,并设置按钮所在的区域

二、案例实现

import java.awt.*; public class Example07 {

public static void main(String[] args) {

final Frame f = new Frame(\边界布局\

f.setLayout(new BorderLayout()); // 设置窗体中的布局管理器 f.setSize(300,300);

12

博学谷——让IT教学更简单,让IT学习更有效

}

}

f.setLocation(300, 200); f.setVisible(true);

Button but1 = new Button(\东\// 创建新按钮 Button but2 = new Button(\西\Button but3 = new Button(\南\Button but4 = new Button(\北\Button but5 = new Button(\中\f.add(but1,BorderLayout.EAST); f.add(but2,BorderLayout.WEST); f.add(but3,BorderLayout.SOUTH); f.add(but4,BorderLayout.NORTH); f.add(but5,BorderLayout.CENTER);

// 设置按钮所在区域

运行结果如图9-10所示。

图9-10 运行结果

三、案例总结

1、在BorderLayout布局管理器中,组件组件可以被放置在这五个区域的中任意一个。BorderLayout

布局的效果如图9-11所示。

图9-11 BorderLayout效果图

13

博学谷——让IT教学更简单,让IT学习更有效

BorderLayout的好处就是可以限定各区域的边界,当用户改变容器窗口大小时,各个组件的相对位置不变。但需要注意的是,向BorderLayout的布局管理器添加组件时,如果不指定添加到哪个区域,则默认添加到CENTER区域,并且每个区域只能放置一个组件,如果向一个区域中添加多个组件时,后放入的组件会覆盖先放入的组件。

案例9-8 GridLayout布局管理器 一、案例描述

1、 考核知识点

编号:00109010

名称:GridLayout布局管理器

2、 练习目标

? 掌握GridLayout布局管理器的使用

3、 需求分析

GridLayout(网格布局管理器)使用纵横线将容器分成n行m列大小相等的网格,每个网格中放置一个组件。为了让初学者熟悉GridLayout布局管理器,本案例将演示GridLayout布局的用法。

4、 设计思路(实现原理)

1) 编写类Example08,创建一个名为\网格布局\的窗体。 2) 设置该窗体为4*3的网格。

3) 循环添加12个按钮到GridLayout中

二、案例实现

import java.awt.*; public class Example08 { }

public static void main(String[] args) { }

Frame f = new Frame(\网格布局\

f.setLayout(new GridLayout(4, 3));// 设置该窗体为4*3的网格 f.setSize(300, 300); // 设置窗体大小 f.setLocation(400, 300);

// 下面的代码是循环添加12个按钮到GridLayout中 for (int i = 1; i <= 12; i++) { }

f.setVisible(true);

Button btn = new Button(\f.add(btn); // 向窗体中添加按钮

运行结果如图9-12所示。

14

博学谷——让IT教学更简单,让IT学习更有效

图9-12 运行结果

三、案例总结

1、GridLayout中有三个构造方法,如下所示。 方法声明 GridLayout() GridLayout(int rows,int cols) GridLayout(int rows,int cols,int hgap,int vgap) 指定容器的行数和列数 指定容器的行数和列数以及组件之间的水平、垂直间距 功能描述 默认只有一行,每个组件占一列 2、GridLayout布局管理器的特点是组件的相对位置不随区域的缩放而改变,但组件的大小会随之改变,组件始终占据网格的整个区域。缺点就是总是忽略组件的最佳大小,所有组件的宽高都相同。

案例9-9 GridBagLayout布局管理器 一、案例描述

1、 考核知识点

编号:00109011

名称:GridBagLayout布局管理器

2、 练习目标

? 掌握GridBagLayout布局管理器的使用。

3、 需求分析

GridBagLayout(网格包布局管理器)是最灵活、最复杂的布局管理器。与GridLayout布局管理器类似,不同的是,它允许网格中的组件大小各不相同,而且允许一个组件跨越一个或者多个网格。为了让初学者熟悉 GridBagLayout的布局,本案例将来演示GridBagLayout的用法。

4、 设计思路(实现原理)

1)定义一个类Layout继承自Frame类 2)使用网格包布局管理器

15

博学谷——让IT教学更简单,让IT学习更有效

3)创建六个按钮以不同的占位分布

4)编写Example09类,创建Layout类的实例

二、案例实现

编写Example09类,代码如下所示:

import java.awt.*;

class Layout extends Frame {

public Layout(String title) { }

// 增加组件的方法

private void addComponent(String name, GridBagLayout layout,

GridBagConstraints c) {

GridBagLayout layout = new GridBagLayout(); GridBagConstraints c = new GridBagConstraints(); this.setLayout(layout);

c.fill = GridBagConstraints.BOTH; // 设置组件横向纵向可以拉伸 c.weightx = 1; // 设置横向权重为1 c.weighty = 1; // 设置纵向权重为1 this.addComponent(\this.addComponent(\this.addComponent(\

c.gridwidth = GridBagConstraints.REMAINDER; // 添加的组件是本行最后一个组件 this.addComponent(\

c.weightx = 0; // 设置横向权重为0 c.weighty = 0; // 设置纵向权重为0 addComponent(\

c.gridwidth = 1; // 设置组件跨一个网格(默认值) this.addComponent(\

c.gridwidth = GridBagConstraints.REMAINDER; // 添加的组件是本行最后一个组件 this.addComponent(\c.gridheight = 2; // 设置组件纵向跨两个网格 c.gridwidth = 1; // 设置组件横向跨一个网格 c.weightx = 2; // 设置横向权重为2 c.weighty = 2; // 设置纵向权重为2 this.addComponent(\c.gridwidth = GridBagConstraints.REMAINDER; c.gridheight = 1;

this.addComponent(\this.addComponent(\this.pack();

this.setVisible(true);

Button bt = new Button(name); // 创建一个名为name的按钮

16

博学谷——让IT教学更简单,让IT学习更有效

}

public class Example09 { }

public static void main(String[] args) { }

new Layout(\ }

layout.setConstraints(bt, c); // 设置GridBagConstraints对象和按钮的关联 this.add(bt); // 增加按钮

运行结果如图9-13所示。

图9-13 运行结果

从运行结果可以看到,程序正常执行。

三、案例总结

使用GridBagLayout布局管理器的步骤如下:

1、创建GridbagLayout布局管理器,并使容器采用该布局管理器。

GridBagLayout layout = new GridBagLayout(); container.setLayout(layout);

2、创建GridBagContraints对象(布局约束条件),并设置该对象的相关属性。

GridBagConstraints constraints = new GridBagConstraints(); constraints.gridx = 1; // 设置网格的左上角横向索引 constraints.gridy = 1; // 设置网格的左上角纵向索引 constraints.gridwidth = 1; // 设置组件横向跨越的网格 constraints.gridheight = 1; // 设置组件纵向跨越的网格

3、调用GridBagLayout对象的setConstraints()方法建立GridBagConstraints对象和受控组件之间的关联。

layout.setConstraints(component,constraints);

4、向容器中添加组件

container.add(conponent);

GridBagConstraints对象可以重复使用,只需要改变它的属性即可。如果要向容器中添加多个组件,则重复2、3、4步骤。

17

博学谷——让IT教学更简单,让IT学习更有效

案例9-10 CardLayout布局管理器 一、案例描述

1、 考核知识点

编号:00109012

名称:CardLayout布局管理器

2、 练习目标

? 掌握CardLayout布局管理器的使用

3、 需求分析

在操作程序时,我们经常会通过选项卡按钮来切换程序中的界面,这些界面就相当于一张张卡片,而管理这些卡片的布局管理器就是卡片布局管理器(CardLayout)。为了让初学者熟悉CardLayout布局管理器,本案例将演示CardLayout中常用方法的使用。

4、 设计思路(实现原理)

1)定义类Cardlayout继承Frame类,实现ActionListener接口

2)在该类中定义Panel面板放置卡片,再定义一个Panel面板放置按钮

3)定义卡片布局对象,在卡片面板中添加2个文本标签分别为“传智播客”和“黑马程序员” 4)定义一个方法实现按钮的监听触发,并对触发事件做出相应的处理 5)编写类Example10,创建Cardlayout实例

二、案例实现

定义Example10类,代码如下所示:

import java.awt.*; import javax.swing.*; import java.awt.event.*;

//定义Cardlayout继承Frame类,实现ActionListener接口

class Cardlayout extends Frame implements ActionListener {

Panel cardPanel = new Panel(); // 定义Panel面板放置卡片 Panel controlpaPanel = new Panel(); // 定义Panel面板放置按钮 CardLayout cardLayout = new CardLayout();// 定义卡片布局对象

public Cardlayout() { // 定义构造方法,设置卡片布局管理器的属性

setSize(300, 200); setVisible(true); // 为窗口添加关闭事件监听器

this.addWindowListener(new WindowAdapter() {

public void windowClosing(WindowEvent e) { }

Cardlayout.this.dispose();

Button nextbutton, preButton;

});

cardPanel.setLayout(cardLayout); // 设置cardPanel面板对象为卡片布局

18

博学谷——让IT教学更简单,让IT学习更有效

}

public class Example10 { }

public static void main(String[] args) { }

Cardlayout cardlayout = new Cardlayout(); }

// 下面的代码实现了按钮的监听触发,并对触发事件做出相应的处理 public void actionPerformed(ActionEvent e) { }

// 如果用户单击nextbutton,执行的语句 if (e.getSource() == nextbutton) {

// 切换cardPanel面板中当前组件之后的一个组件,若当前组件为最后一个组件,则显示第一个组件。 }

if (e.getSource() == preButton) {

// 切换cardPanel面板中当前组件之前的一个组件,若当前组件为第一个组件,则显示最后一个组件。 }

cardLayout.previous(cardPanel); cardLayout.next(cardPanel); // 在cardPanel面板对象中添加2个文本标签

cardPanel.add(new Label(\传智播客\cardPanel.add(new Label(\黑马程序员\// 创建两个按钮对象

nextbutton = new Button(\下一张卡片\preButton = new Button(\上一张卡片\// 为按钮对象注册监听器

nextbutton.addActionListener(this); preButton.addActionListener(this); // 将按钮添加到controlpaPanel中 controlpaPanel.add(preButton); controlpaPanel.add(nextbutton);

// 将cardPanel面板放置在窗口边界布局的中间,窗口默认为边界布局 this.add(cardPanel, BorderLayout.CENTER); // 将controlpaPanel面板放置在窗口边界布局的南区, this.add(controlpaPanel, BorderLayout.SOUTH);

运行结果如图9-14所示。

19

博学谷——让IT教学更简单,让IT学习更有效

图9-14 运行结果

三、案例总结

卡片布局管理器将界面看做一系列卡片,在任何时候只有其中一张卡片是可见的,这张卡片占据容器的整个区域。在CardLayout布局管理中经常会用到下面几个方法,如下表所示。 方法声明 void first(Container parent) void last(Container parent) void previous(Container parent) void next(Container parent) void show(Container parent, String name)

功能描述 显示parent容器的第一张卡片 显示parent容器的最后一张卡片 显示parent容器的前一张卡片 显示parent容器的下一张卡片 显示parent容器中名称为name的组件,如果不存在,则不会发生任何操作。 案例9-11 AWT绘图 一、案例描述

1、 考核知识点

编号:00109013 名称:Graphics类

2、 练习目标

? 掌握使用Graphics类中的方法在组件上绘制图形

3、 需求分析

很多GUI程序都需要在组件上绘制图形,在java.awt包中专门提供了一个Graphics类,它相当于一个抽象的画笔,其中提供了各种绘制图形的方法。为了让初学者掌握在组件上绘制图形,本案例将演示如何使用Graphics类中的方法。

4、 设计思路(实现原理)

1)编写类Example11,创建Frame对象。

2)设计类MyPanel继承类Panel,用于画验证码。 3)设置验证码的背景颜色、字体颜色以及画干扰点。

4)从“0123456789abcdefghijkmnopqrstuvwxyzABCDEFG”中每次产生四个随机数

20

博学谷——让IT教学更简单,让IT学习更有效

二、案例实现

import java.awt.*; import java.awt.event.*; import java.util.Random; public class Example11 { }

class MyPanel extends Panel {

public void paint(Graphics g) {

int width = 200; // 定义验证码图片的宽度 int height = 60; // 定义验证码图片的高度

g.setColor(Color.LIGHT_GRAY); // 设置上下文颜色 g.fillRect(0, 0, width, height); // 填充验证码背景 g.setColor(Color.blue); // 设置上下文颜色 g.drawRect(0, 0, width - 1, height - 1); // 绘制边框 // 绘制干扰点

Random r = new Random();

for (int i = 0; i < 100; i++) { }

g.setFont(new Font(\黑体\设置验证码字体 g.setColor(Color.red); // 设置验证码颜色 // 产生随机验证码

char[] chars = (\

+ \

StringBuilder sb = new StringBuilder(); for (int i = 0; i < 4; i++) { }

g.drawString(sb.toString(), 20, 30); // 写入验证码

21

int pos = r.nextInt(chars.length); char c = chars[pos]; sb.append(c + \

int x = r.nextInt(width) - 2; int y = r.nextInt(height) - 2; g.drawOval(x, y, 2, 2);

public static void main(String[] args) { }

final Frame frame = new Frame(\验证码\创建Frame对象 final Panel panel = new MyPanel(); // 创建Canvas对象 frame.add(panel);

frame.setSize(300, 150); // 将Frame窗口居中

frame.setLocationRelativeTo(null); frame.setVisible(true);

博学谷——让IT教学更简单,让IT学习更有效

}

}

运行结果如图9-15所示。

图9-15 运行结果

三、案例总结

Graphics类中提供了各种绘制图形的方法,使用Graphics类的方法就可以完成在组件上绘制图形。下表列出了Graphic类中常用的方法。

方法声明 void setColor(Color c) void setFont(Font f) void drawLine(int x1,int y1, int x2,int y2) 方法描述 将此图形上下文的当前颜色设置为指定颜色 将此图形上下文的字体设置为指定字体 以(x1,y1)和(x2,y2)为端点绘制一条线段 void drawRect(int x, int y, int width, 绘制指定矩形的边框。矩形的左边缘和右边缘分别位于 x 和 int height) x + width。上边缘和下边缘分别位于 y 和 y + height 绘制椭圆的边框。得到一个圆或椭圆,它刚好能放入由x、y、void drawOval(int x, int y, int width, width 和 height 参数指定的矩形中。椭圆覆盖区域的宽度为 int height) width + 1 像素,高度为 height + 1 像素 void fillRect (int x,int y, int width, 用当前颜色于填充指定的矩形。该矩形左边缘和右边缘分别位于 int height) x 和 x + width - 1。上边缘和下边缘分别位于 y 和 y + height – 1 void fillOval(int x,int y,int width, int height) void drawString (String str, int x, int y) 用当前颜色填充外接指定矩形框的椭圆 使用此图形上下文的当前字体和颜色绘制指定的文本str。最左侧字符左下角位于 (x, y) 坐标 案例9-12 Jdialog类 一、案例描述

1、 考核知识点

编号:00109015 名称:Jdialog类

2、 练习目标

? 掌握Jdialog类的使用

22

博学谷——让IT教学更简单,让IT学习更有效

3、 需求分析

JDialog对话框可分为两种:模态对话框和非模态对话框。所谓模态对话框是指用户需要等到处理完对话框后才能继续与其它窗口交互,为了方便初学者掌握Jdialog类的使用,本案例将演示JDialog对话框中的模态对话框的使用。

4、 设计思路(实现原理)

1)编写类Example12,创建一个名为“模式对话框测试”的窗体。 2)写一个按钮,点击按钮弹出模式对话框。

3)编写Example12类,在类的main()方法中调用Inner类中的变量和方法。

4)定义一个JDialog对话框,在对话框中定义一个按钮,点击按钮关闭模式对话框

二、案例实现

import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Example12 {

public static void main(String[] args) {

JButton btn = new JButton(\模式对话框\JFrame f = new JFrame(\模式对话框测试\f.setSize(300, 250); f.setLocation(300, 200);

f.setLayout(new FlowLayout()); // 为内容面板设置布局管理器 // 在Container对象上添加按钮 f.add(btn);

// 设置点击关闭按钮默认关闭窗口

f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true);

final JLabel label = new JLabel();

final JDialog dialog = new JDialog(f, \模式对话框\定义一个JDialog对话框 dialog.setSize(220, 150); // 设置对话框大小 dialog.setLocation(350, 250); // 设置对话框位置 dialog.setLayout(new FlowLayout()); // 设置布局管理器 final JButton btn2 = new JButton(\确定\创建按钮对象 dialog.add(btn2); // 在对话框的内容面板添加按钮 // 为\模态对话框\按钮添加点击事件

btn.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

// 设置对话框为模态 dialog.setModal(true);

// 如果JDialog窗口中没有添加了JLabel标签,就把JLabel标签加上 if (dialog.getComponents().length == 1) { }

23

dialog.add(label);

博学谷——让IT教学更简单,让IT学习更有效

}

}

}

// 否则修改标签的内容

label.setText(\模式对话框,点击确定按钮关闭\// 显示对话框

dialog.setVisible(true);

});

运行结果如图9-16所示。

图9-16 运行结果

三、案例总结

对话框是模态或者非模态,可以在创建Dialog对象时为构造方法传入参数来设置,也可以在创建JDialog对象后调用它的setModal()方法来进行设置,JDialog常见的构造方法如下表所示。 方法声明 JDialog(Frame owner) JDialog(Frame owner,String title) 功能描述 构造方法,用来创建一个非模态的对话框,owner为对话框所有者(顶级窗口JFrame) 构造方法,创建一个具有指定标题的非模态对话框 JDialog(Frame owner,boolean modal) 创建一个有指定模式的无标题对话框 案例9-13 JFrame组件 一、案例描述

1、 考核知识点

编号:00109016 名称:JFrame组件

2、 练习目标

? 掌握JFrame组件的使用

3、 需求分析

在Swing组件中,最常见的一个就是JFrame,它是一个独立存在的顶级窗口,不能放置在其

24

博学谷——让IT教学更简单,让IT学习更有效

它容器之中,JFrame支持通用窗口所有的基本功能,例如窗口最小化、设定窗口大小等等。为了让初学者掌握JFrame组件的使用,本案例将演示JFrame的效果。

4、 设计思路(实现原理)

1)编写Example13类继承JFrame类。 2)创建一个title为“JFrame”的窗体。

3)在窗体中创建一个按钮,使用setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)方法,设置点击按钮关闭窗口的操作。

二、案例实现

1、定义Example13类,代码如下所示:

import java.awt.FlowLayout; import java.awt.event.*; import javax.swing.*;

public class Example13 extends JFrame{ public Example15(){ this.setTitle(\ this.setSize(300, 200); // 定义一个按钮组件

JButton bt = new JButton(\关闭窗口\ // 设置流式布局管理器

this.setLayout(new FlowLayout()); // 添加按钮组件 this.add(bt);

// 设置点击关闭按钮时的默认操作

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); }

public static void main(String[] args) { }

}

new Example13 ();

运行结果如图9-17所示:

图9-17 运行结果

25

博学谷——让IT教学更简单,让IT学习更有效

三、案例总结

在本案例中,通过JFrame类创建了一个窗体,并向该窗体中添加了一个按钮。JFrame类和Frame类最大的区别在于,JFrame类提供了关闭窗口的功能,在程序中不需要添加窗体监听器,只需调用setDefaultCloseOperation()方法,然后将常量JFrame.EIXT_ON_CLOSE作为参数传入即可,该参数表示点击窗口关闭按钮时退出程序。

案例9-14 JScrollPane 一、案例描述

1、 考核知识点

编号:00109018 名称:JScrollPane

2、 练习目标

? 掌握JScrollPane中间容器的使用

3、 需求分析

JScrollPane是一个带有滚动条的面板容器,而且这个面板只能添加一个组件,如果想往JScrollPane面板中添加多个组件,应该先将组件添加到JPanel中,然后将JPanel添加到JScrollPane中。为了让初学者掌握JScrollPane面板容器的使用,本案例将演示一下向中间容器添加按钮。

4、 设计思路(实现原理)

1)编写Example14类,创建滚动面板。 2)设置垂直滚动条。

3)定义一个JPanel面板,设置JPanel面板在滚动面板中显示。 4)将滚动面板添加到内容面板的CENTER区域

二、案例实现

编写Example14类,代码如下所示:

import java.awt.*; import javax.swing.*;

public class Example14 extends JFrame {

public Example14() {

this.setTitle(\滚动面板\// 创建滚动面板

JScrollPane scrollPane = new JScrollPane(); // 设置水平滚动条策略--滚动条一直显示

scrollPane.setHorizontalScrollBarPolicy

(ScrollPaneConstants. HORIZONTAL_SCROLLBAR_AS_NEEDED); // 设置垂直滚动条策略--滚动条需要时显示 scrollPane.setVerticalScrollBarPolicy

26

博学谷——让IT教学更简单,让IT学习更有效

}

}

public static void main(String[] args) { }

new Example14 ();

(ScrollPaneConstants. VERTICAL_SCROLLBAR_ALWAYS); // 定义一个JPanel面板

JPanel panel = new JPanel(); // 设置JPanel面板在滚动面板中显示 scrollPane.setViewportView(panel); // 将滚动面板添加到内容面板的CENTER区域

this.add(scrollPane, BorderLayout.CENTER);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setSize(400, 250); this.setVisible(true);

运行结果如图9-18所示:

图9-18 运行结果

三、案例总结

1、Swing组件中不仅具有JFrame和JDialog这样的顶级窗口,还提供了一些中间容器,这些容器不能单独存在,只能放置在顶级窗口中。其中最常见的中间容器有两种:JPanel和JScrollPane。

2、JScrollPane的常用构造方法,如下表所示。 方法声明 JScrollPane() JScrollPane(Component view) 功能描述 创建一个空的JScrollPane面板 创建一个显示指定组件的JScrollPane面板,只要组件的内容超过视图大小就会显示水平和垂直滚动条 创建一个显示指定容器、并具有指定滚动条策略的JScrollPane。参数vsbPolicy和hsbPolicy分别表示垂直滚动条策略和水平滚动条策略,应指定为ScrollPaneConstants的静态常量,如下所示: ? HORIZONTAL_SCROLLBAR_AS_NEEDED:表示水平滚动条只在需要时显示,是默认策略。 ? HORIZONTAL_SCROLLBAR_NEVER:表示水平滚动条永远不显示 27

JScrollPane(Component view, int vsbPolicy,int hsbPolicy) 博学谷——让IT教学更简单,让IT学习更有效

? HORIZONTAL_SCROLLBAR_ALWAYS:表示水平滚动条一直显示 3、如果在构造方法中没用指定显示组件和滚动条策略,也可以使用JScrollPane提供的方法进行设置,如下表所示。

方法声明 void setVerticalBarPolicy(int policy) void setViewportView( Component view) 功能描述 指定垂直滚动条策略,即垂直滚动条何时显示在滚动面板上 设置在滚动面板显示的组件 void setHorizontalBarPolicy(int policy) 指定水平滚动条策略,即水平滚动条何时显示在滚动面板上 案例9-15 JTextComponent 一、案例描述

1、 考核知识点

编号:00109019

名称:JTextComponent

2、 练习目标

? 掌握文本组件JTextComponent的使用

3、 需求分析

文本组件JTextComponent用于接收用户输入的信息或向用户展示信息。为了让初学者掌握文本组件的使用,本案例将演示一下文本组件JTextField和JTextArea组件的使用。

4、 设计思路(实现原理)

1)编写Example15类,创建一个文本域。

2)创建一个滚动面板,将文本域作为其显示组件。

3)创建一个JPanel面板、一个文本框和一个发送按钮,模拟发送短信的界面。

4)为按钮添加一个监听事件,获取输入的文本信息,如果为空则提示“短信内容不能为空”,如果不为空则打印出短信内容。

二、案例实现

import java.awt.*; import java.awt.event.*; import javax.swing.*;

public class Example15 extends JFrame {

JButton sendBt;

JTextField inputField; JTextArea chatContent; public Example15() {

this.setLayout(new BorderLayout());

chatContent = new JTextArea(12, 34); // 创建一个文本域 // 创建一个滚动面板,将文本域作为其显示组件

28

博学谷——让IT教学更简单,让IT学习更有效

JScrollPane showPanel = new JScrollPane(chatContent); chatContent.setEditable(false); // 设置文本域不可编辑 JPanel inputPanel = new JPanel(); // 创建一个JPanel面板 inputField = new JTextField(20); // 创建一个文本框 sendBt = new JButton(\发送\创建一个发送按钮 // 为按钮添加事件

sendBt.addActionListener(new ActionListener() { // 为按钮添加一个监听事件

public void actionPerformed(ActionEvent e) {// 重写actionPerformed方法

String content = inputField.getText(); // 获取输入的文本信息 if (content != null && !content.trim().equals(\

chatContent.append(content + \

// 判断输入的信息是否为空

// 如果不为空,将输入的文本追加到到聊天窗口

} else {

// 如果为空,提示短信内容不能为空 }

}

public static void main(String[] args) { }

new Example15 ();

}

}

inputField.setText(\将输入的文本域内容置为空

chatContent.append(\短信内容不能为空\

});

Label label = new Label(\短信编辑\创建一个标签

inputPanel.add(label); // 将标签添加到JPanel面板 inputPanel.add(inputField); // 将文本框添加到JPanel面板 inputPanel.add(sendBt); // 将按钮添加到JPanel面板 // 将滚动面板和JPanel面板添加到JFrame窗口 this.add(showPanel, BorderLayout.CENTER); this.add(inputPanel, BorderLayout.SOUTH); this.setTitle(\发送短信窗口\this.setSize(400, 300);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true);

运行结果如图9-19所示:

29

博学谷——让IT教学更简单,让IT学习更有效

图9-19 运行结果

三、案例总结

1、文本组件包括文本框(JTextField)、文本域(JTextArea)等,它们都有一个共同父类JTextComponent。 2、JTextField:JTextField称为文本框,它只能接收单行文本的输入,接下来介绍一下JTextField常用的构造方法,如下表所示。

方法描述 JTextField() JTextFiled(int columns) JTextField(String text) JTextField(String text,int column) 功能说明 创建一个空的文本框,初始字符串为null 创建一个具有指定列数的文本框,初始字符串为null 创建一个显示指定初始字符串的文本框 创建一个具有指定列数、并显示指定初始字符串的文本框 3、JTextArea:JTextArea称为文本域,它能接收多行的文本的输入,使用JTextArea构造方法创建对象时可以设定区域的行数、列数,接下来介绍一下JTextArea常用的构造方法,如表9-11所示。

表9-1 JTextArea构造方法

方法描述 JTextArea() JTextArea(String text) JTextArea(int rows,int columns) JTextArea(String text,int rows,int columns) 功能说明 构造方法,创建一个空的文本域 构造方法,创建显示指定初始字符串的文本域 构造方法,创建具有指定行和列的空的文本域 构造方法,创建显示指定初始文本并指定了行列的文本域 案例9-16 JCheckBox组件 一、案例描述

1、 考核知识点

编号:00109020

名称:JCheckBox组件

2、 练习目标

? 掌握JCheckBox组件的使用

3、 需求分析

30

博学谷——让IT教学更简单,让IT学习更有效

JCheckBox组件被称为复选框,它有选中(是)/未选中(非)两种状态,如果用户想接收的输入只有“是”和“非”,则可以通过复选框来切换状态。如果复选框有多个,则用户可以选中其中一个或者多个。为了让初学者掌握JCheckBox组件的使用,本案例将演示一下JCheckBox组件的用法。

4、 设计思路(实现原理)

1)编写Example16类,创建一个JLabel标签并设置标签文本的字体。

2)创建两个JCheckBox复选框,一个可以设置文本字体为斜体,一个设置为黑体。 3)为复选框定义ActionListener监听器

二、案例实现

import java.awt.*; import java.awt.event.*; import javax.swing.*;

public class Example16 extends JFrame {

private JCheckBox italic; private JCheckBox bold; private JLabel label; public Example16() {

// 创建一个JLabel标签 ,标签文本居中对齐

label = new JLabel(\请选择字体样式\// 设置标签文本的字体

label.setFont(new Font(\宋体\this.add(label); // 在CENTER域添加标签 JPanel panel = new JPanel(); // 创建一个JPanel面板 // 创建两个JCheckBox复选框 italic = new JCheckBox(\斜体\bold = new JCheckBox(\黑体\// 为复选框定义ActionListener监听器

ActionListener listener = new ActionListener() { };

// 为两个复选框添加监听器

italic.addActionListener(listener); bold.addActionListener(listener); // 在JPanel面板面板添加复选框

31

public void actionPerformed(ActionEvent e) { }

int mode = 0;

if (bold.isSelected())

mode += Font.BOLD; mode += Font.ITALIC; if (italic.isSelected())

label.setFont(new Font(\宋体\

博学谷——让IT教学更简单,让IT学习更有效

}

}

public static void main(String[] args) { }

new Example16 (); panel.add(italic); panel.add(bold);

// 在SOUTH域添加JPanel面板

this.add(panel, BorderLayout.SOUTH);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setSize(300, 300); this.setVisible(true);

运行结果如图9-20所示:

图9-20 运行结果

三、案例总结

1、本案例中,在JPanel面板中放置了“黑体”和“斜体”两个复选框,并为这两个按钮注册监听事件,通过判断这两个按钮是否选中来改变界面字体的样式。图9-20中,四个图分别表示勾选零个、一个和两个复选框时 “请选择字体样式”所显示的字体样式。

2、下表列举了创建JCheckBox对象的常用的构造方法。 方法描述 JCheckBox() JCheckBox(String text) JCheckBox(String text,boolean selected) 功能说明 创建一个没有文本信息,初始状态未被选中的复选框 创建一个带有文本信息,初始状态未被选定的复选框 创建一个带有文本信息,并指定初始状态(选中/未选中)的复选框 案例9-17 JRadioButton组件 一、案例描述

1、 考核知识点

编号:00109021

名称:JRadioButton组件

32

博学谷——让IT教学更简单,让IT学习更有效

2、 练习目标

? 掌握JRadioButton组件的使用

3、 需求分析

JRadioButton组件被称为单选按钮,单选按钮只能选中一个,对于JRadioButton按钮来说,当一个按钮被选中时,先前被选中的按钮就会自动取消选中。为了让初学者掌握JRadioButton组件的使用,本案例将演示一下JRadioButton组件的用法。

4、 设计思路(实现原理)

1)编写Example17类,创建一个面板。

2)在JPanel面板上放置三个JRadioButton按钮,代表“红”、“黄”、“蓝”。

3)将按钮添加到panel面板和ButtonGroup按钮组中并添加监听器,选择三个JRadioButton按钮可以改变面板的颜色。

二、案例实现

import java.awt.*; import javax.swing.*; import java.awt.event.*;

public class Example17 extends JFrame {

private ButtonGroup group; // 单选按钮组对象

private JPanel panel; // JPanel面板放置三个JRadioButton按钮 private JPanel pallet; // JPanel面板作为调色板 public Example17() { } /**

* @param name

* JRadioButtion按钮的文本信息 用于创建一个带有文本信息的JRadioButton按钮 * 将按钮添加到panel面板和ButtonGroup按钮组中 并添加监听器 */

private void addJRadioButton(final String text) {

JRadioButton radioButton = new JRadioButton(text); group.add(radioButton);

33

pallet = new JPanel();

this.add(pallet, BorderLayout.CENTER); // 将调色板面板放置了CENTER区域 panel = new JPanel(); group = new ButtonGroup(); // 调用addJRadioButton()方法 addJRadioButton(\红\addJRadioButton(\黄\addJRadioButton(\蓝\

this.add(panel, BorderLayout.NORTH); this.setSize(300, 300);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true);

博学谷——让IT教学更简单,让IT学习更有效

}

}

public static void main(String[] args) { }

new Example17 (); panel.add(radioButton);

radioButton.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) { }

Color color = null; if (\红\ }

pallet.setBackground(color);

color = Color.RED; color = Color.YELLOW; color = Color.BLUE; color = Color.WHITE;

} else if (\黄\} else if (\蓝\} else {

});

运行结果如图9-21所示:

图9-21 运行结果

三、案例总结

1、本案例中,在JPanel面板中放置了“红”、“黄”、“蓝”三个单选按钮,并为这三个按钮注册监听事件,通过判断这两个按钮是否选中来改变面板的颜色。

2、下表列举了创建JRadioButton对象常见的构造方法。 方法描述 JRadioButton () JRadioButton (String text) JRadioButton (String text,boolean selected) 功能说明 创建一个没有文本信息、初始状态未被选中的单选框 创建一个带有文本信息、初始状态未被选定的单选框 创建一个具有文本信息,并指定初始状态(选中/未选中)的单选框。 34

博学谷——让IT教学更简单,让IT学习更有效

案例9-18 JcomboBox下拉列表框的使用 一、案例描述

1、 考核知识点

编号:00109022

名称:JComboBox组件

2、 练习目标

? 掌握JComboBox下拉列表的使用方法

3、 需求分析

JComboBox下拉列表框,会将所有选项折叠在一起,当用户点击组合框时,会出现下拉式的选择列表。用户可以从中选择一项并显示。为了让初学者熟悉JComboBox下拉列表框,本案例将演示JComboBox下拉列表框的用法。

4、 设计思路(实现原理)

1) 编写类Example18,创建JPanel面板。 2) 创建一个组合框并为组合框添加选项。

3) 为组合框添加事件监听器,所选择的组合框内容会显示在文本框中。

二、案例实现

import java.awt.*; import java.awt.event.*; import javax.swing.*;

public class Example18 extends JFrame {

private JComboBox comboBox; // 定义一个JComboBox组合框 private JTextField field; // 定义一个JTextField文本框 public Example18() {

JPanel panel = new JPanel(); // 创建JPanel面板 comboBox = new JComboBox(); // 为组合框添加选项

comboBox.addItem(\请选择城市\comboBox.addItem(\北京\comboBox.addItem(\天津\comboBox.addItem(\南京\comboBox.addItem(\上海\comboBox.addItem(\重庆\// 为组合框添加事件监听器

comboBox.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

String item = (String) comboBox.getSelectedItem(); if (\请选择城市\

field.setText(\

35

博学谷——让IT教学更简单,让IT学习更有效

}

}

public static void main(String[] args) { new Example18 (); }

}

} else { }

field.setText(\您选择的城市是:\

});

field = new JTextField(20);

panel.add(comboBox); // 在面板中添加组合框 panel.add(field); // 在面板中添加文本框 // 在内容面板中添加JPanel面板

this.add(panel, BorderLayout.NORTH); this.setSize(350, 100);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true);

运行程序会弹出窗体,在窗体中有可选择的下拉列表框,选择前后的效果如图9-22所示。

图9-22 运行结果

三、案例总结

1、JComboBox组件被称为组合框,它将所有选项折叠收藏在一起,默认显示的是第一个添加的选项。 2、JComboBox组合框组件分为可编辑和不可编辑两种形式,对于不可编辑的组合框,用户只能在现有的选项列表中进行选择,而对于可编辑的组合框,用户既可以在现有的选项中选择,也可以自己输入新的内容。需要注意的是,自己输入的内容只能作为当前项显示,并不会添加到组合框的选项列表中。

案例9-19 如何创建下拉式菜单 一、案例描述

1、 考核知识点

编号:00109023 名称:下拉式菜单

2、 练习目标

? 掌握如何创建下拉式菜单

36

博学谷——让IT教学更简单,让IT学习更有效

3、 需求分析

下拉式菜单,大家肯定很熟悉,因为计算机中很多文件的菜单都是下拉式的,创建下拉式菜单需要使用三个组件:JMenuBar(菜单栏)、JMenu(菜单)和JMenuItem(菜单项),为了让初学者熟悉下拉菜单,本案例演示如何创建下拉菜单。

4、 设计思路(实现原理)

1) 定义类Example19继承自JFrame,用于创建一个下拉式菜单。 2) 创建JMenuBar菜单栏对象,将其放置在JFrame窗口的顶部 3) 创建JMenu菜单对象,将其添加到JMenuBar菜单栏中 4) 创建JMenuItem菜单项,为菜单项添加事件监听器,当点击菜单项会弹出一个模态的JDialog窗口,

将菜单项添加到JMenu菜单中。 5) 为菜单对象添加一个分隔符。

二、案例实现

定义Example19类,代码如下所示:

import java.awt.event.*; import javax.swing.*;

public class Example19 extends JFrame { public Example19() {

JMenuBar menuBar = new JMenuBar(); // 创建菜单栏

this.setJMenuBar(menuBar); // 将菜单栏添加到JFrame窗口中 JMenu menu = new JMenu(\文件\创建文件菜单 JMenu menu1 = new JMenu(\编辑\创建编辑菜单 JMenu menu2 = new JMenu(\格式\创建格式菜单 JMenu menu3 = new JMenu(\查看\创建查看菜单 menuBar.add(menu); // 将菜单添加到菜单栏上 menuBar.add(menu1); // 将菜单添加到菜单栏上 menuBar.add(menu2); // 将菜单添加到菜单栏上 menuBar.add(menu3); // 将菜单添加到菜单栏上 // 创建两个菜单项

JMenuItem item1 = new JMenuItem(\弹出窗口\JMenuItem item2 = new JMenuItem(\关闭\// 为菜单项添加事件监听器

item1.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) { }

// 创建一个JDialog窗口

JDialog dialog = new JDialog(Example023.this, true); dialog.setTitle(\弹出窗口\dialog.setSize(200, 200); dialog.setLocation(50, 50); dialog.setVisible(true);

});

37

博学谷——让IT教学更简单,让IT学习更有效

}

}

public static void main(String[] args) { }

new Example19 ();

item2.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) { }

System.exit(0);

});

menu.add(item1); // 将菜单项添加到菜单中 menu.addSeparator(); // 添加一个分隔符 menu.add(item2);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setSize(300, 300); this.setVisible(true);

运行程序,生成的窗体如图9-23所示。

图9-23 生成的窗体

三、案例总结

1、在GUI程序中,菜单是很常见的组件,利用Swing提供的菜单组件可以创建出多种样式的菜单,创建下拉式菜单需要使用三个组件:

(1)JMenuBar(菜单栏): JMenuBar表示一个水平的菜单栏,它用来管理菜单,不参与同用户的交互式操作。菜单栏可以放在容器的任何位置,但通常情况下会使用顶级窗口(如JFrame、JDialog)的setJMenuBar(JMenuBar menuBar)方法将它放置在顶级窗口的顶部。

(2)JMenu(菜单):JMenu表示一个菜单,它用来整合管理菜单项。菜单可以是单一层次的结构,也可以是多层次的结构。大多情况下,使用JMenu(String text)构造函数创建JMenu菜单,参数text表示菜单上的文本。

(3)JMenuItem(菜单项):JMenuItem表示一个菜单项,它是菜单系统中最基本的组件。和JMenu菜单一样,在创建JMenuItem菜单项时,通常会使用JMenumItem(String text)这个构造方法为菜单项指定文本内容。

38

博学谷——让IT教学更简单,让IT学习更有效

2、JMenuItem继承自AbstractButton类的,因此可以把它看成是一个按钮,如果使用无参的构造方法创建了一个菜单项,则可以调用从AbstractButton类中继承的setText(String text)方法和setIcon()方法为其设置文本和图标。

案例9-20 如何创建弹出式菜单 一、案例描述

1、 考核知识点

编号:00109024 名称:弹出式菜单

2、 练习目标

? 掌握如何创建弹出式菜单

3、 需求分析

弹出式菜单,相信大家也不会陌生,当我们在Windows桌面点击鼠标右键时出现的菜单就是弹出式菜单。在Java的Swing组件中,弹出式菜单用JPopupMenu表示,为了让初学者熟悉弹出式菜单,本案例演示如何创建弹出式菜单。

4、 设计思路(实现原理)

1) 定义类Example20继承自JFrame,用于创建一个弹出式菜单。 2) 创建JPopupMenu菜单对象,将其放置在JFrame窗口的顶部。 3) 创建三个菜单项:refreshItem、createItem、exitItem。

4) 为exitItem菜单项添加事件监听器,当点击它时会退出程序。

5)为JFrame窗口添加clicked鼠标事件,监听器如果点击的是鼠标的右键,显示JPopupMenu菜单。

二、案例实现

定义Example20类,代码如下所示:

import java.awt.event.*; import javax.swing.*;

public class Example20 extends JFrame {

private JPopupMenu popupMenu; public Example20() { // 创建一个JPopupMenu菜单

popupMenu = new JPopupMenu(); // 创建三个JMenuItem菜单项

JMenuItem refreshItem = new JMenuItem(\查看\JMenuItem createItem = new JMenuItem(\新建\JMenuItem exitItem = new JMenuItem(\退出\// 为exitItem菜单项添加事件监听器

exitItem.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

System.exit(0);

39

博学谷——让IT教学更简单,让IT学习更有效

}

}

public static void main(String[] args) { }

new Example20 ();

}

});

// 往JPopupMenu菜单添加菜单项 popupMenu.add(refreshItem); popupMenu.add(createItem); popupMenu.addSeparator(); popupMenu.add(exitItem);

// 为JFrame窗口添加clicked鼠标事件监听器 this.addMouseListener(new MouseAdapter() {

public void mouseClicked(MouseEvent e) { }

// 如果点击的是鼠标的右键,显示JPopupMenu菜单 if (e.getButton() == e.BUTTON3) { }

popupMenu.show(e.getComponent(), e.getX(), e.getY());

});

this.setSize(300, 300);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true);

运行程序,生成的窗体如图9-24所示。

图9-24 生成的窗体

三、案例总结

1、定义了一个类Example20继承自JFrame。

2、创建了一个JPopupMenu菜单,其增加了refreshItem、createItem和exitItem三个JMenuItem菜单项,菜单项在默认情况下是不可见的,所以要通过调用show(Component invoker,int x,int y)方法将菜单项显示出来,参数invoker表示JPopupMenu菜单显示位置的参考组件,x和y表示invoker组件坐标空间中的

40

博学谷——让IT教学更简单,让IT学习更有效

一个坐标,显示的是JPopupMenu菜单的左上角坐标。为exitItem菜单项添加了一个ActionListener事件监听器,当点击它时,会退出程序。代码的第24到31行代码为当前窗口添加了一个鼠标事件监听器,监听鼠标的mouseClicked事件,当鼠标按下时,调用MouseEvent的getButton()判断是否按下了鼠标的右键(BUTTON3),如果是就调用JPopupMenu的show()方法将其显示,并将鼠标点击的坐标作为弹出菜单的左上角坐标。

41

本文来源:https://www.bwwdw.com/article/31y3.html

Top