一、实验目的与要求

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

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

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

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

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

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

二、实验内容和步骤

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

测试程序1:

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

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

l 用lambda表达式简化程序;

l 掌握JButton组件的基本API;

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

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();frame.setTitle("ButtonTest");// 将窗体的标题设置为指定的字符串。frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 设置用户在窗体上发起 "close" 时默认执行的操作。frame.setVisible(true);// 设置窗口可见
        });}
}

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);// 调整组件的大小.// 创建按钮JButton yellowButton = new JButton("Yellow");JButton blueButton = new JButton("Blue");JButton redButton = new JButton("Red");buttonPanel = new JPanel();// 将按钮添加到面板中
        buttonPanel.add(yellowButton);buttonPanel.add(blueButton);buttonPanel.add(redButton);add(buttonPanel);// 为每种颜色创建一个对象ColorAction yellowAction = new ColorAction(Color.YELLOW);ColorAction blueAction = new ColorAction(Color.BLUE);ColorAction redAction = new ColorAction(Color.RED);// 将这些对象设置为按钮监听器
        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) {buttonPanel.setBackground(backgroundColor);}}
}

匿名类简化:

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);buttonPanel = new JPanel();add(buttonPanel);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);button.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event) {buttonPanel.setBackground(backgroundColor);}});}
}

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);buttonPanel = new JPanel();add(buttonPanel);makeButton("黄色", Color.yellow);makeButton("蓝色", Color.blue);makeButton("红色", Color.red);}public void makeButton(String name, Color backgroundColor) {JButton button = new JButton(name);buttonPanel.add(button);button.addActionListener((e) -> {buttonPanel.setBackground(backgroundColor);});}}

测试程序2:

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

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

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

代码:

package Second;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);});}
}

package Second;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
{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){// 向面板添加按钮;
JButton button = new JButton(name);buttonPanel.add(button);// 设置按钮动作;
button.addActionListener(event -> {// 按钮动作:切换到新的外观和感觉try{UIManager.setLookAndFeel(className);//调用静态方法,刷新全部的组件集。这里需要向方法提供一个组件,并由此找到其他的所有组件//外部对象的this引用必须将外部类名作为前缀
SwingUtilities.updateComponentTreeUI(this);pack();}catch (Exception e){e.printStackTrace();}});}
}

测试程序3:

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

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

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

代码:

package three;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);});}
}

package three;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();// define actionsAction 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);//用Action对象构造按钮,把动作和按钮关联起来
buttonPanel.add(new JButton(yellowAction));buttonPanel.add(new JButton(blueAction));buttonPanel.add(new JButton(redAction));// add panel to frame
      add(buttonPanel);//得到顶层组件的WHEN_ANCESTOR_OF_FOCUSED_COMPONENT输入映射// associate the Y, B, and R keys with namesInputMap 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);}}
}

测试程序4:

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

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

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");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setVisible(true);});}
}MouseTest

package mouse;import javax.swing.*;/*** A frame containing a panel for testing mouse operations*/
public class MouseFrame extends JFrame
{public MouseFrame(){add(new MouseComponent());pack();}
}MouseFrame

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 cursorpublic 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;// draw all squaresfor (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;}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();current = new Rectangle2D.Double(x - SIDELENGTH / 2, y - SIDELENGTH / 2, SIDELENGTH,SIDELENGTH);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 squarecurrent = find(event.getPoint());if (current == null) add(event.getPoint());}public void mouseClicked(MouseEvent event){// remove the current square if double clickedcurrent = find(event.getPoint());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 rectangleif (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

实验2:结对编程练习

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

图1 点名器启动界面

package 点名器;import java.awt.EventQueue;
import javax.swing.JFrame;public class test {public static void main(String[] args) {EventQueue.invokeLater(() -> {ButtonFrame frame = new ButtonFrame();frame.setTitle("点名器");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setVisible(true);frame.setResizable(false);});}
}

package 点名器;import java.awt.Color;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import java.util.Timer;import javax.swing.*;public class ButtonFrame extends JFrame {JButton pausecontBtn;private ArrayList arrayList;{arrayList = new ArrayList<>();File file = new File("studentnamelist.txt");FileInputStream fis;try {fis = new FileInputStream(file);InputStreamReader in = new InputStreamReader(fis);BufferedReader bf = new BufferedReader(in);String readLine;while ((readLine = bf.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();}}private JPanel buttonPanel;private static final int DEFAULT_WIDTH = 500;private static final int DEFAULT_HEIGHT = 300;protected static final String ture = null;public ButtonFrame() {setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);buttonPanel = new JPanel();buttonPanel.setLayout(null);JLabel jLabel = new JLabel("随机点名器");JButton jButton = new JButton("开始");jLabel.setBounds(200, 40, 65, 40);jButton.setBounds(200, 90, 65, 40);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("停止");jButton.setBackground(Color.yellow);jLabel.setText((String) arrayList.get((int) (Math.random() * 42)));}};timer.schedule(timerTask, 0, 5);}if (jButton.getText().equals("停止")) {timer.cancel();jButton.setText("开始");jButton.setBackground(Color.red);}}});buttonPanel.add(jLabel);buttonPanel.add(jButton);add(buttonPanel);}
}

三、实验总结:

通过这次实验我了解了事件处理的基本原理,知道了它的用途,了解了AWT事件模型的工作机制,事件处理的基本编程模型,还了解了GUI界面组件观感设置方法,掌握了WindowAdapter类、AbstractAction类的用法以及GUI程序中鼠标事件处理技术。并且在这次实验中通过结对编程知道了如何去互相学习,收获很大。

转载于:https://www.cnblogs.com/xuezhiqian/p/10016143.html

201771010112罗松《面向对象程序设计(java)》第十三周学习总结相关推荐

  1. 201871010115——马北《面向对象程序设计JAVA》第二周学习总结

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

  2. 《数据结构与面向对象程序设计》第1周学习总结

    20182316胡泊 2019-2020-1 <数据结构与面向对象程序设计>第1周学习总结 教材学习内容总结 简单java程序是有哪些部分组成的 Java程序好的排版布局是怎样的 程序开发 ...

  3. 201521123122 《java程序设计》第十三周学习总结

    ## 201521123122 <java程序设计>第十三周实验总结 ## 1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 书面作业 1 ...

  4. 201521123022 《Java程序设计》 第十三周学习总结

    1. 本周学习总结 2. 书面作业 Q1. 网络基础 Q1.1 比较ping www.baidu.com与ping cec.jmu.edu.cn,分析返回结果有何不同?为什么会有这样的不同? 前者IP ...

  5. 四十八.面向对象程序设计——Java语言第一周编程题:分数

    题目内容: 设计一个表示分数的类Fraction.这个类用两个int类型的变量分别表示分子和分母. 这个类的构造函数是: Fraction(int a, int b) 构造一个a/b的分数. 这个类要 ...

  6. 201621123053《Java程序设计》第十三周学习笔记文章

    42#1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 为你的系统增加网络功能(购物车.图书馆管理.斗地主等)-分组完成 为了让你的系统可以被多个用户 ...

  7. 201771010112罗松《面向对象程序设计(java)》第三周学习总结

    实验三  Java基本程序设计 201771010112  罗松 1.实验目的与要求 (1)进一步掌握Eclipse集成开发环境下java程序开发基本步骤: (2)熟悉PTA平台线上测试环境: (3) ...

  8. 张季跃 201771010139《面向对象程序设计(java)》第十三周学习总结

    张季跃 201771010139<面向对象程序设计(java)>第十三周学习总结 实验部分: 1.实验目的与要求 (1) 掌握事件处理的基本原理,理解其用途: (2) 掌握AWT事件模型的 ...

  9. 【Java】《面向对象程序设计——Java语言》Castle代码修改整理

    前言 最近闲来无事刷刷MOOC,找到以前看的浙大翁凯老师的<面向对象程序设计--Java语言>课程,重新过一遍仍觉受益颇深. 其中有一个Castle的例子,思路很Nice但代码很烂,翁凯老 ...

  10. 201771010118马昕璐《面向对象程序设计java》第八周学习总结

    第一部分:理论知识学习部分 1.接口 在Java程序设计语言中,接口不是类,而是对类的一组需求描述,由常量和一组抽象方法组成.Java为了克服单继承的缺点,Java使用了接口,一个类可以实现一个或多个 ...

最新文章

  1. 【Spring】基于注解的IOC案例
  2. Portainer 安装与配置
  3. SQL Server 阻止了对组件 \'Ad Hoc Distributed Queries\' 的访问
  4. java实验2词法分析程序设计
  5. 软件开发人员能力模型
  6. python加载项向导_什么是 Python 加载项?
  7. 多线程与高并发(二):解析自旋锁CAS操作与volatile
  8. Webstrom 卡顿问题
  9. Android JNI开发系列(二)HelloWorld
  10. 从数百万个光纤(而不是数千个线程)中查询数据库
  11. Redis高级命令与特性以及单点模式的介绍
  12. sql 整改措施 注入_SQL注入的漏洞及解决方案
  13. 将数字n转换为字符串并保存到s中
  14. 笨办法学 Python · 续 练习 11:`uniq`
  15. “落花有意随流水,流水无情恋落花。”出处
  16. 深入浅出Lua虚拟机
  17. 蓝桥杯 ADV-143算法提高 扶老奶奶过街
  18. jdbc如何使用oracle数据库连接池,使用JDBC连接池技术连接Oracle数据库
  19. php为什么发送不到sql,PHP-为什么我的Ajax无法执行我的SQL查询?
  20. OJ 21658::Monthly Expense(二分搜索+最小化最大值)

热门文章

  1. 中国居民身份证号码校验算法
  2. 2021年中国人机界面软件市场趋势报告、技术动态创新及2027年市场预测
  3. 网络安全中非常好用的webshell检测工具!
  4. 关于投票活动主办方对于微信上投票怎样刷票及微信投票怎样查刷票
  5. Qt5构建出错问题解决办法:为项目untitled执行步骤
  6. linux内核驱动使用hugepages,使用HugePages优化内存性能
  7. 计算机英语单词练习一
  8. 图片base64编码解码
  9. 视频分割软件有什么,怎么分割视频
  10. mac 苹果系统安装pygame环境插件