返回列表 發帖

事件處理與傾聽者

本帖最後由 tonyh 於 2023-4-15 16: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. }
複製代碼
  1. import java.awt.event.ActionEvent;
  2. import java.awt.event.ActionListener;
  3. import javax.swing.JButton;
  4. import javax.swing.JFrame;
  5. import javax.swing.JLabel;
  6. import javax.swing.JTextField;

  7. public class Ch01{

  8.         JFrame fm;
  9.         JLabel lb1, lb2;
  10.         JTextField tf1, tf2;
  11.         JButton btn1, btn2;

  12.         Ch01()   //建構子
  13.         {
  14.                 lb1=new JLabel("1坪=3.3058平方公尺",JLabel.CENTER);
  15.                 lb1.setBounds(0, 10, 215, 30);
  16.                 lb2=new JLabel("輸入坪數:");
  17.                 lb2.setBounds(10, 40, 65, 40);

  18.                 tf1=new JTextField();
  19.                 tf1.setBounds(70, 45, 134, 30);
  20.                 tf1.addActionListener(new ActionListener() {
  21.                         @Override
  22.                         public void actionPerformed(ActionEvent e) {
  23.                                 double area=Double.parseDouble(tf1.getText())*3.3058;
  24.                                 tf2.setText(String.format("面積為: %.2f平方公尺", area));       
  25.                         }
  26.                 });
  27.                 tf2=new JTextField();
  28.                 tf2.setBounds(10, 85, 195, 40);
  29.                 tf2.setEditable(false);

  30.                 btn1=new JButton("確定");
  31.                 btn1.setBounds(10, 135, 92, 25);
  32.                 btn1.addActionListener(new ActionListener() {
  33.                         @Override
  34.                         public void actionPerformed(ActionEvent e) {
  35.                                 double area=Double.parseDouble(tf1.getText())*3.3058;
  36.                                 tf2.setText(String.format("面積為: %.2f平方公尺", area));
  37.                         }
  38.                 });
  39.                 btn2=new JButton("清除");
  40.                 btn2.setBounds(112, 135, 92, 25);
  41.                 btn2.addActionListener(new ActionListener() {
  42.                         @Override
  43.                         public void actionPerformed(ActionEvent e) {
  44.                                 tf1.setText("");
  45.                                 tf2.setText("");
  46.                         }
  47.                 });

  48.                 fm=new JFrame("土地面積換算");
  49.                 fm.setBounds(100, 100, 220, 200);
  50.                 fm.setVisible(true);
  51.                 fm.setResizable(false);
  52.                 fm.setLayout(null);
  53.                 fm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  54.                 fm.add(lb1);
  55.                 fm.add(lb2);
  56.                 fm.add(tf1);
  57.                 fm.add(tf2);
  58.                 fm.add(btn1);
  59.                 fm.add(btn2);
  60.         }

  61.         public static void main(String[] args) {
  62.                 new Ch01();   //匿名物件
  63.         }
  64. }
複製代碼

  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 Ch01 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.         Ch01()
  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.                 Ch01 app=new Ch01();
  67.         }

  68. }
複製代碼

TOP

  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 Ch01 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.         Ch01()
  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(new ActionListener() {
  25.                         @Override
  26.                         public void actionPerformed(ActionEvent e) {
  27.                                 double area=Double.parseDouble(tf1.getText())*3.3058;
  28.                                 tf2.setText(String.format("面積為: %.2f平方公尺", area));      
  29.                         }
  30.                 });
  31.                 tf2=new JTextField();
  32.                 tf2.setBounds(10, 85, 195, 40);
  33.                 tf2.setEditable(false);
  34.                
  35.                 btn1=new JButton("確定");
  36.                 btn1.setBounds(10, 135, 92, 25);
  37.                 btn1.addActionListener(new ActionListener() {
  38.                         @Override
  39.                         public void actionPerformed(ActionEvent e) {
  40.                                 double area=Double.parseDouble(tf1.getText())*3.3058;
  41.                                 tf2.setText(String.format("面積為: %.2f平方公尺", area));
  42.                         }
  43.                 });
  44.                btn2 = new JButton("清除");
  45.                btn2.setBounds(112,135,92,25);
  46.                btn2.addActionListener(new ActionListener() {
  47.                    @Override
  48.                    public void actionPerformed(ActionEvent e) {
  49.                            tf1.setText("");
  50.                            tf2.setText("");
  51.                    }
  52.            });

  53.                 fm=new JFrame("土地面積計算");
  54.                 fm.setBounds(100, 100, 220, 200);
  55.                 fm.setVisible(true);
  56.                 fm.setResizable(false);
  57.                 fm.setLayout(null);
  58.                 fm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  59.                 fm.add(lb1);
  60.                 fm.add(lb2);
  61.                 fm.add(tf1);
  62.                 fm.add(tf2);
  63.                 fm.add(btn1);
  64.                 fm.add(btn2);
  65.         }
  66.       
  67.         public void actionPerformed(ActionEvent e)
  68.         {
  69.                 if(e.getSource()==tf1 || e.getSource()==btn1)
  70.                 {
  71.                         double area=Double.parseDouble(tf1.getText())*3.3058;
  72.                         String areaStr=String.valueOf(area);
  73.                                                                                                           //String areaStr=Double.toString(area);
  74.                         tf2.setText("面積為: "+areaStr+" 平方公尺");
  75.                 }      
  76.                 if(e.getSource()==btn2)
  77.                 {
  78.                         tf1.setText("");
  79.                         tf2.setText("");
  80.                 }
  81.         }

  82.         public static void main(String[] args) {
  83.                 Ch01 app=new Ch01();
  84.         }

  85. }
複製代碼

TOP

  1. import java.awt.event.ActionEvent;
  2. import java.awt.event.ActionListener;

  3. import javax.swing.JButton;
  4. import javax.swing.JFrame;
  5. import javax.swing.JLabel;
  6. import javax.swing.JTextField;

  7. public class Ch04 implements ActionListener {

  8.         private JFrame fm;
  9.         private JLabel lb1,lb2;
  10.         private JTextField tf1,tf2;
  11.         private JButton btn1,btn2;

  12.         Ch04()
  13.         {
  14.                 lb1=new JLabel("1坪=3.3058平方公尺",JLabel.CENTER);
  15.                 lb1.setBounds(0, 10, 215, 30);
  16.                 lb2=new JLabel("輸入坪數:");
  17.                 lb2.setBounds(10, 40, 60, 40);

  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.         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.                         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.                 Ch04 app=new Ch04();
  61.         }

  62. }
複製代碼

TOP

  1. import java.awt.event.ActionEvent;
  2. import java.awt.event.ActionListener;

  3. import javax.swing.JButton;
  4. import javax.swing.JFrame;
  5. import javax.swing.JLabel;
  6. import javax.swing.JTextField;

  7. public class Ch04{

  8.         JFrame fm;
  9.         JLabel lb1,lb2;
  10.         JTextField tf1,tf2;
  11.         JButton btn1,btn2;

  12.         Ch04()
  13.         {
  14.                 lb1=new JLabel("1坪=3.3058平方公尺",JLabel.CENTER);
  15.                 lb1.setBounds(0, 10, 215, 30);
  16.                 lb2=new JLabel("輸入坪數:");
  17.                 lb2.setBounds(10, 40, 60, 40);

  18.                 tf1=new JTextField();
  19.                 tf1.setBounds(70, 45, 134, 30);
  20.                 tf1.addActionListener(new ActionListener() {
  21.                         @Override
  22.                         public void actionPerformed(ActionEvent e) {
  23.                                 double area=Double.parseDouble(tf1.getText())*3.3058;
  24.                                 tf2.setText(String.format("面積為: %.4f平方公尺", area));       
  25.                         }
  26.                 });
  27.                 tf2=new JTextField();
  28.                 tf2.setBounds(10, 85, 195, 40);
  29.                 tf2.setEditable(false);

  30.                 btn1=new JButton("確定");
  31.                 btn1.setBounds(10, 135, 92, 25);
  32.                 btn1.addActionListener(new ActionListener() {
  33.                         @Override
  34.                         public void actionPerformed(ActionEvent e) {
  35.                                 double area=Double.parseDouble(tf1.getText())*3.3058;
  36.                                 tf2.setText(String.format("面積為: %.4f平方公尺", area));                               
  37.                         }
  38.                 });
  39.                 btn2=new JButton("清除");
  40.                 btn2.setBounds(112, 135, 92, 25);
  41.                 btn2.addActionListener(new ActionListener() {
  42.                         @Override
  43.                         public void actionPerformed(ActionEvent e) {
  44.                                 tf1.setText("");
  45.                                 tf2.setText("");
  46.                         }
  47.                 });

  48.                 fm=new JFrame("土地面積計算");
  49.                 fm.setBounds(100, 100, 220, 200);
  50.                 fm.setVisible(true);
  51.                 fm.setResizable(false);
  52.                 fm.setLayout(null);
  53.                 fm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  54.                 fm.add(lb1);
  55.                 fm.add(lb2);
  56.                 fm.add(tf1);
  57.                 fm.add(tf2);
  58.                 fm.add(btn1);
  59.                 fm.add(btn2);
  60.         }

  61.         public static void main(String[] args) {
  62.                 Ch04 app=new Ch04();
  63.         }

  64. }
複製代碼

TOP

本帖最後由 鄞美旭 於 2023-4-22 12:14 編輯
  1. import java.awt.event.ActionEvent;
  2. import java.awt.event.ActionListener;

  3. import javax.swing.JButton;
  4. import javax.swing.JFrame;
  5. import javax.swing.JLabel;
  6. import javax.swing.JTextField;

  7. public class A implements ActionListener{
  8.         JFrame fm;
  9.         JLabel lb1,lb2;
  10.         JTextField tf1,tf2;
  11.         JButton btn1,btn2;
  12.         A()
  13.         {
  14.                 lb1=new JLabel("1坪=3.3058平方公尺",JLabel.CENTER);
  15.                 lb1.setBounds(0, 10, 215, 30);
  16.                 lb2=new JLabel("輸入坪數:");
  17.                 lb2.setBounds(10, 40, 65, 40);
  18.                
  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.                
  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.                
  33.                 fm=new JFrame("土地面積換算");
  34.                 fm.setBounds(100, 100, 220, 200);
  35.                 fm.setVisible(true);
  36.                 fm.setResizable(false);
  37.                 fm.setLayout(null);
  38.                 fm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  39.                 fm.add(lb1);
  40.                 fm.add(lb2);
  41.                 fm.add(tf1);
  42.                 fm.add(tf2);
  43.                 fm.add(btn1);
  44.                 fm.add(btn2);
  45.         }

  46.         public static void main(String[] args) {
  47.                 A app=new A();

  48.         }

  49.                 @Override
  50.                 public void actionPerformed(ActionEvent e) {
  51.                         if(e.getSource()==tf1 || e.getSource()==btn1)
  52.                         {
  53.                                 double area=Double.parseDouble(tf1.getText())*3.3058;
  54.                                 String areastr=String.valueOf(area);
  55.                                 tf2.setText("面積為: "+areastr+"平方公尺");
  56.                         }
  57.                         if(e.getSource()==btn2)
  58.                         {
  59.                                 tf1.setText("");
  60.                                 tf2.setText("");
  61.                         }
  62.                 }

  63. }
複製代碼

TOP

本帖最後由 鄞美旭 於 2023-4-22 12:13 編輯
  1. import java.awt.event.ActionEvent;
  2. import java.awt.event.ActionListener;
  3. import javax.swing.JButton;
  4. import javax.swing.JFrame;
  5. import javax.swing.JLabel;
  6. import javax.swing.JTextField;

  7. public class A{

  8.         JFrame fm;
  9.         JLabel lb1, lb2;
  10.         JTextField tf1, tf2;
  11.         JButton btn1, btn2;

  12.         A()
  13.         {
  14.                 lb1=new JLabel("1坪=3.3058平方公尺",JLabel.CENTER);
  15.                 lb1.setBounds(0, 10, 215, 30);
  16.                 lb2=new JLabel("輸入坪數:");
  17.                 lb2.setBounds(10, 40, 65, 40);

  18.                 tf1=new JTextField();
  19.                 tf1.setBounds(70, 45, 134, 30);
  20.                 tf1.addActionListener(new ActionListener() {
  21.                         @Override
  22.                         public void actionPerformed(ActionEvent e) {
  23.                                 double area=Double.parseDouble(tf1.getText())*3.3058;
  24.                                 tf2.setText(String.format("面積為: %.2f平方公尺", area));      
  25.                         }
  26.                 });
  27.                 tf2=new JTextField();
  28.                 tf2.setBounds(10, 85, 195, 40);
  29.                 tf2.setEditable(false);

  30.                 btn1=new JButton("確定");
  31.                 btn1.setBounds(10, 135, 92, 25);
  32.                 btn1.addActionListener(new ActionListener() {
  33.                         @Override
  34.                         public void actionPerformed(ActionEvent e) {
  35.                                 double area=Double.parseDouble(tf1.getText())*3.3058;
  36.                                 tf2.setText(String.format("面積為: %.2f平方公尺", area));
  37.                         }
  38.                 });
  39.                 btn2=new JButton("清除");
  40.                 btn2.setBounds(112, 135, 92, 25);
  41.                 btn2.addActionListener(new ActionListener() {
  42.                         @Override
  43.                         public void actionPerformed(ActionEvent e) {
  44.                                 tf1.setText("");
  45.                                 tf2.setText("");
  46.                         }
  47.                 });

  48.                 fm=new JFrame("土地面積換算");
  49.                 fm.setBounds(100, 100, 220, 200);
  50.                 fm.setVisible(true);
  51.                 fm.setResizable(false);
  52.                 fm.setLayout(null);
  53.                 fm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  54.                 fm.add(lb1);
  55.                 fm.add(lb2);
  56.                 fm.add(tf1);
  57.                 fm.add(tf2);
  58.                 fm.add(btn1);
  59.                 fm.add(btn2);
  60.         }

  61.         public static void main(String[] args) {
  62.                 new A();   
  63.         }
  64. }
複製代碼

TOP

返回列表