1. 程式人生 > >張季躍 201771010139《面向物件程式設計(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事件處理機制有了基本的認識學會了如何用程式編輯建立按鈕,並初步的學會了如何在自己編寫的視窗中進行簡單的人機互動。但在本週的實驗中,我發現我對於本週的學習以及今後知識的預習還是不到位,對於本週的程式設計實驗我簡直是毫無頭緒,就算是學長髮的程式我也有很多看不懂的地方,必須通過查詢資料和詢問同學才有所收穫。