1、实验目的与要求

(1) 掌握事件处理的基本原理,理解其用途;

(2) 掌握AWT事件模型的工作机制;

(3) 掌握事件处理的基本编程模型;

(4) 了解GUI界面组件观感设置方法;

(5) 掌握WindowAdapter类、AbstractAction类的用法;

(6) 掌握GUI程序中鼠标事件处理技术。

一、理论知识

11.1 事件处理基础

⚫事件源(event source):能够产生事件的对象都可以成为事件源,如文本框、按钮等。一个事件源是一个能够注册监听器并向监听器发送事件对象的对象。
⚫ 事件监听器(event listener):事件监听器对象接收事件源发送的通告(事件对象),并对发生的事件作出响应。一个监听器对象就是一个实现了专门监听器接的类实例,该类必须实现接口中的方法,这些方法当事件发生时,被自动执行。
⚫ 事件对象(event object):Java将事件的相关信息封装在一个事件对象中,所有的事件对象都最终派生于java.util.EventObject类。不同的事件源可以产生不同类别的事件。

⚫ 监听器对象:是一个实现了特定监听器接口(listener interface)的类实例。
⚫ 事件源:是一个能够注册监听器对象并发送事件对象的对象。
⚫ 当事件发生时,事件源将事件对象自动传递给所有注册的监听器。
⚫ 监听器对象利用事件对象中的信息决定如何对事件做出响应。

⚫GUI设计中,程序员需要对组件的某种事件进行响应和处理时,必须完成两个步骤:
 1)定义实现某事件监听器接口的事件监听器类,并具体化接口中声明的事件处理抽象方法。

2) 为组件注册实现了规定接口的事件监听器对象;

⚫监听器类必须实现与事件源相对应的接口,即必须提供接口中方法的实现。

11.2 动作

(1)各按钮需要同样的处理:1) 使用字符串构造按钮对象;2) 把按钮添加到面板上;
3) 用对应的颜色构造一个动作监听器;4) 注册动作监听器。

2)动作事件:激活一个命令可以有多种方式,如用户可以通过菜单、击键或工具栏上的按钮选择特定的功能。

动作对象是一个封装下列内容的对象:
–命令的说明:一个文本字符串和一个可选图标;
–执行命令所需要的参数。

(3)Swing包提供了非常实用的机制来封装命令,并将它们连接到多个事件源,这就是Action接口。

⚫Action是一个接口,而不是一个类,实现这个接口的类必须要实现它的7个方法。
⚫ AbstractAction 类 实 现 了 Action 接 口 中 除actionPerformed方法之外的所有方法,这个类存储了所有名/值对,并管理着属性变更监听器。

11.3 鼠标事件

⚫ Swing程序默认使用Metal观感,采用两种方式改变观感。
第一种:在Java安装的子目录jre/lib下的文件swing.properties中,将属性swing.defaultlaf设置为所希望的观感类名

第二种:调用静态的UIManager.setLookAndFeel方法,动态地改变观感,提供所想要的观感类名,再调用静态方法SwingUtilities.updateComponentTreeUI来刷新全部的组件集

⚫ 用户点击鼠标按钮时,会调用三个监听器方法:
– 鼠标第一次被按下时调用mousePressed方法;
– 鼠标被释放时调用mouseReleased方法;
– 两个动作完成之后,调用mouseClicked方法。

⚫ 鼠标在组件上移动时,会调用mouseMoved方法。
⚫ 如果鼠标在移动的时候还按下了鼠标,则会调用
mouseDragged方法。

⚫ 监听鼠标点击事件,实现MouseListener接口:

实现mousePressed方法:- 判断鼠标点击的地方是否在小方块内;
- 如果不在小方块内,在点击的地方画一个小方块。
⚫ 实现mouseClicked方法:
- 判断鼠标点击的地方是否在小方块内;- 如果在小方块内,判断点击了几次,如果大于两次
将该方块移除。

11.4 11.4AWT 事件继承层次

(1)适配器类:鉴于代码简化的要求,对于有不止一个方法的AWT监听器接口都有一个实现了它的所有方法,但却不做任何工作的适配器类。

⚫ 当程序用户试图关闭一个框架窗口时,Jframe对象就是WindowEvent的事件源。

⚫ 捕获窗口事件的监听器:WindowListener listener=…..; frame.addWindowListener(listener);

⚫ 窗口监听器必须是实现WindowListener接口的 类的一个对象,WindowListener接口中有七个方法,它们的名字是自解释的。

⚫ 适配器类动态地满足了Java中实现监视器类的技术要求。
⚫ 通过扩展适配器类来实现窗口事件需要的动作。

(2)扩展WindowAdapter类,继承六个空方法,并覆盖WindowClosing()方法:

class Terminator extends WindowAdapter
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
}

(3)注册事件监听器:

⚫ 可将一个Terminator对象注册为事件监听器:
WindowListener listener=new Terminator();
frame.addWindowListener(listener);
⚫ 只要框架产生一个窗口事件,该事件就会传递给监听器对象。

(4)用匿名类简化

⚫ AWT将事件分为低级(low-level)事件和语义
(semantic)事件。
–语义事件:表达用户动作的事件。
例:点击按钮(ActionEvent)。
–低级事件:形成语义事件的事件。

2、实验内容和步骤

实验1: 导入第11章示例程序,测试程序并进行代码注释。

测试程序1:

在elipse IDE中调试运行教材443页-444页程序11-1,结合程序运行结果理解程序;

(1)在事件处理相关代码处添加注释;

(2)用lambda表达式简化程序;

(3)掌握JButton组件的基本API;

(4)掌握Java中事件处理的基本编程模型

package button;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*; /**
* A frame with a button panel
*/
public class ButtonFrame extends JFrame
{//定义三个属性
private JPanel buttonPanel;
private static final int DEFAULT_WIDTH = 300;//定义像素值
private static final int DEFAULT_HEIGHT = 200; public ButtonFrame()
{
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);//构造器决定GUI界面的初始形状 // create buttons
//创建按钮
JButton yellowButton = new JButton("Yellow");
JButton blueButton = new JButton("Blue");
JButton redButton = new JButton("Red"); buttonPanel = new JPanel(); // add buttons to panel
//调用add方法,添加了三个按钮组件
buttonPanel.add(yellowButton);
buttonPanel.add(blueButton);
buttonPanel.add(redButton); // add panel to frame
add(buttonPanel);//add方法是JFrame的方法
// create button actions
//生成三个类对象,类名为ColorAction
ColorAction yellowAction = new ColorAction(Color.YELLOW);
ColorAction blueAction = new ColorAction(Color.BLUE);
ColorAction redAction = new ColorAction(Color.RED); // associate actions with buttons
//用addActionListener来对组件注册
yellowButton.addActionListener(yellowAction);
blueButton.addActionListener(blueAction);
redButton.addActionListener(redAction);
} /**
* An action listener that sets the panel's background color.
*/
private class ColorAction implements ActionListener//监听器类对象
{
private Color backgroundColor; public ColorAction(Color c)
{
backgroundColor = c;
} public void actionPerformed(ActionEvent event)//用actionPerformed方法让面板监听这些按钮
{
buttonPanel.setBackground(backgroundColor);
}
}
}
package button;

import java.awt.*;
import javax.swing.*; /**
* @version 1.34 2015-06-12
* @author Cay Horstmann
*/
public class ButtonTest
{
public static void main(String[] args)
{
EventQueue.invokeLater(() -> {
JFrame frame = new ButtonFrame();//生成ButtonFrame类的GUI界面对象
frame.setTitle("ButtonTest");//Title设置
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭界面的按钮操作
frame.setVisible(true);//可见的
});
}
}

(2)用lambda表达式简化程序

package button;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*; /**
* A frame with a button panel
*/
public class ButtonFrame extends JFrame {// 定义三个属性
private JPanel buttonPanel;
private static final int DEFAULT_WIDTH = 300;// 定义像素值
private static final int DEFAULT_HEIGHT = 200; public ButtonFrame()
{
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);//构造器决定GUI界面的初始形状 // create buttons
//创建按钮
/*JButton yellowButton = new JButton("Yellow");
JButton blueButton = new JButton("Blue");
JButton redButton = new JButton("Red");*/ buttonPanel = new JPanel(); // add buttons to panel /*buttonPanel.add(yellowButton);
buttonPanel.add(blueButton);
buttonPanel.add(redButton);*/ // add panel to frame
add(buttonPanel);//add方法是JFrame的方法
// create button actions
//生成三个类对象,类名为ColorAction
/*ColorAction yellowAction = new ColorAction(Color.YELLOW);
ColorAction blueAction = new ColorAction(Color.BLUE);
ColorAction redAction = new ColorAction(Color.RED);*/ // associate actions with buttons
/*//用addActionListener来对组件注册
yellowButton.addActionListener(yellowAction);
blueButton.addActionListener(blueAction);
redButton.addActionListener(redAction);*/ makeButton("Yellow",Color.yellow);
makeButton("blue",Color.blue);
makeButton("red",Color.red);} public void makeButton(String name, Color backgroundColor) {
JButton button = new JButton(name);
buttonPanel.add(button);
ColorAction action = new ColorAction(backgroundColor);
button.addActionListener(action);
} /**
* An action listener that sets the panel's background color.
*/ private class ColorAction implements ActionListener// 监听器类对象
{
private Color backgroundColor; public ColorAction(Color c) {
backgroundColor = c;
} public void actionPerformed(ActionEvent event)// 用actionPerformed方法让面板监听这些按钮
{
buttonPanel.setBackground(backgroundColor);
}
}
}

结果如下:

测试程序2:

l 在elipse IDE中调试运行教材449页程序11-2,结合程序运行结果理解程序;

l 在组件观感设置代码处添加注释;

l 了解GUI程序中观感的设置方法。

package plaf;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager; /**
* A frame with a button panel for changing look-and-feel
*/
public class PlafFrame extends JFrame//PlafFrame类继承JFrame类
{
private JPanel buttonPanel; public PlafFrame()
{
buttonPanel = new JPanel();// UIManager.LookAndFeelInfo[] infos = UIManager.getInstalledLookAndFeels();
//调用此方法来列举安装的所有观感实现
for (UIManager.LookAndFeelInfo info : infos)//设置图形界面外观
makeButton(info.getName(), info.getClassName()); add(buttonPanel);
pack();
} /**
* Makes a button to change the pluggable look-and-feel.
* @param name the button name
* @param className the name of the look-and-feel class
*/
private void makeButton(String name, String className)
{
// add button to panel
//在面板上添加新的按钮
JButton button = new JButton(name);
buttonPanel.add(button);//调用add方法 // set button action设置按钮动作 button.addActionListener(event -> {
// button action: switch to the new look-and-feel
try//抛出异常
{
UIManager.setLookAndFeel(className);//设置图形界面类名
SwingUtilities.updateComponentTreeUI(this);//this指示外围的对象
pack();
}
catch (Exception e)
{
e.printStackTrace();
}
});
}
}
package plaf;

import java.awt.*;
import javax.swing.*; /**
* @version 1.32 2015-06-12
* @author Cay Horstmann
*/
public class PlafTest
{
public static void main(String[] args)
{
EventQueue.invokeLater(() -> {
JFrame frame = new PlafFrame();//生成新的类
frame.setTitle("PlafTest");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭界面的按钮操作
frame.setVisible(true);//使结果为可见的
});
}
}

结果如下:

测试程序3:

l 在elipse IDE中调试运行教材457页-458页程序11-3,结合程序运行结果理解程序;

l 掌握AbstractAction类及其动作对象;

掌握GUI程序中按钮、键盘动作映射到动作对象的方法。

package action;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*; /**
* A frame with a panel that demonstrates color change actions.
*/
public class ActionFrame extends JFrame
{// 定义三个属性
private JPanel buttonPanel;
private static final int DEFAULT_WIDTH = 300;
private static final int DEFAULT_HEIGHT = 200; public ActionFrame()
{
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);//构造器决定GUI界面的初始形状 buttonPanel = new JPanel();// 将类的实例域中的JPanel面板对象实例化 // define actions
//创建了ColorAction类的三个对象
Action yellowAction = new ColorAction("Yellow", new ImageIcon("yellow-ball.gif"),
Color.YELLOW);
Action blueAction = new ColorAction("Blue", new ImageIcon("blue-ball.gif"), Color.BLUE);
Action redAction = new ColorAction("Red", new ImageIcon("red-ball.gif"), Color.RED); // add buttons for these actions
buttonPanel.add(new JButton(yellowAction));// 创建一个按钮,其属性从所提供的 Action中获取 buttonPanel.add(new JButton(blueAction));
buttonPanel.add(new JButton(redAction)); // add panel to frame
add(buttonPanel);
//将这个添加好按钮的面板添加到原框架中
// associate the Y, B, and R keys with names
InputMap imap = buttonPanel.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
// 将这个添加好按钮的面板添加到原框架中 imap.put(KeyStroke.getKeyStroke("ctrl Y"), "panel.yellow");
// 在imap中通过调用击键类KeyStroke的静态方法设置击键输入ctrl+Y的组合
imap.put(KeyStroke.getKeyStroke("ctrl B"), "panel.blue");
imap.put(KeyStroke.getKeyStroke("ctrl R"), "panel.red"); // associate the names with actions
ActionMap amap = buttonPanel.getActionMap();// 用JPanel中的getACtionMap方法获得amap对象
amap.put("panel.yellow", yellowAction);
amap.put("panel.blue", blueAction);
amap.put("panel.red", redAction);
} public class ColorAction extends AbstractAction
{
/**
* Constructs a color action.
* @param name the name to show on the button
* @param icon the icon to display on the button
* @param c the background color
*/
public ColorAction(String name, Icon icon, Color c)
{
putValue(Action.NAME, name);
putValue(Action.SMALL_ICON, icon);
putValue(Action.SHORT_DESCRIPTION, "Set panel color to " + name.toLowerCase());
putValue("color", c); //在构造器中设置一些键值对映射,这些设置的属性将会被JPanel读取 } public void actionPerformed(ActionEvent event)
{
Color c = (Color) getValue("color");
buttonPanel.setBackground(c);// 调用setBackground方法,设置背景颜色
}
}
}

ActionFrame

package action;

import java.awt.*;
import javax.swing.*; /**
* @version 1.34 2015-06-12
* @author Cay Horstmann
*/
public class ActionTest
{
public static void main(String[] args)
{
EventQueue.invokeLater(() -> {
JFrame frame = new ActionFrame();
frame.setTitle("ActionTest");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
});
}
}

ActionTest

结果如下:

测试程序4:

l 在elipse IDE中调试运行教材462页程序11-4、11-5,结合程序运行结果理解程序;

掌握GUI程序中鼠标事件处理技术

package mouse;

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.util.*;
import javax.swing.*; /**
* A component with mouse operations for adding and removing squares.
*/
public class MouseComponent extends JComponent
{// 定义两个属性
private static final int DEFAULT_WIDTH = 300;
private static final int DEFAULT_HEIGHT = 200; private static final int SIDELENGTH = 10;
private ArrayList<Rectangle2D> squares;// 声明一个正方形集合
private Rectangle2D current; // the square containing the mouse cursor
//用来描述矩形的类
public MouseComponent()
{
squares = new ArrayList<>();
current = null;
// 添加两个实现的类,这两个类分别继承了监测鼠标点击情况的MouseListener和MouseMotionHandler
addMouseListener(new MouseHandler());
addMouseMotionListener(new MouseMotionHandler());
} public Dimension getPreferredSize() { return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT); } public void paintComponent(Graphics g)
{
Graphics2D g2 = (Graphics2D) g;
// 转换类型
// draw all squares
for (Rectangle2D r : squares)
g2.draw(r);
// 对数组中的每个正方形,都进行绘制 } /**
* Finds the first square containing a point.
* @param p a point
* @return the first square that contains p
*/
public Rectangle2D find(Point2D p)
{
for (Rectangle2D r : squares)
{
if (r.contains(p)) return r;
//contains方法测定坐标是否在图形的边界内 }
return null;
} /**
* Adds a square to the collection.
* @param p the center of the square
*/
public void add(Point2D p)
{
double x = p.getX();
double y = p.getY(); //获取x和y的坐标 current = new Rectangle2D.Double(x - SIDELENGTH / 2, y - SIDELENGTH / 2, SIDELENGTH,
SIDELENGTH);//用获得的坐标和既定的边长构建一个新的正方形,并将其赋值给current squares.add(current);
repaint();
} /**
* Removes a square from the collection.
* @param s the square to remove
*/
public void remove(Rectangle2D s)
{
if (s == null) return;
if (s == current) current = null;
squares.remove(s);
repaint();//重绘图像 } private class MouseHandler extends MouseAdapter
{
public void mousePressed(MouseEvent event)
{
// add a new square if the cursor isn't inside a square
current = find(event.getPoint());// 将鼠标单击的这个点的坐标的对象赋给current
if (current == null) add(event.getPoint());//在这个点绘制正方形 } public void mouseClicked(MouseEvent event)
{
// remove the current square if double clicked
current = find(event.getPoint());// 将鼠标单击的这个点的坐标的对象赋给current if (current != null && event.getClickCount() >= 2) remove(current);
}
} private class MouseMotionHandler implements MouseMotionListener
{
public void mouseMoved(MouseEvent event)
{
// set the mouse cursor to cross hairs if it is inside
// a rectangle if (find(event.getPoint()) == null) setCursor(Cursor.getDefaultCursor());
else setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
//将光标的图像设置为默认的图像 } public void mouseDragged(MouseEvent event)
{
if (current != null)
{
int x = event.getX();
int y = event.getY(); // drag the current rectangle to center it at (x, y)
current.setFrame(x - SIDELENGTH / 2, y - SIDELENGTH / 2, SIDELENGTH, SIDELENGTH);
//进行图形绘制
repaint();
}
}
}
}

MouseComponent

package mouse;

import javax.swing.*;

/**
* A frame containing a panel for testing mouse operations
*/
public class MouseFrame extends JFrame
{
public MouseFrame()
{
add(new MouseComponent());//向框架中添加一个JComponent的实例
pack();
}
}

MouseFrame

package mouse;

import java.awt.*;
import javax.swing.*; /**
* @version 1.34 2015-06-12
* @author Cay Horstmann
*/
public class MouseTest
{
public static void main(String[] args)
{
EventQueue.invokeLater(() -> {
JFrame frame = new MouseFrame();
frame.setTitle("MouseTest");//Title设置
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭界面的按钮操作
frame.setVisible(true);//使结果为可见的
});
}
}

MouseTest

结果如下:

实验2:结对编程练习

利用班级名单文件、文本框和按钮组件,设计一个有如下界面(图1)的点名器,要求用户点击开始按钮后在文本输入框随机显示2017级网络与信息安全班同学姓名,如图2所示,点击停止按钮后,文本输入框不再变换同学姓名,此同学则是被点到的同学姓名。

port java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
public class RandomName {
//主面板
JFrame rFrame=new JFrame("随机点名器");
//名字
String[] stuName={"杨蓉庆","张燕","杨玲","徐思","杨其菊","常慧琢","王燕","小明","小红","小花","小白","白玛次仁","陈亚茹","达拉草","狄慧","冯志霞","孔维莹"}
//用于存储名字的标签
JLabel name = new JLabel();
//按钮
JButton btn = new JButton("开始点名");
Random rd = new Random();
public void init()
{
//提示标签页面
JLabel jt= new JLabel("随机点名器");
//设置标签居中
jt.setHorizontalAlignment(SwingConstants.CENTER);
//设置字体大小
jt.setFont(new java.awt.Font("随机点名器",1,35));
//设置名字显示的标签居中
name.setHorizontalAlignment(SwingConstants.CENTER);
//通过匿名类实现Action按钮的监听事件
btn.addActionListener(new ActionListener()
{ @Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
//获取随机的姓名
String n=getRandomName();
//设置name标签的文字
name.setText(n);
//设置字体
name.setFont(new java.awt.Font(n,1,35));
//设置字体颜色
name.setForeground(Color.red);
} });
//获取JFrame的面板
Container p = this.rFrame.getContentPane();
//设置布局方式,我采用的BorderLayout布局
p.setLayout(new BorderLayout(3,1));
//添加提示标签在北方
p.add(jt,BorderLayout.NORTH);
//添加姓名标签在中央
p.add(name,BorderLayout.CENTER);
//添加按钮控件在南方
p.add(btn,BorderLayout.SOUTH);
//调整大小,这个是java中无法设置标签的大小
rFrame.pack();
//设置窗体大小
rFrame.setSize(300, 300);
//设置可以显示
rFrame.setVisible(true); }
//获取随机的姓名
public String getRandomName()
{
int a = 0;
//random类去实现随机数时,只能设置上限,也就是说随机数产生的都是0-stuName.length之间的数字
a = rd.nextInt(stuName.length);
//rd.setSeed();
//a = (int)Math.random()*stuName.length; return stuName[a];
} public static void main(String[] args)
{
RandomName rn=new RandomName();
rn.init();
}
}

结果如下:

点名器启动界面

点名器点名界面

2、代码如下:

package 点名器;

import java.awt.EventQueue;

import javax.swing.JFrame;

/**
* @version 1.34 2015-05-12
* @author Cay Horstmann
*/
public class Demo
{
public static void main(String[] args)
{
EventQueue.invokeLater(() ->
{
JFrame frame = new ButtonFrame();
frame.setTitle("ButtonTest");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
});
}
}
package 点名器;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
import java.util.Timer;
import java.util.TimerTask; import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel; /**
* A frame with a button panel
*/
public class ButtonFrame extends JFrame {
private JPanel buttonPanel;//定义窗格对象
private static final int DEFAULT_WIDTH = 300 * 2;//窗格宽度
private static final int DEFAULT_HEIGHT = 200 * 2;//窗格高度
private ArrayList<String> arrayList; public ButtonFrame() {
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
buttonPanel = new JPanel();
buttonPanel.setLayout(null);
JLabel jLabel = new JLabel("点名器");
JButton jButton = new JButton("开始");
jLabel.setBounds(250, 80, 100, 60);//位置
jButton.setBounds(250, 150, 100, 60);//位置
arrayList = new ArrayList<>();
File file = new File("E:/学生.txt");//读取文件
FileInputStream fis;
try {
fis = new FileInputStream(file);
InputStreamReader in = new InputStreamReader(fis);
BufferedReader buf = new BufferedReader(in);
String readLine;
while ((readLine = buf.readLine()) != null) {
arrayList.add(readLine); }
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} jButton.addActionListener(new ActionListener() {
Timer timer; public void actionPerformed(ActionEvent e) {
//如果按钮显示为开始开始运行,停止后按钮显示为停止
if (jButton.getText().equals("开始")) { timer = new Timer();
TimerTask timerTask = new TimerTask() {
public void run() {
jButton.setText("停止");
jLabel.setText(arrayList.get((int) (Math.random() * 42))); }
};
timer.schedule(timerTask, 0, 15);
}
if (jButton.getText().equals("停止")) {
timer.cancel();
jButton.setText("开始");
}
}
});
jButton.setBackground(Color.orange);//按钮背景为橙色
buttonPanel.add(jLabel);
buttonPanel.add(jButton);
add(buttonPanel);
} }


三,总结

本章我们学习了图形界面事件处理技术的知识,首先掌握了事件处理的基本原理,理解其用途;简单学会了事件处理的基本编程模型;上课在老师的演示代码过程中,我清楚的学习到了lambda表达式的简便性,简化代码的好处和代码的多变性,在实验中,通过助教学长的演示和在书上源代码基础上进行的改编,添加,做出了点名器的代码程序,感觉又是一次充实的实验。

201771010135 杨蓉庆/张燕《面对对象程序设计(java)》第十三周学习总结的更多相关文章

  1. 201771010135 杨蓉庆《面对对象程序设计(java)》第十八周学习总结

    1.实验目的与要求 (1) 综合掌握java基本程序结构: (2) 综合掌握java面向对象程序设计特点: (3) 综合掌握java GUI 程序设计结构: (4) 综合掌握java多线程编程模型: ...

  2. 201771010135 杨蓉庆《面对对象程序设计(java)》第十二周学习总结

    1.实验目的与要求 (1) 掌握Java GUI中框架创建及属性设置中常用类的API: (2) 掌握Java GUI中2D图形绘制常用类的API: (3) 了解Java GUI中2D图形中字体与颜色的 ...

  3. 201771010135 杨蓉庆《面对对象程序设计(java)》第十周学习总结

    1.实验目的与要求 (1) 理解泛型概念: (2) 掌握泛型类的定义与使用: (3) 掌握泛型方法的声明与使用: (4) 掌握泛型接口的定义与实现: (5)了解泛型程序设计,理解其用途. 一.理论知识 ...

  4. 201771010135杨蓉庆 《面对对象程序设计(java)》第九周学习总结

    第7章 异常.日志.断言和调试 1.实验目的与要求 (1) 掌握java异常处理技术: (2) 了解断言的用法: (3) 了解日志的用途: (4) 掌握程序基础调试技巧: 一.理论知识 1.异常:在程 ...

  5. 201771010135杨蓉庆 《面对对象程序设计(java)》第七周学习总结

    学习目标 1.深入理解OO程序设计的特征:继承.多态: 2.熟练掌握Java语言中基于类.继承技术构造程序的语法知识: 3.利用继承定义类设计程序,能够设计开发含有1个主类.2个以上用户自定义类的应用 ...

  6. 201771010135 杨蓉庆《面对对象程序设计(java)》第十七周学习总结

    1.实验目的与要求 (1) 掌握线程同步的概念及实现技术: (2) 线程综合编程练习 一.理论知识 ⚫ 线程同步 (1)多线程并发运行不确定性问题解决方案:引入线 程同步机制,使得另一线程要使用该方法 ...

  7. 201771010135 杨蓉庆《面对对象程序设计(java)》第十六周学习总结

    1.实验目的与要求 (1) 掌握线程概念: (2) 掌握线程创建的两种技术: (3) 理解和掌握线程的优先级属性及调度方法: (4) 掌握线程同步的概念及实现技术: 一.理论知识 ⚫ 线程的概念 (1 ...

  8. 201771010135 杨蓉庆《面对对象程序设计(java)》第十五周学习总结

    1.实验目的与要求 (1) 掌握Java应用程序的打包操作: (2) 了解应用程序存储配置信息的两种方法: (3) 掌握基于JNLP协议的java Web Start应用程序的发布方法: (5) 掌握 ...

  9. 201771010135杨蓉庆 《面对对象程序设计(java)》第八周学习总结

    1.实验目的与要求 (1) 掌握接口定义方法: (2) 掌握实现接口类的定义要求: (3) 掌握实现了接口类的使用要求: (4) 掌握程序回调设计模式: (5) 掌握Comparator接口用法: ( ...

随机推荐

  1. Suggestions On Setting LED Holiday Light

    We all like the cheerful glow of holiday lights, so the process goes seamless from start to finish. ...

  2. mysql 1130 Navicat for MySQL 连接MySQL 8.0 出现1130错误

    可能是帐号不允许从远程登陆,只能在localhost.这个时候只要在localhost的那台电脑登入MySQL后,更改"MySQL"数据库"user"表里的&q ...

  3. C#中Dictionary的实现简述

    更详细的解析可以查看这篇文章:https://blog.csdn.net/zhaoguanghui2012/article/details/88105715 简要描述就是通过桶Buckets与Entr ...

  4. MVC5+EF6 入门完整教程1 :从0开始

    https://www.cnblogs.com/miro/p/4030622.html 第0课 从0开始 ASP.NET MVC开发模式和传统的WebForm开发模式相比,增加了很多"约定& ...

  5. [前端] html限制input输入数字和小数

    限制input只能输入数字和小数 html代码 <input type="text" style="width:50px" name="widt ...

  6. [lua]紫猫lua教程-命令宝典-L1-01-08. math数学函数库

    L1[math]01. 取绝对值 L1[math]02. 三角函数 小知识:注意 lua下三角函数用的参数是弧度 而不是角度 弧度=角度*pi/180  -->弧度角度换算公式  lua的mat ...

  7. Func<T,TResult>代理

    .NET平台已经发生了很多变化,最近决定好好的系统的学习一下了,开发做了这么多年,老实说很多时候都是在吃老本,这样下去不行的... 今天学习的是Func<T,TResult>,它是新的委托 ...

  8. Unity小知识点大全(二)

    51.Inspector调试模式 在Inspector面板右上角的下拉菜单中,选择Debug命令,启动调试模式,此时将显示组件包含的所有变量,包括私有变量,当运行编辑器时,可以实时查看各组件所有变量的 ...

  9. Type Java类型

    参考:https://blog.csdn.net/a327369238/article/details/52621043 Type —— Java类型 Type是一个空接口,所有类型的公共接口(父接口 ...

  10. Hadoop服务的端口50070无法访问的问题

    Hadoop启动之后,遇到一个奇怪的问题: VMware虚拟机中Hadoop服务的端口50070无法访问的问题---通过127.0.0.1:50070.localhost:50070.主机名:5007 ...