Board logo

標題: 事件處理與傾聽者 [打印本頁]

作者: tonyh    時間: 2017-4-14 21:16     標題: 事件處理與傾聽者

本帖最後由 tonyh 於 2018-12-15 13:56 編輯

視窗作業系統都是採取圖形使用者介面,其程式執行流程是採用事件驅動(Event Driver)方式運作。例如程式開始執行後,等待著事件的發生,如移動滑鼠到按鈕上點按一下,就可能會執行特定方法。

Java對於事件處理方式是採用「委派事件模式」,如下圖所示:



Java將產生事件的物件稱為「事件來源」,而接收事件的物件稱為「事件傾聽者」,處理事件的方法稱為「事件處理方法」。

以本範例為例,事件來源有 tf1、btn1、btn2 三個物件,這三個物件必須分別與事件傾聽者連結在一起(即為來源物件註冊傾聽者),當事件產生時,會將來源物件以傳遞參數的方式交給事件處理方法運作。

事件處理的傾聽者介面 ActionListener 由 java.awt.event 套件所提供,使用時要先匯入。

  1. import javax.swing.JFrame;
  2. import javax.swing.JLabel;
  3. import javax.swing.JTextField;
  4. import javax.swing.JButton;
  5. import java.awt.event.ActionListener;
  6. import java.awt.event.ActionEvent;
  7. public class Ch82 implements ActionListener
  8. {
  9.        
  10.         private JFrame fm;
  11.         private JLabel lb1, lb2;
  12.         private JTextField tf1, tf2;
  13.         private JButton btn1, btn2;
  14.        
  15.         Ch82()
  16.         {
  17.                 lb1=new JLabel("1坪=3.3058平方公尺",JLabel.CENTER);
  18.                 lb1.setBounds(0, 10, 215, 30);
  19.                 lb2=new JLabel("輸入坪數:");
  20.                 lb2.setBounds(10, 40, 60, 40);
  21.                
  22.                 tf1=new JTextField();
  23.                 tf1.setBounds(70, 45, 134, 30);
  24.                 tf1.addActionListener(this);
  25.                 tf2=new JTextField();
  26.                 tf2.setBounds(10, 85, 195, 40);
  27.                 tf2.setEditable(false);
  28.                
  29.                 btn1=new JButton("確定");
  30.                 btn1.setBounds(10, 135, 92, 25);
  31.                 btn1.addActionListener(this);
  32.                 btn2=new JButton("清除");
  33.                 btn2.setBounds(112, 135, 92, 25);
  34.                 btn2.addActionListener(this);
  35.                
  36.                 fm=new JFrame("土地面積計算");
  37.                 fm.setBounds(100, 100, 220, 200);
  38.                 fm.setVisible(true);
  39.                 fm.setResizable(false);
  40.                 fm.setLayout(null);
  41.                 fm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  42.                 fm.add(lb1);
  43.                 fm.add(lb2);
  44.                 fm.add(tf1);
  45.                 fm.add(tf2);
  46.                 fm.add(btn1);
  47.                 fm.add(btn2);
  48.         }
  49.        
  50.         public void actionPerformed(ActionEvent e)
  51.         {
  52.                 if(e.getSource()==tf1 || e.getSource()==btn1)
  53.                 {
  54.                         double area=Double.parseDouble(tf1.getText())*3.3058;
  55.                         String areaStr=String.valueOf(area);
  56.                         //String areaStr=Double.toString(area);
  57.                         tf2.setText("面積為: "+areaStr+" 平方公尺");
  58.                 }       
  59.                 if(e.getSource()==btn2)
  60.                 {
  61.                         tf1.setText("");
  62.                         tf2.setText("");
  63.                 }
  64.         }

  65.         public static void main(String[] args) {
  66.                 Ch82 app=new Ch82();
  67.         }

  68. }
複製代碼

作者: 李知易    時間: 2017-4-15 22:49

本帖最後由 李知易 於 2017-4-21 21:02 編輯
  1. import javax.swing.JFrame;
  2. import javax.swing.JLabel;
  3. import javax.swing.JTextField;
  4. import javax.swing.JButton;
  5. import java.awt.event.ActionListener;
  6. import java.awt.event.ActionEvent;
  7. public class Ch82 implements ActionListener
  8. {     
  9.     private JFrame fm;
  10.     private JLabel lb1, lb2;
  11.     private JTextField tf1, tf2;
  12.     private JButton btn1, btn2;
  13.     Ch82()
  14.     {
  15.             lb1=new JLabel("1坪=3.3058平方公尺",JLabel.CENTER);
  16.             lb1.setBounds(0, 10, 215, 30);
  17.             lb2=new JLabel("輸入坪數:");
  18.             lb2.setBounds(10, 40, 60, 40);
  19.             
  20.             tf1=new JTextField();
  21.             tf1.setBounds(70, 45, 134, 30);
  22.             tf1.addActionListener(this);
  23.             tf2=new JTextField();
  24.             tf2.setBounds(10, 85, 195, 40);
  25.             tf2.setEditable(false);
  26.             btn1=new JButton("確定");
  27.             btn1.setBounds(10, 135, 92, 25);
  28.             btn1.addActionListener(this);
  29.             btn2=new JButton("清除");
  30.             btn2.setBounds(112, 135, 92, 25);
  31.             btn2.addActionListener(this);
  32.             fm=new JFrame("土地面積計算");
  33.             fm.setBounds(100, 100, 220, 200);
  34.             fm.setVisible(true);
  35.             fm.setResizable(false);
  36.             fm.setLayout(null);
  37.             fm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  38.             fm.add(lb1);
  39.             fm.add(lb2);
  40.             fm.add(tf1);
  41.             fm.add(tf2);
  42.             fm.add(btn1);
  43.             fm.add(btn2);
  44.     }
  45.     public void actionPerformed(ActionEvent e)
  46.     {
  47.             if(e.getSource()==tf1 || e.getSource()==btn1)
  48.             {
  49.                     double area=Double.parseDouble(tf1.getText())*3.3058;
  50.                     String areaStr=String.valueOf(area);
  51.          
  52.                     tf2.setText("面積為: "+areaStr+" 平方公尺");
  53.             }        
  54.             if(e.getSource()==btn2)
  55.             {
  56.                     tf1.setText("");
  57.                     tf2.setText("");
  58.             }
  59.     }
  60.     public static void main(String[] args)
  61.     {
  62.             Ch82 app=new Ch82();
  63.     }

  64. }
複製代碼

作者: 陳思惟    時間: 2017-4-21 18:24

  1. import javax.swing.JFrame;
  2. import javax.swing.JLabel;
  3. import javax.swing.JTextField;
  4. import javax.swing.JButton;
  5. import java.awt.event.ActionListener;
  6. import java.awt.event.ActionEvent;
  7. public class Ch82 implements ActionListener
  8. {
  9.         
  10.         private JFrame fm;
  11.         private JLabel lb1, lb2;
  12.         private JTextField tf1, tf2;
  13.         private JButton btn1, btn2;
  14.         
  15.         Ch82()
  16.         {
  17.                 lb1=new JLabel("1坪=3.3058平方公尺",JLabel.CENTER);
  18.                 lb1.setBounds(0, 10, 215, 30);
  19.                 lb2=new JLabel("輸入坪數:");
  20.                 lb2.setBounds(10, 40, 60, 40);
  21.                
  22.                 tf1=new JTextField();
  23.                 tf1.setBounds(70, 45, 134, 30);
  24.                 tf1.addActionListener(this);
  25.                 tf2=new JTextField();
  26.                 tf2.setBounds(10, 85, 195, 40);
  27.                 tf2.setEditable(false);
  28.                
  29.                 btn1=new JButton("確定");
  30.                 btn1.setBounds(10, 135, 92, 25);
  31.                 btn1.addActionListener(this);
  32.                 btn2=new JButton("清除");
  33.                 btn2.setBounds(112, 135, 92, 25);
  34.                 btn2.addActionListener(this);
  35.                
  36.                 fm=new JFrame("土地面積計算");
  37.                 fm.setBounds(100, 100, 220, 200);
  38.                 fm.setVisible(true);
  39.                 fm.setResizable(false);
  40.                 fm.setLayout(null);
  41.                 fm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  42.                 fm.add(lb1);
  43.                 fm.add(lb2);
  44.                 fm.add(tf1);
  45.                 fm.add(tf2);
  46.                 fm.add(btn1);
  47.                 fm.add(btn2);
  48.         }
  49.         
  50.         public void actionPerformed(ActionEvent e)
  51.         {
  52.                 if(e.getSource()==tf1 || e.getSource()==btn1)
  53.                 {
  54.                         double area=Double.parseDouble(tf1.getText())*3.3058;
  55.                         String areaStr=String.valueOf(area);
  56.                         //String areaStr=Double.toString(area);
  57.                         tf2.setText("面積為: "+areaStr+" 平方公尺");
  58.                 }        
  59.                 if(e.getSource()==btn2)
  60.                 {
  61.                         tf1.setText("");
  62.                         tf2.setText("");
  63.                 }
  64.         }

  65.         public static void main(String[] args) {
  66.                 Ch82 app=new Ch82();
  67.         }

  68. }
複製代碼

作者: 曾挺桂    時間: 2017-4-21 20:11

  1. import javax.swing.JFrame;
  2. import javax.swing.JLabel;
  3. import javax.swing.JTextField;
  4. import javax.swing.JButton;
  5. import java.awt.event.ActionListener;
  6. import java.awt.event.ActionEvent;
  7. public class Erer implements ActionListener
  8. {      
  9.         private JFrame fm;
  10.         private JLabel lb1, lb2;
  11.         private JTextField tf1, tf2;
  12.         private JButton btn1, btn2;     
  13.         Erer()
  14.         {
  15.                 lb1=new JLabel("1坪=3.3058平方公尺",JLabel.CENTER);
  16.                 lb1.setBounds(0, 10, 215, 30);
  17.                 lb2=new JLabel("輸入坪數:");
  18.                 lb2.setBounds(10, 40, 60, 40);            
  19.                 tf1=new JTextField();
  20.                 tf1.setBounds(70, 45, 134, 30);
  21.                 tf1.addActionListener(this);
  22.                 tf2=new JTextField();
  23.                 tf2.setBounds(10, 85, 195, 40);
  24.                 tf2.setEditable(false);        
  25.                 btn1=new JButton("確定");
  26.                 btn1.setBounds(10, 135, 92, 25);
  27.                 btn1.addActionListener(this);
  28.                 btn2=new JButton("清除");
  29.                 btn2.setBounds(112, 135, 92, 25);
  30.                 btn2.addActionListener(this);               
  31.                 fm=new JFrame("土地面積計算");
  32.                 fm.setBounds(100, 100, 220, 200);
  33.                 fm.setVisible(true);
  34.                 fm.setResizable(false);
  35.                 fm.setLayout(null);
  36.                 fm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  37.                 fm.add(lb1);
  38.                 fm.add(lb2);
  39.                 fm.add(tf1);
  40.                 fm.add(tf2);
  41.                 fm.add(btn1);
  42.                 fm.add(btn2);
  43.         }   
  44.         public void actionPerformed(ActionEvent e)
  45.         {
  46.                 if(e.getSource()==tf1 || e.getSource()==btn1)
  47.                 {
  48.                         double area=Double.parseDouble(tf1.getText())*3.3058;
  49.                         String areaStr=String.valueOf(area);
  50.                         //String areaStr=Double.toString(area);
  51.                         tf2.setText("面積為: "+areaStr+" 平方公尺");
  52.                 }        
  53.                 if(e.getSource()==btn2)
  54.                 {
  55.                         tf1.setText("");
  56.                         tf2.setText("");
  57.                 }
  58.         }
  59.         public static void main(String[] args) {
  60.                 Erer app=new Erer();
  61.         }
  62. }
複製代碼

作者: 梁和雋    時間: 2017-4-21 20:17

  1. import javax.swing.*;
  2. import java.awt.event.*;
  3. public class Ch81 implements ActionListener
  4. {  
  5.        
  6.     private JFrame fm;
  7.     private JLabel lb1, lb2;
  8.     private JTextField tf1, tf2;
  9.     private JButton btn1, btn2;
  10.    
  11.     Ch81()
  12.     {
  13.         lb1=new JLabel("1坪=3.3058平方公尺",JLabel.CENTER);
  14.         lb1.setBounds(0, 10, 215, 30);
  15.         lb2=new JLabel("輸入坪數:");
  16.         lb2.setBounds(10, 40, 60, 40);
  17.                
  18.         tf1=new JTextField();
  19.         tf1.setBounds(70, 45, 134, 30);
  20.         tf1.addActionListener(this);
  21.         tf2=new JTextField();
  22.         tf2.setBounds(10, 85, 195, 40);
  23.         tf2.setEditable(false);
  24.                
  25.         btn1=new JButton("確定");
  26.         btn1.setBounds(10, 135, 92, 25);
  27.         btn1.addActionListener(this);
  28.         btn2=new JButton("清除");
  29.         btn2.setBounds(112, 135, 92, 25);
  30.         btn2.addActionListener(this);
  31.                
  32.         fm=new JFrame("土地面積計算");
  33.         fm.setBounds(100, 100, 220, 200);
  34.         fm.setVisible(true);
  35.         fm.setResizable(false);
  36.         fm.setLayout(null);
  37.         fm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  38.                
  39.         fm.add(lb1);
  40.         fm.add(tf1);      
  41.         fm.add(btn1);
  42.         fm.add(lb2);      
  43.         fm.add(tf2);
  44.         fm.add(btn2);
  45.     }
  46.    
  47.     public void actionPerformed(ActionEvent e)
  48.     {
  49.         if(e.getSource()==tf1 || e.getSource()==btn1)
  50.         {
  51.             double area=Double.parseDouble(tf1.getText())*3.3058;
  52.             String areaStr=String.valueOf(area);
  53.             tf2.setText("面積為: "+areaStr+" 平方公尺");
  54.         }      
  55.         
  56.         if(e.getSource()==btn2)
  57.         {
  58.             tf1.setText("");
  59.             tf2.setText("");
  60.         }
  61.      }

  62.      public static void main(String[] args)
  63.      {
  64.          Ch81 app=new Ch81();
  65.      }
  66. }
複製代碼

作者: 黃璽安    時間: 2017-4-21 20:17

  1. import javax.swing.JFrame;
  2. import javax.swing.JLabel;
  3. import javax.swing.JTextField;
  4. import javax.swing.JButton;
  5. import java.awt.event.ActionListener;
  6. import java.awt.event.ActionEvent;
  7. public class CH000 implements ActionListener
  8. {
  9.         
  10.         private JFrame fm;
  11.         private JLabel lb1, lb2;
  12.         private JTextField tf1, tf2;
  13.         private JButton btn1, btn2;
  14.         
  15.         CH000()
  16.         {
  17.                 lb1=new JLabel("1坪=3.3058平方公尺",JLabel.CENTER);
  18.                 lb1.setBounds(0, 10, 215, 30);
  19.                 lb2=new JLabel("輸入坪數:");
  20.                 lb2.setBounds(10, 40, 60, 40);
  21.                
  22.                 tf1=new JTextField();
  23.                 tf1.setBounds(70, 45, 134, 30);
  24.                 tf1.addActionListener(this);
  25.                 tf2=new JTextField();
  26.                 tf2.setBounds(10, 85, 195, 40);
  27.                 tf2.setEditable(false);
  28.                
  29.                 btn1=new JButton("確定");
  30.                 btn1.setBounds(10, 135, 92, 25);
  31.                 btn1.addActionListener(this);
  32.                 btn2=new JButton("清除");
  33.                 btn2.setBounds(112, 135, 92, 25);
  34.                 btn2.addActionListener(this);
  35.                
  36.                 fm=new JFrame("土地面積計算");
  37.                 fm.setBounds(100, 100, 220, 200);
  38.                 fm.setVisible(true);
  39.                 fm.setResizable(false);
  40.                 fm.setLayout(null);
  41.                 fm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  42.                 fm.add(lb1);
  43.                 fm.add(lb2);
  44.                 fm.add(tf1);
  45.                 fm.add(tf2);
  46.                 fm.add(btn1);
  47.                 fm.add(btn2);
  48.         }
  49.         
  50.                 public void actionPerformed(ActionEvent e)
  51.                 {
  52.                         if(e.getSource()==tf1 || e.getSource()==btn1)
  53.                         {
  54.                                 double area=Double.parseDouble(tf1.getText())*3.058;
  55.                                 String areaStr=String.valueOf(area);
  56.                                 tf2.setText("面積為: "+areaStr+"平方公尺");                       
  57.                         }
  58.                         if(e.getSource()==btn2)
  59.                         {
  60.                                 tf1.setText("");
  61.                                 tf2.setText("");                               
  62.                         }
  63.                 }
  64.                 public static void main(String[]args)
  65.                 {
  66.                         CH000 app=new CH000();
  67.                 }
  68.         }
複製代碼

作者: 洪振庭    時間: 2017-4-21 20:21

  1. import javax.swing.*;
  2. import java.awt.event.ActionListener;
  3. import java.awt.event.ActionEvent;
  4. public class Ch83 implements ActionListener{
  5.         
  6.         private JFrame fm1;
  7.         private JButton btn1,btn2;
  8.         private JTextField tf1,tf2;
  9.         private JLabel lb1,lb2;
  10.         Ch83(){
  11.             JFrame fm1=new JFrame();
  12.             JLabel lb1=new JLabel("一坪=3.3058平方公尺");
  13.             JLabel lb2=new JLabel("輸入坪數:");
  14.             JTextField tf1=new JTextField();
  15.             JTextField tf2=new JTextField();
  16.             JButton btn1=new JButton("確定");
  17.             JButton btn2=new JButton("清除");
  18.             
  19.             tf1.setBounds(70,45,134,30);
  20.             tf1.addActionListener(this);
  21.             tf2.setBounds(10,85,195,40);
  22.             tf2.setEditable(false);
  23.             
  24.             lb1.setBounds(45,10,215,30);
  25.             lb2.setBounds(10,40,60,40);
  26.             
  27.             btn1.setBounds(10,135,92,25);
  28.             btn1.addActionListener(this);
  29.             btn2.setBounds(112,135,92,25);
  30.             btn2.addActionListener(this);
  31.             
  32.             fm1.setTitle("JTextField test");
  33.             fm1.setBounds(100,100,220,200);
  34.             fm1.setVisible(true);
  35.             fm1.setResizable(false);
  36.             fm1.setLayout(null);
  37.             fm1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  38.             fm1.add(lb1);
  39.             fm1.add(lb2);
  40.             fm1.add(tf1);
  41.             fm1.add(tf2);
  42.             fm1.add(btn1);
  43.             fm1.add(btn2);
  44.         }
  45.         public void actionProfromed(ActionEvent e){
  46.                 if(e.getSource()==tf1 || e.getSource()== btn1){
  47.                         double asr=Double.parseDouble(tf1.getText())*3.3058;
  48.                         String layasr=String.valueOf(asr);
  49.                         tf2.setText("面積為:"+layasr+"平方公分");
  50.                 }
  51.                 if(e.getSource()==btn2){
  52.                         tf1.setText("");
  53.                         tf2.setText("");
  54.                 }
  55.         }
  56.     public static void main(String[] args){
  57.             Ch83 app=new Ch83();
  58.     }
  59. }
複製代碼





歡迎光臨 種子論壇 | 高雄市資訊培育協會學員討論區 (http://seed.istak.org.tw/) Powered by Discuz! 7.2