• 201871010124-王生涛《面向对象程序设计(java)》第十三周学习总结


    项目

    内容

    这个作业属于哪个课程

    <任课教师博客主页链接>https://www.cnblogs.com/nwnu-daizh/

    这个作业的要求在哪里

    <作业链接地址>https://www.cnblogs.com/nwnu-daizh/p/118568.html

    作业学习目标

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

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

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

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

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

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

     

    第一部分:理论知识学习部分

     第11章 事件处理

     11.1 事件处理基础

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

      1>监听器对象是一个实现了特定监听器接口的类的实例;

      2>事件源是一个能够注册监听器对象并发送事件对象的对象;

      3>当事件发生时,事件源将事件对象传递给所有注册的监听器;

      4>监听器对象将利用事件对象中的信息决定如何对事件做出响应

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

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

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

    • 注册监听器方法 eventSourceObject.addEventListener(eventListenerObject)。
    • 下面是监听器的一个示例: ActionListener listener = …;

      JButton button=new JButton(“Ok”); button.addActionListener(listener);

    • 动作事件(ActionEvent):当特定组件动作(点 击按钮)发生时,该组件生成此动作事件。

      该 事 件 被 传 递 给 组 件 注 册 的 每 一 个 ActionListener 对象, 并 调 用 监 听 器 对 象 的 actionPerformed方法以接收这类事件对象。

      能够触发动作事件的动作,主要包括:

      (1) 点击按钮

      (2) 双击一个列表中的选项;

      (3) 选择菜单项;

      (4) 在文本框中输入回车。

    11.2 动作

    • 动作事件

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

    在AWT事件模型中,可设置用不同方式下达命令: (如:点击按钮、菜单选项、按下键盘),其操作动作都是一-样的。

    • 动作接口及其类

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

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

    Action扩展于ActionListener接口,包含下列方法:

           void act ionPerformed (Act ionEvent event)void setEnabled(bool ean b);
           void isEnabled();
           void putValue (String key, 0bject va lue);
           void getValue (String key);
           void addPropertyChangeListner (ProperChangeL istener listener);
           void removePropertyChangeListener (Pr operChangeListener listener);

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

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

    在动作事件处理应用中,可以直接扩展AbstractAction类,并在扩展类中实现act ionPerformed方法。

    •  击键关联映射

    将一个动作对象添加到击键中,以便让用户敲击键盘命令来执行这个动作。

    将动作与击键关联起来,需生成KeyStroke类对象。
               KeyStroke ctrBKey = KeyStroke.getKeyStroke("Ctrl B");
     下面是将击键与动作对象关联起来的方式(桥梁:动作键对象描述字符串)

            InputMap imap = buttonPanel.getInputMap(JComponent.WHEN_ ANCESTOR_ OF_FOCUSED_ COMPONENT);

            imap.put(KeyStroke. getKeyStroke("ctrl Y"), "panel.yellow");

            ActionMap amap = buttonPanel.getActionMap();

            amap.put("panel,.yellow", yellowAction);

    11.3 鼠标事件

    a)鼠标事件 – MouseEvent 

    b)鼠标监听器接口 – MouseListener – MouseMotionListener 

    c) 鼠标监听器适配器 – MouseAdapter – MouseMotionAdapter

    11.4 AWT事件继承层次

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

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

    c) 有些Swing组件生成其他类型的事件对象,一般直 接 扩 展 于 EventObject, 而不是AWTEvent,位于 javax.swing.event.*。

    d) 事件对象封装了事件源与监听器彼此通信的事件 信息。在必要的时候,可以对传递给监听器对象的 事件对象进行分析。

    第二部分:实验部分

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

    测试程序1:

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

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

    l 用lambda表达式简化程序;

    l 掌握JButton组件的基本API;

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

    代码如下:

    ButtonFrame.java:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    package button;
     
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
     
    /**
     * 一个带按钮面板的框架
     */
    public class ButtonFrame extends JFrame
    {
       private JPanel buttonPanel;//定义JPanel属性
       private static final int DEFAULT_WIDTH = 300;
       private static final int DEFAULT_HEIGHT = 200;
     
       public ButtonFrame()
       {     
          setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);//setSize更改宽度和高度的属性值
     
          // 创建按钮
          var yellowButton = new JButton("Yellow");
          var blueButton = new JButton("Blue");
          var redButton = new JButton("Red");
     
          buttonPanel = new JPanel();//使new JPanel指向对象buttonPanel
     
          //在面板中添加按钮,使用add方法
          buttonPanel.add(yellowButton);
          buttonPanel.add(blueButton);
          buttonPanel.add(redButton);
     
          // 添加面板到框架
          add(buttonPanel);
     
          //创建按钮动作
          var yellowAction = new ColorAction(Color.YELLOW);
          var blueAction = new ColorAction(Color.BLUE);
          var redAction = new ColorAction(Color.RED);
     
          //用按钮关联动作,监听器对象与组件之间的注册机制
          yellowButton.addActionListener(yellowAction);
          blueButton.addActionListener(blueAction);
          redButton.addActionListener(redAction);
       }
     
       /**
        * 设置面板背景颜色的动作侦听器
        */
       private class ColorAction implements ActionListener
       {
          private Color backgroundColor;
     
          public ColorAction(Color c)
          {
             backgroundColor = c;
          }
     
          public void actionPerformed(ActionEvent event)
          {
             buttonPanel.setBackground(backgroundColor);
          }
       }
    }

    ButtonTest.java:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    package button;
     
    import java.awt.*;
    import javax.swing.*;
     
    /**
     * @version 1.35 2018-04-10
     * @author Cay Horstmann
     */
    public class ButtonTest
    {
       public static void main(String[] args)
       {
          EventQueue.invokeLater(() -> {
             var frame = new ButtonFrame();//生成ButtonFrame对象
             frame.setTitle("ButtonTest");//设置组建的自定义标题测试按钮
             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置默认的关闭操作,参数在关闭动作时退出
             frame.setVisible(true);//图形界面设置为可见
          });
       }
    }

    实验结果如图:

    lambda表达式简化程序:

    ButtonFrame1.java:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    package button;
     
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
     
    /**
     * 一个带按钮面板的框架
     */
    public class ButtonFrame1 extends JFrame {
        private JPanel buttonPanel;//定义JPanel属性
        private static final int DEFAULT_WIDTH = 400;
        private static final int DEFAULT_HEIGHT = 300;
     
        public ButtonFrame1() {
            setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);//setSize更改宽度和高度的属性值
            buttonPanel = new JPanel();//使new JPanel指向对象buttonPanel
            makeButton("gray", Color.gray);
            makeButton("pink", Color.pink);
            add(buttonPanel);
     
        }
     
        protected void makeButton(String name,Color backgound) {
            //创建按钮
            JButton button = new JButton(name);
            //在面板中添加按钮,使用add方法
            buttonPanel.add(button);
            //Lambda表达式
            button.addActionListener((e)->{
                buttonPanel.setBackground(backgound);
            });
             
        }
     
        /**
         * 设置面板背景颜色的动作侦听器
         */
        /*private class ColorAction implements ActionListener {
            private Color backgroundColor;
     
            public ColorAction(Color c) {
                backgroundColor = c;
            }
     
            public void actionPerformed(ActionEvent event) {
                buttonPanel.setBackground(backgroundColor);
            }
        }*/
    }

    运行结果如图:

    测试程序2:

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

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

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

    实验代码如下:

    PlafFrame.java:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    package plaf;
     
    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.setLookAndFeel(infos[0].getClassName())
          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)
       {
          // 添加按钮至Panel
          JButton button = new JButton(name);
          buttonPanel.add(button);
     
          //设置按钮操作
          button.addActionListener(event -> {
             // 按钮操作:切换到新的外观和感觉
             try
             {
                //设置成你所使用的平台的外观。  java的图形界面外观有3种,默认是java的金属外观,还有就是windows系统,motif系统外观.
                UIManager.setLookAndFeel(className);
                SwingUtilities.updateComponentTreeUI(this);
                pack();//依据放置的组件设定窗口的大小, 使之正好能容纳放置的所有组件
             }
             catch (Exception e)//抛出异常
             {
                e.printStackTrace();//深层次的输出异常调用的流程
             }
          });
       }
    }

    PlafTest.java:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    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();//生成PlafFrame对象
             frame.setTitle("PlafTest");//设置组建的自定义标题测试按钮
             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置默认的关闭操作
             frame.setVisible(true);
          });
       }
    }

    运行结果如图:

    测试程序3:

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

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

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

    实验代码如下:

    ActionFrame.java:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    package action;
     
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
     
    /**
     * 具有显示颜色变化动作的面板的框架
     */
    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();
     
          var yellowAction = new ColorAction("Yellow"new ImageIcon("yellow-ball.gif"),
                Color.YELLOW);
          var blueAction = new ColorAction("Blue"new ImageIcon("blue-ball.gif"), Color.BLUE);
          var 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(buttonPanel);
     
          // associate the Y, B, and R keys with names
          InputMap inputMap = buttonPanel.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
          inputMap.put(KeyStroke.getKeyStroke("ctrl Y"), "panel.yellow");
          inputMap.put(KeyStroke.getKeyStroke("ctrl B"), "panel.blue");
          inputMap.put(KeyStroke.getKeyStroke("ctrl R"), "panel.red");
      
          // associate the names with actions
          ActionMap actionMap = buttonPanel.getActionMap();
          actionMap.put("panel.yellow", yellowAction);
          actionMap.put("panel.blue", blueAction);
          actionMap.put("panel.red", redAction);
       }
        
       public class ColorAction extends AbstractAction
       {
          /**
           *构造颜色动作
           * @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)
          {
             var color = (Color) getValue("color");
             buttonPanel.setBackground(color);//设置背景颜色
          }
       }
    }

    ActionTest.java:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    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(() -> {
             var frame = new ActionFrame();
             frame.setTitle("ActionTest");//设置标题
             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
             frame.setVisible(true);
          });
       }
    }

    运行结果如图:

    测试程序4:

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

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

    实验代码如下:

     MouseComponent.java:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    package mouse;
     
    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; // java类库中用来描述矩形的类,它的对象可以看作是一个矩形
     
       public MouseComponent()
       {
          squares = new ArrayList<>();
          current = null;
     
          addMouseListener(new MouseHandler());// 添加一个我们实现的类,这个类继承了监测鼠标点击情况的MouseListener
          addMouseMotionListener(new MouseMotionHandler());// 添加另一个实现类,这个类继承了监测鼠标移动情况的MouseMotionListener
       }
     
       public Dimension getPreferredSize()
       {
          return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT);
       }  
        
       public void paintComponent(Graphics g)
       {
          var 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; //contains方法:测定坐标是否在图形的边界内
          }
          return null;
       }
     
       /**
        * 在这个坐标位置增加一个图形 .
        * @param p the center of the square
        */
       public void add(Point2D p)
       {
           //获取x,y的坐标
          double x = p.getX();
          double y = p.getY();
     
          current = new Rectangle2D.Double(x - SIDELENGTH / 2, y - SIDELENGTH / 2,
             SIDELENGTH, SIDELENGTH);//用获得的坐标和既定的边长构建一个新的正方形,并将其赋值给current
          squares.add(current);
          repaint();
       }
     
       /**
        * 从集合中移除正方形
        * @param s the square to remove
        */
       public void remove(Rectangle2D s)
       {
          if (s == nullreturn;//移除内容为空,返回
          if (s == current) current = null;//如果要移除的内容和current正指向的内容相同,则将current清空
          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)
          {
             // 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)
             {
                //因为在调用这个方法之前肯定会调用点击鼠标的方法
                //所以我们直接判断:如果现在current不为空
                //像素(强制转换为int)
                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();
             }
          }
       }  
    }

    MouseTest.java:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    package mouse;
     
    import java.awt.*;
    import javax.swing.*;
     
    /**
     * @version 1.35 2018-04-10
     * @author Cay Horstmann
     */
    public class MouseTest
    {
       public static void main(String[] args)
       {
          EventQueue.invokeLater(() -> {
             var frame = new MouseFrame();
             frame.setTitle("MouseTest");
             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
             frame.setVisible(true);
          });
       }
    }

    MouseFrame.java:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    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();//依据放置的组件设定窗口的大小, 使之正好能容纳放置的所有组件
       }
    }

    运行结果如下:

    实验2:结对编程练习包含以下4部分:

    1)   程序设计思路简述;

    2)   符合编程规范的程序代码;

    3)   程序运行功能界面截图;

    4)   结对过程描述,提供两人在讨论、细化和编程时的结对照片(非摆拍)。

    代码如下:

    Test.java:

     nameRardom.java:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    import java.awt.Color;
    import java.awt.Container;
    import java.awt.event.*;
    import java.io.*;
    import java.util.*;
    import java.util.Timer;
     
    import javax.swing.*;
     
    public class nameRardom extends JFrame {
        private ArrayList arrayList;
        {
        arrayList = new ArrayList<>();
        //读文件
        File file = new File("D:/2019studentlist.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) {
             
            e1.printStackTrace();
        catch (IOException e1) {
            
            e1.printStackTrace();
        }
        }
        private JPanel a;
        private static final int DEFAULT_WIDTH = 500;
        private static final int DEFAULT_HEIGHT = 300;
        public nameRardom() {
            setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
            a = new JPanel();
            a.setLayout(null);
            JLabel jLabel = new JLabel("随机点名器");
            JButton jButton = new JButton("开始");
            jLabel.setBounds(200506540);
            jButton.setBounds(200906540);
            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.pink);
                            jLabel.setText((String) arrayList.get((int) (Math.random() * 35)));
                        }
                    };
                    timer.schedule(timerTask, 0100);
                }
                if (jButton.getText().equals("停止")) {
                    timer.cancel();
                    jButton.setText("开始");
                    jButton.setBackground(Color.LIGHT_GRAY);
                }
            }
            });
            a.add(jLabel);
            a.add(jButton);
            add(a);
        }
    }
    实验总结:掌握了事件处理的基本原理,并学会了事件处理的基本编程模型
    了解GUI界面组件观感设置方法;学习时知识点较多,故还需要自己在课后花更多的时间理解和记忆,最后在掌握了WindowAdapter类、AbstractAction类的用法后, 学习了GUI程序中鼠标事件处理技术,对利用java语言设计小型界面有了更多的学习,
  • 相关阅读:
    [Windwos Phone 7] Accelerometer
    [Windwos Phone 7] 获取设备相关信息
    实现ZUNE上软件商城的软件星级推荐效果
    [Windows Phone 7]如何判断手机是否有网络连接
    [Windows Phone 7]UI对屏幕的自适应的处理
    [Windows Phone 7]开发分享图片的插件(2)
    [Windows Phone 7]如何导航页面和页面间传值
    windows phone 从cer中提出公钥然后再RSA加密的问题
    异步上传文件插件AjaxFileUploader在Asp.net MVC中应用
    微软认证考试分析
  • 原文地址:https://www.cnblogs.com/ws-t/p/11930696.html
Copyright © 2020-2023  润新知