zoukankan      html  css  js  c++  java
  • 张季跃 201771010139《面向对象程序设计(java)》第十三周学习总结

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

    实验部分:

    1、实验目的与要求

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

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

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

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

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

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

    2、实验内容和步骤

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

    测试程序1:

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

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

    l 用lambda表达式简化程序;

    l 掌握JButton组件的基本API;

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

    测试程序:

    ButtonFrame:

     

    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;//宽300

       private static final int DEFAULT_HEIGHT = 200;//高200

     

       public ButtonFrame()

       {      

          setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);

     

          // 创建按钮

          JButton orangeButton = new JButton("Orange");//创建一个带文本的按钮。

          JButton blueButton = new JButton("blue");

          JButton greyButton = new JButton("Grey");

     

          buttonPanel = new JPanel();

     

          // 向面板添加按钮

          buttonPanel.add(orangeButton);

          buttonPanel.add(blueButton);

          buttonPanel.add(greyButton);

     

          // 向框架添加面板

          add(buttonPanel);

     

          // 创建按钮操作

          ColorAction orangeAction= new ColorAction(Color.ORANGE);

          ColorAction blueAction = new ColorAction(Color.BLUE);

          ColorAction greyAction = new ColorAction(Color.GRAY);

     

          // 将操作与按钮相关联

          orangeButton.addActionListener(orangeAction);

          blueButton.addActionListener(blueAction);

          greyButton.addActionListener(greyAction);

       }

     

       /**

        * 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);

          }

       }

    }

    ButtonTest:

     

    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)

       {

    //lambda表达式

          EventQueue.invokeLater(() -> {

             JFrame frame = new ButtonFrame();

             frame.setTitle("ButtonTest");

             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

             frame.setVisible(true);

          });

       }

    }

     

    实验结果:

     

     

    测试程序2:

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

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

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

    测试程序:

    PlafFrame:

     

    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

    {

       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);

     

          // set button action

     

          button.addActionListener(event -> {

             // button action: switch to the new look-and-feel

             try

             {

                UIManager.setLookAndFeel(className);

                SwingUtilities.updateComponentTreeUI(this);

                pack();

             }

             catch (Exception e)

             {

                e.printStackTrace();

             }

          });

       }

    }

     

    PlafTest:

     

     

    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类及其动作对象;

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

    测试程序:

    ActionFrame:

     

    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);

     

          buttonPanel = new JPanel();

     

          // define actions

          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);

     

          // 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.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);

          }

       }

    }

    ActionTest:

     

    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);

          });

       }

    }

     

     

    实验结果:

     

     

    测试程序4:

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

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

    测试程序:

    MouseCmponent:  

    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 = 30;

       private ArrayList<Rectangle2D> squares;

       private Rectangle2D current; // the square containing the mouse cursor

     

       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;

     

          // 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;

          }

          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 square

             current = find(event.getPoint());

             if (current == null) add(event.getPoint());

          }

     

          public void mouseClicked(MouseEvent event)

          {

             // remove the current square if double clicked

             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)

             {

                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();

             }

          }

       }   

    }

     

    MouseFrame:   

     

    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();

       }

    }

     

    MouseTest:

     

     

    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);

          });

       }

    }

     

    实验结果:

     

     

    实验2:结对编程练习

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

    实验程序:

    package 点名器;

     

    import java.util.*;

    import java.awt.*;

    import javax.swing.*;

    import java.awt.event.*;

    import java.io.File;

    import java.io.FileNotFoundException;

     

    import javax.swing.event.*;

    public class NameFrame extends JFrame implements ActionListener{

        private JLabel jla;

        private JLabel jlb;

        private JButton jba;//"push" 按钮的实现

        private static boolean flag = true;//开始的按钮是否点过

        public NameFrame(){

            this.setLayout(null);

          //添加按钮

            jla = new JLabel("姓名");

            jlb = new JLabel("准备中");

            jba = new JButton("开始");

            this.add(jla);//添加组件

            this.add(jlb);

            jla.setFont(new Font("Courier",Font.PLAIN,26));//设置字体

            jla.setHorizontalAlignment(JLabel.CENTER);//X轴对称

             jla.setVerticalAlignment(JLabel.CENTER); //Y轴对称   

             jla.setBounds(20,100,180,30);

             jlb.setOpaque(true);

             jlb.setBackground(Color.cyan);//设置背景的颜色

             jlb.setFont(new Font("Courier",Font.PLAIN,22));

            jlb.setHorizontalAlignment(JLabel.CENTER);

             jlb.setVerticalAlignment(JLabel.CENTER);        

             jlb.setBounds(150,100,120,30);

             //设置窗口大小

             this.add(jba);

             jba.setBounds(150,150,80,26);

          

             jba.addActionListener(this);

     

             this.setTitle("点名器");//窗口标题

            this.setBounds(400,400,400,300);

            this.setVisible(true);

            this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);

        }

        public void actionPerformed(ActionEvent e){

         int i=0;

         String names[]=new String[50];

         try {

    Scanner in=new Scanner(new File("C:\Users\张季跃\Desktop\studentnamelist.txt"));

    while(in.hasNextLine())

    {

    names[i]=in.nextLine();

    i++;

    }

    } catch (FileNotFoundException e1) {

    // TODO Auto-generated catch block

    e1.printStackTrace();

    }

            if(jba.getText()=="开始"){//返回按钮

             jlb.setBackground(Color.MAGENTA);

                flag = true;

                new Thread(){   

                    public void run(){

                        while(NameFrame.flag){

                        Random r = new Random();

                        int i= r.nextInt(47);//返还该元素,并重新选择另一个元素

                        jlb.setText(names[i]);

                        }

                    }

                }.start();//使该线程开始执行;Java 虚拟机调用该线程的 run 方法

                jba.setText("停止");

                jba.setBackground(Color.YELLOW);

            }    

            else if(jba.getText()=="停止"){

                flag = false;

                jba.setText("开始");//按钮标题

                jba.setBackground(Color.RED);//“开始”颜色

                jlb.setBackground(Color.green);

            }

         }

        public static void main(String arguments []){

            new NameFrame();

        }

    }

    实验结果:

     

    实验总结:

           通过这一周的学习,我初步了解了有关事件处理的基本知识,对AWT事件处理机制有了基本的认识学会了如何用程序编辑创建按钮,并初步的学会了如何在自己编写的窗口中进行简单的人机互动。但在本周的实验中,我发现我对于本周的学习以及今后知识的预习还是不到位,对于本周的编程实验我简直是毫无头绪,就算是学长发的程序我也有很多看不懂的地方,必须通过查找资料和询问同学才有所收获。

     

     

     

  • 相关阅读:
    装饰器
    初始面向对象
    生成器迭代器
    初识函数
    文件操作
    数据类型补充

    集合 元祖 字典
    Python练习题 034:Project Euler 006:和平方与平方和之差
    Python练习题 033:Project Euler 005:最小公倍数
  • 原文地址:https://www.cnblogs.com/Alex-Morcer/p/10016191.html
Copyright © 2011-2022 走看看