1. 程式人生 > >201771010109焦旭超《面向對象程序設計(java)》第十三周學習總結

201771010109焦旭超《面向對象程序設計(java)》第十三周學習總結

代碼 int see led height 名單 輸入 removes ram

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中事件處理的基本編程模型。

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); // create buttons JButton yellowButton = new JButton("Yellow"); JButton blueButton = new JButton("Blue"); JButton redButton = new JButton("Red"); buttonPanel = new JPanel(); // add buttons to panel
buttonPanel.add(yellowButton); buttonPanel.add(blueButton); buttonPanel.add(redButton); // add panel to frame add(buttonPanel); // create button actions ColorAction yellowAction = new ColorAction(Color.YELLOW); ColorAction blueAction = new ColorAction(Color.BLUE); ColorAction redAction = new ColorAction(Color.RED); // associate actions with buttons 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 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);
         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);// 更改了GUI界面的寬度和高度

        // 生成三個按鈕對象
        /*
         * JButton yellowButton = new JButton("yellow"); JButton blueButton = new
         * JButton("Blue"); JButton redButton = new JButton("Red");
         */
        buttonPanel = new JPanel();

        // 向buttonPanel內容窗格添加三個按鈕組件
        /*
         * 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);
         */
        makeButton("yellow", Color.YELLOW);
        makeButton("blue", Color.BLUE);
        makeButton("red", Color.RED);
        makeButton("green", Color.GREEN);

    }

    public void makeButton(String name, Color backgroundColor) {
        JButton button = new JButton(name);
        buttonPanel.add(button);

        ColorAction action = new ColorAction(backgroundColor);
        button.addActionListener(action);
    }

    /**
     * An action listener that sets the panel‘s background color.
     */
    private class ColorAction implements ActionListener// ColorAction為監聽器類
    {
        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);

        // create buttons
        /*
         * JButton yellowButton = new JButton("Yellow"); JButton blueButton = new
         * JButton("Blue"); JButton redButton = new JButton("Red");
         */
        buttonPanel = new JPanel();

        // add buttons to panel
        /*
         * buttonPanel.add(yellowButton); buttonPanel.add(blueButton);
         * buttonPanel.add(redButton);
         */
        // add panel to frame
        add(buttonPanel);

        // create button actions
        /*
         * ColorAction yellowAction = new ColorAction(Color.YELLOW); ColorAction
         * blueAction = new ColorAction(Color.BLUE); ColorAction redAction = new
         * ColorAction(Color.RED);
         */

        // associate actions with buttons
        /*
         * yellowButton.addActionListener(yellowAction);
         * blueButton.addActionListener(blueAction);
         * redButton.addActionListener(redAction);
         */
        makeButton("yellow", Color.YELLOW);
        makeButton("blue", Color.BLUE);
        makeButton("red", Color.RED);
        makeButton("green", Color.GREEN);

    }

    public void makeButton(String name, Color backgroundColor) {
        JButton button = new JButton(name);
        buttonPanel.add(button);
        /*
         * ColorAction action = new ColorAction(backgroundColor);
         * button.addActionListener(action);
         */
        button.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                buttonPanel.setBackground(backgroundColor);
            }
        });
    }
}

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

測試程序2:

l 在elipse IDE中調試運行教材449頁程序11-2,結合程序運行結果理解程序;

l 在組件觀感設置代碼處添加註釋;

l 了解GUI程序中觀感的設置方法。

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);
      });
   }
}
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)
   {
      // 窗格中添加按鈕

      JButton button = new JButton(name);
      buttonPanel.add(button);

      // 設定按鈕動作
      button.addActionListener(event -> {
         // 按鈕動作: 切換到新的外觀和感覺
         try
         {
            UIManager.setLookAndFeel(className);
            SwingUtilities.updateComponentTreeUI(this);
            pack();
         }
         catch (Exception e)
         {
            e.printStackTrace();
         }
      });
   }
}

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

測試程序3:

l 在elipse IDE中調試運行教材457頁-458頁程序11-3,結合程序運行結果理解程序;

l 掌握AbstractAction類及其動作對象;

l 掌握GUI程序中按鈕、鍵盤動作映射到動作對象的方法。

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

      // 定義動作
      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);

      // 為這些動作添加按鈕
      buttonPanel.add(new JButton(yellowAction));
      buttonPanel.add(new JButton(blueAction));
      buttonPanel.add(new JButton(redAction));

//將Y、B和R鍵與名稱聯系起來
      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");

      // 把名字和行動聯系起來
      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);
      });
   }
}
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();
   }
}
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; // 包含鼠標光標的正方形
   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;

      // 繪制所有方塊
      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)
      {
         // 如果光標不在正方形內,則添加一個新的正方形
         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)
      {
         //如果鼠標光標位於內部,則將其設置為交叉頭發
//矩形
         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();
         }
      }
   }   
}

技術分享圖片

實驗2:結對編程練習

利用班級名單文件、文本框和按鈕組件,設計一個有如下界面(圖1)的點名器,要求用戶點擊開始按鈕後在文本輸入框隨機顯示2017級網絡與信息安全班同學姓名,如圖2所示,點擊停止按鈕後,文本輸入框不再變換同學姓名,此同學則是被點到的同學姓名。

學長代碼添加註釋:

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;//boolean變量
    public NameFrame(){
        this.setLayout(null);//設置 LayoutManager。重寫此方法
      //創建三個具有指定文本的 JLabel 實例
        jla = new JLabel("姓名");
        jlb = new JLabel("  ");
        jba = new JButton("開始");
        this.add(jla);//添加組件
        this.add(jlb);
        jla.setFont(new Font("Courier",Font.PLAIN,25));//設置字體
        jla.setHorizontalAlignment(JLabel.CENTER);//設置標簽內容沿 X 軸的對齊方式
         jla.setVerticalAlignment(JLabel.CENTER);  //設置標簽內容沿 Y 軸的對齊方式      
         jla.setBounds(20,100,180,30);//移動組件並調整其大小
         jlb.setOpaque(true);//如果為 true,則該組件繪制其邊界內的所有像素
         jlb.setBackground(Color.cyan);//設置組件的背景色
         jlb.setFont(new Font("Courier",Font.PLAIN,25));
         jlb.setHorizontalAlignment(JLabel.CENTER);
         jlb.setVerticalAlignment(JLabel.CENTER);        
         jlb.setBounds(150,100,150,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[47];
        //捕獲異常
        try {
            Scanner in=new Scanner(new File("E:\\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.PINK);
            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.GREEN);
        }    
        else if(jba.getText()=="停止"){
            flag = false;
            jba.setText("開始");//設置按鈕的文本
            jba.setBackground(Color.WHITE);
            jlb.setBackground(Color.WHITE);
        }
     }
    public static void main(String arguments []){ 
        new NameFrame();
    }
}

技術分享圖片

技術分享圖片

實驗總結:

  第一個實驗兩次優化,首先每個監聽器執行一個單獨動作,這裏構造三個監聽器對象,然後三個按鈕共享一個監聽器對象。最後一個實驗不會做,用了學長的代碼,然後進行註釋,但還是沒有理解。下去我會認真弄懂學長的示例,盡量做到自己能夠模仿,然後自己寫。

201771010109焦旭超《面向對象程序設計(java)》第十三周學習總結