201871010133-赵永军《面向对象程序设计(java)》第十三周学习总结

项目 内容
这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/
这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p/11888568.html
作业学习目标

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

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

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

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

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

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

一:理论部分。

1.事件处理基础。

  1)事件源:能够产生事件的对象都可以成为事件源,如文本框、按钮等。一个事件源是一个能够注册监听器并向监听器发送事件对象的对象。

  2)事件监听器:事件监听器对象接收事件源发送的通告(事件对象),并对发生的事件作出响应。一个监听器对象就是一个实现了门监听器接口的类实例,该类必须实现接口中的方法,这些方法当事件发生时,被自动执行。

  3)事件对象:Java将事件的相关信息封装在一个事件对象中,所有的事件对象都最终派生于java.util.EventObject类。

  4)监听器对象:是一个实现了特定监听器接口的类实例。

2.GUI设计:GUI设计中,程序员需要对组件的某种事件进行响应和处理时,必须完成两个步骤:

  1) 定义实现某事件监听器接口的事件监听器类,并具体化接口中声明的事件处理抽象方法。

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

    注册监听器方法:eventSourceObject.addEventListener(eventListenerObject)

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

4.适配器类:当程序用户试图关闭一个框架窗口时,Jframe对象就是WindowEvent的事件源。

  适配器类动态地满足了Java中实现监视器类的技术要求。

  通过扩展适配器类来实现窗口事件需要的动作。

5.动作接口及其类:Swing包提供了非常实用的机制来封装命令,并将它们连接到多个事件源,这就是Action接口。

  Action是一个接口,而不是一个类,实现这个接口的类必须要实现它的7个方法。

  AbstractAction 类 实 现 了 Action 接 口 中 除actionPerformed方法之外的所有方法,这个类存储了所有名/值对,并管理着属性变更监听器。

6.鼠标事件:MouseEvent.

  鼠标监听器接口:MouseListener,MouseMotionListener

  鼠标监听器适配器:MouseAdapter,MouseMotionAdapter

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

  鼠标在组件上移动时,会调用mouseMoved方法。

7.鼠标事件返回值:鼠标事件的类型是MouseEvent,当发生鼠标事件时:

  MouseEvent类自动创建一个事件对象,以及事件发生位置的x和y坐标,作为事件返回值。

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

8.  1)所有的事件都是由java.util包中的EventObject类扩展而来。

  2)AWTEevent 是所有 AWT 事件类的父类 , 也 是EventObject的直接子类。

二:实验部分。

1、实验目的与要求

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

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

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

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

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

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

2、实验内容和步骤

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

测试程序1:

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

※在事件处理相关代码处添加注释;

※用lambda表达式简化程序;

※掌握JButton组件的基本API;

※掌握Java中事件处理的基本编程模型。

实验程序如下:

 import java.awt.*;
import java.awt.event.*;
import javax.swing.*; /**
* 带有按钮的面板框架
*/
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); buttonPanel = new JPanel(); makeButton("yellow",Color.YELLOW);
makeButton("yellow",Color.BLUE);
makeButton("yellow",Color.RED);
makeButton("yellow",Color.GREEN);
add(buttonPanel);
}
public void makeButton(String name,Color backgroundColor)
{
JButton button =new JButton(name);
buttonPanel.add(button);
button.addActionListener(event ->
buttonPanel.setBackground(backgroundColor));
}
}
 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(() ->//lambda表达式
{
JFrame frame = new ButtonFrame();
frame.setTitle("ButtonTest");//标题
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);//可见
});
}
}

实验结果如下:

测试程序2:

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

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

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

实验程序如下:

 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);
});
}
}
 import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager; /**
* 带有按钮面板的框架,用于更改外观和感觉
*/
public class PlafFrame extends 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();
} /**
* 创建一个按钮来更改可插入的外观.
* @param name the button name
* @param className the name of the look-and-feel class
*/
private void makeButton(String name, String className)
{
//添加按钮到面板 JButton button = new JButton(name);
buttonPanel.add(button); //设置按钮要进行的操作 button.addActionListener(event -> {
// 按钮操作结果: 切换到新的外观
try //可能出错的代码放入try子句中
{
UIManager.setLookAndFeel(className);
SwingUtilities.updateComponentTreeUI(this);
pack();
}
catch (Exception e)
{
e.printStackTrace();
}
});
}
}

实验结果如下:

测试程序3:

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

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

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

实验程序如下:

 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(() -> //lambda表达式
{
JFrame frame = new ActionFrame();
frame.setTitle("ActionTest");//标题
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);//可见
});
}
}
 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); buttonPanel = new JPanel(); //定义按钮行为
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));
buttonPanel.add(new JButton(blueAction));
buttonPanel.add(new JButton(redAction)); // add panel to frame
add(buttonPanel); // 将Y、B和R键与名称关联起来
InputMap imap = buttonPanel.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
imap.put(KeyStroke.getKeyStroke("ctrl Y"), "panel.yellow");
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();
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);
} public void actionPerformed(ActionEvent event)//按钮单击方法
{
Color c = (Color) getValue("color");
buttonPanel.setBackground(c);
}
}
}

程序运行时只需同时按Ctrl+Y或R或B键,窗口就会自动显示某种颜色,如下:

测试程序4:

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

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

实验程序如下:

 import javax.swing.*;

 /**
* A frame containing a panel for testing mouse operations
*/
public class MouseFrame extends JFrame
{
public MouseFrame()
{
add(new MouseComponent());
pack();
}
}
 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");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
});
}
}
 import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.util.*;
import javax.swing.*; /**
* 用于添加和删除方块的具有鼠标操作的组件
*/
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; // 包含鼠标光标的正方形 public MouseComponent()//构造器
{
squares = new ArrayList<>();
current = null; 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; //画出所有方块
for (Rectangle2D r : squares)
g2.draw(r);
} /**
* 找到第一个包含点的正方形.
* @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;
}
return null;
} /**
* 向集合中添加一个正方形.
* @param p the center of the square
*/
public void add(Point2D p)
{
double x = p.getX();
double y = p.getY(); current = new Rectangle2D.Double(x - SIDELENGTH / 2, y - SIDELENGTH / 2, SIDELENGTH,
SIDELENGTH);
squares.add(current);
repaint();
} /**
* 从集合中移除一个正方形.
* @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)
{
// 如果光标不在正方形内,则添加一个新的正方形
current = find(event.getPoint());
if (current == null) add(event.getPoint());
} public void mouseClicked(MouseEvent event)
{
// 如果双击,则删除当前方块
current = find(event.getPoint());
if (current != null && event.getClickCount() >= 2) remove(current);
}
} private class MouseMotionHandler implements MouseMotionListener
{
public void mouseMoved(MouseEvent event)
{
// 如果鼠标指针在内部,则将其设置为十字线
// 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(); // 拖动当前矩形到(x, y)的中心
current.setFrame(x - SIDELENGTH / 2, y - SIDELENGTH / 2, SIDELENGTH, SIDELENGTH);
repaint();
}
}
}
}

实验结果如下:

实验2:结对编程练习

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

结对编程思路:

  我们先设计了一个GUI图形界面,然后将学生信息读取后存储带一个数组当中,在实现监听器类actionPerformed方法时,采用随机数下标获取学生信息数组中的值,再重写timer类的schedule类中的run方法实现定时器功能。当button中的内容为“开始”时,启动定时器,当button中的内容为“停止”时,则调用timer类对象的cancel方法停用定时器,这样就完成了对点名器的代码编程。

实验程序如下:

 import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Label;
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.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList; import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.Timer; public class Rollcall
{
public static void main(String args[])
{
try {
Dmq dmq = new Dmq();
dmq.lab.setText("随机点名器");
dmq.setTitle("点名器");
} catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} class Dmq extends JFrame
{
final Label lab = new Label();
ArrayList<String> namelist = new ArrayList<String>(); public Dmq() throws IOException
{
File file = new File("D:/JAVA/2019studentlist.txt");
FileInputStream fis = new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
BufferedReader br = new BufferedReader(isr);
String line = "";
while ((line = br.readLine()) != null)
{
if (line.lastIndexOf("---") < 0)
{
namelist.add(line);
}
}
setBounds(550, 270, 500, 300);
final Timer timer = new Timer(50, new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
lab.setText(namelist.get((int) (Math.random() * namelist.size())));
lab.setBackground(Color.YELLOW);
}
}); JButton jbutton = new JButton("开始");
jbutton.setPreferredSize(new Dimension(80,60));
jbutton.setBackground(Color.green);
jbutton .setFont(new java.awt.Font("华文行楷", 1, 22));
jbutton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
JButton jbutton = (JButton) e.getSource();
if (jbutton.getText().equals("开始"))
{
jbutton.setText("停止");
timer.start();
} else if (jbutton.getText().equals("停止"))
{
jbutton.setText("开始");
timer.stop();
} }
});
jbutton.setBounds(30, 30, 300, 100);
lab.setBackground(new Color(200, 200, 200));
this.setLayout(new FlowLayout());
this.add(lab);
this.add(jbutton);
this.setBackground(Color.green);
this.setSize(400, 250);
this.setVisible(true);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
br.close();
} }

实验结果如下:

结对编程照片:

三、实验总结

  这周学习了如何对事件进行处理,比如通过点击按钮或者鼠标对界面进行操控,对于图形用户界面的程序来说,事件处理显得十分重要。通过实验课上学长演示实验,再用lambda表达式以及匿名类等简化程序,使得自己对实验有了更多的了解。通过和合作伙伴结对编程,合作完成点名器的实验,对事件处理机制有了更深的体会。但是这个实验还是借助了外力才得以完成,有一些地方还是不懂,经过看书和同学的讲解,才得以理解。

最新文章

  1. ABP源码分析十六:DTO的设计
  2. Lisp永远成不了编程主流语言
  3. 针对格式文件,Python读取一定大小的文件内容
  4. AngularJS之Directive(三)
  5. merge sort and quick sort 自己去理解吧
  6. EWM一个仓库号对应ERP多个PLANT的配置
  7. mysql zip install
  8. dfa最小化,修正了上个版本的一些错误。
  9. UVA 4080 Warfare And Logistics 战争与物流 (最短路树,变形)
  10. live 写博
  11. table居中方法之一:设置width,然后为style设置margin:auto
  12. android配置文件详解
  13. oracle提高之索引学习
  14. Selenium的简单安装和使用
  15. Android进阶(三)android httpClient 支持HTTPS的访问方式
  16. 【MySQL】MySQL的执行计划及索引优化
  17. golang核心Goroutine和channel
  18. 工厂参观记:.NET Core 中 HttpClientFactory 如何解决 HttpClient 臭名昭著的问题
  19. 组件内守卫beforeRouteEnter和beforeRouteLeave
  20. springMVC整理03--处理数据模型 &amp; 试图解析器 &amp; @ResponseBody &amp; HttpEntity

热门文章

  1. 2019.6.11_MySQL进阶一:索引
  2. 【2019.8.9 慈溪模拟赛 T1】数论(a)(打表找规律)
  3. polyfll方案优化
  4. Paper | Beyond a Gaussian Denoiser: Residual Learning of Deep CNN for Image Denoising
  5. 微博Feed流
  6. Kubernetes configMap(配置文件存储)
  7. Linux chattr 文件保护
  8. JVM的监控工具之jvisual
  9. 《数据结构》《C++程序设计》《计算机组成原理》中的英语名词
  10. 读书会荐书 - 关于Ada Lovelacer的书