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

 

 

 

posted @ 2018-11-25 16:58  张季跃  阅读(146)  评论(0编辑  收藏  举报