Board logo

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

作者: tonyh    時間: 2015-5-23 14:00     標題: 事件處理與傾聽者

本帖最後由 tonyh 於 2015-5-23 15:50 編輯

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

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

[attach]1257[/attach]

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

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

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

[attach]1260[/attach]
  1. package ch75;

  2. import javax.swing.JFrame;
  3. import javax.swing.JLabel;
  4. import javax.swing.JTextField;
  5. import javax.swing.JButton;
  6. import java.awt.event.ActionListener;
  7. import java.awt.event.ActionEvent;
  8. public class Ch75 implements ActionListener
  9. {

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

  70. }
複製代碼

作者: 張瀚仁    時間: 2015-5-23 15:22

  1. package ch75;

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

  70. }
複製代碼

作者: 林以諾    時間: 2015-5-23 15:22

  1. package ch75;

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

  70. }
複製代碼

作者: 許逸群    時間: 2015-5-29 23:29

  1. package ch75;

  2. import javax.swing.JFrame;
  3. import javax.swing.JLabel;
  4. import javax.swing.JTextField;
  5. import javax.swing.JButton;
  6. import java.awt.event.ActionListener;
  7. import java.awt.event.ActionEvent;
  8. public class Ch75 implements ActionListener
  9. {

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

  70. }
複製代碼

作者: 劉泳鱔    時間: 2015-6-22 15:50

  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 Ch75 implements ActionListener
  8. {

  9.     private JFrame fm;
  10.     private JLabel lb1, lb2;
  11.     private JTextField tf1, tf2;
  12.     private JButton btn1, btn2;
  13.         
  14.     Ch75()
  15.     {
  16.         fm=new JFrame("土地面積換算");
  17.         lb1=new JLabel("1坪=3.3058平方公尺",JLabel.CENTER);
  18.         lb2=new JLabel("輸入坪數:");
  19.         tf1=new JTextField();
  20.         tf2=new JTextField();
  21.         btn1=new JButton("確定");
  22.         btn2=new JButton("清除");
  23.         
  24.         lb1.setBounds(0,10,215,30);
  25.         lb2.setBounds(10,40,60,40);
  26.         
  27.         tf1.setBounds(70,45,134,30);
  28.         tf1.addActionListener(this);
  29.         tf2.setBounds(10,85,195,40);
  30.         tf2.setEditable(false);
  31.         
  32.         btn1.setBounds(10,135,92,25);
  33.         btn1.addActionListener(this);
  34.         btn2.setBounds(112,135,92,25);
  35.         btn2.addActionListener(this);
  36.         
  37.         fm.setBounds(100,100,220,200);
  38.         fm.setVisible(true);
  39.         fm.setResizable(false);
  40.         fm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  41.         fm.setLayout(null);
  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 strArea=String.valueOf(area);
  56.             tf2.setText("面積為: "+strArea+" 平方公尺");
  57.         }
  58.         if(e.getSource()==btn2)
  59.         {
  60.             tf1.setText("");
  61.             tf2.setText("");
  62.         }
  63.     }
  64.         
  65.     public static void main(String[] args)
  66.     {
  67.         Ch75 app=new Ch75();        
  68.     }

  69. }
複製代碼





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