標題:
事件處理與傾聽者
[打印本頁]
作者:
tonyh
時間:
2016-1-30 17:00
標題:
事件處理與傾聽者
本帖最後由 tonyh 於 2016-1-30 17:47 編輯
視窗作業系統都是採取圖形使用者介面,其程式執行流程是採用事件驅動(Event Driver)方式運作。例如程式開始執行後,等待著事件的發生,如移動滑鼠到按鈕上點按一下,就可能會執行特定方法。
Java對於事件處理方式是採用「委派事件模式」,如下圖所示:
Java將產生事件的物件稱為「事件來源」,而接收事件的物件稱為「事件傾聽者」,處理事件的方法稱為「事件處理方法」。
以本範例為例,事件來源有 tf1、btn1、btn2 三個物件,這三個物件必須分別與事件傾聽者連結在一起(即為來源物件註冊傾聽者),當事件產生時,會將來源物件以傳遞參數的方式交給事件處理方法運作。
事件處理的傾聽者介面 ActionListener 由 java.awt.event 套件所提供,使用時要先匯入。
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class Ch82 implements ActionListener
{
private JFrame fm;
private JLabel lb1, lb2;
private JTextField tf1, tf2;
private JButton btn1, btn2;
Ch82()
{
lb1=new JLabel("1坪=3.3058平方公尺",JLabel.CENTER);
lb1.setBounds(0, 10, 215, 30);
lb2=new JLabel("輸入坪數:");
lb2.setBounds(10, 40, 60, 40);
tf1=new JTextField();
tf1.setBounds(70, 45, 134, 30);
tf1.addActionListener(this);
tf2=new JTextField();
tf2.setBounds(10, 85, 195, 40);
tf2.setEditable(false);
btn1=new JButton("確定");
btn1.setBounds(10, 135, 92, 25);
btn1.addActionListener(this);
btn2=new JButton("清除");
btn2.setBounds(112, 135, 92, 25);
btn2.addActionListener(this);
fm=new JFrame("土地面積計算");
fm.setBounds(100, 100, 220, 200);
fm.setVisible(true);
fm.setResizable(false);
fm.setLayout(null);
fm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fm.add(lb1);
fm.add(lb2);
fm.add(tf1);
fm.add(tf2);
fm.add(btn1);
fm.add(btn2);
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==tf1 || e.getSource()==btn1)
{
double area=Double.parseDouble(tf1.getText())*3.3058;
String areaStr=String.valueOf(area);
//String areaStr=Double.toString(area);
tf2.setText("面積為: "+areaStr+" 平方公尺");
}
if(e.getSource()==btn2)
{
tf1.setText("");
tf2.setText("");
}
}
public static void main(String[] args) {
Ch82 app=new Ch82();
}
}
複製代碼
作者:
李允軒
時間:
2016-1-30 17:41
import javax.swing.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class Ch80 implements ActionListener{
private JFrame fm1;
private JLabel lb1, lb2;
private JTextField tf3, tf2;
private JButton bt1, bt2;
Ch80(){
fm1=new JFrame("土地面積運算");
lb1=new JLabel("1坪=3.3058平方公尺",JLabel.CENTER);
lb2=new JLabel("輸入坪數:");
tf3=new JTextField();
tf2=new JTextField();
bt1=new JButton("確定");
bt2=new JButton("清除");
bt1.setBounds(10,135,93,25);
bt1.addActionListener(this);
bt2.setBounds(113,135,93,25);
bt2.addActionListener(this);
tf2.setBounds(70, 50, 135, 30);
tf2.addActionListener(this);
tf3.setBounds(10, 85, 194, 40);
tf3.setEditable(false);
lb1.setBounds(10, 10, 195, 30);
lb2.setBounds(10, 50, 55, 30);
fm1.setBounds(100, 100, 221, 200);
fm1.setVisible(true);
fm1.setResizable(false);
fm1.setLayout(null);
fm1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fm1.add(lb1);
fm1.add(lb2);
fm1.add(bt1);
fm1.add(bt2);
fm1.add(tf2);
fm1.add(tf3);
}
public void actionPerformed(ActionEvent e){
if(e.getSource()==tf2 || e.getSource()==bt1){
double area=Double.parseDouble(tf2.getText())*3.3058;
tf3.setText("面積為: "+area+" 平方公尺");
}
if(e.getSource()==bt2){
tf2.setText("");
tf3.setText("");
}
}
public static void main(String[] args) {
Ch80 app=new Ch80();
}
}
複製代碼
作者:
林宇翔
時間:
2016-1-30 17:42
package ch6666;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class ch6666 implements ActionListener
{
private JFrame fm;
private JLabel lb1, lb2;
private JTextField tf1, tf2;
private JButton btn1, btn2;
ch6666()
{
lb1=new JLabel("1坪=3.3058平方公尺",JLabel.CENTER);
lb1.setBounds(0, 10, 215, 30);
lb2=new JLabel("輸入坪數:");
lb2.setBounds(10, 40, 60, 40);
tf1=new JTextField();
tf1.setBounds(70, 45, 134, 30);
tf2=new JTextField();
tf2.setBounds(10, 85, 195, 40);
tf2.setEditable(false);
tf1.addActionListener(this);
btn1.addActionListener(this);
btn2.addActionListener(this);
btn1=new JButton("確定");
btn1.setBounds(10, 135, 92, 25);
btn2=new JButton("清除");
btn2.setBounds(112, 135, 92, 25);
fm=new JFrame("土地面積計算");
fm.setBounds(100, 100, 220, 200);
fm.setVisible(true);
fm.setResizable(false);
fm.setLayout(null);
fm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fm.add(lb1);
fm.add(lb2);
fm.add(tf1);
fm.add(tf2);
fm.add(btn1);
fm.add(btn2);
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==tf1 || e.getSource() == btn1)
{
double area=Double.parseDouble(tf1.getText())*3.3058;
String areaStr=String.valueOf(area);
tf2.setText("面積為: "+areaStr+" 平方公尺");
}
if(e.getSource()==btn2)
{
tf1.setText("");
tf2.setText("");
; }
}
public static void main(String[] args)
{
ch6666 app=new ch6666();
}
}
複製代碼
作者:
劉得恩
時間:
2016-1-30 17:46
import javax.swing.*;
import java.awt.event.*;
public class Ch82 implements ActionListener
{
JFrame f;
JButton clear,ok;
JLabel l1,l2;
JTextField in,out;
Ch82()
{
f=new JFrame("A\u05a4\u0201");
f.setVisible(true);
f.setBounds(100,100,300,300);
f.setLayout(null);
f.setResizable(false);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
/***********************************************/
l1=new JLabel("1坪=3.3058平方公尺",JLabel.CENTER);
l1.setBounds(0,0,294,30);
/***********************************************/
l2=new JLabel("輸入坪數:");
l2.setBounds(10,40,90,30);
/***********************************************/
in=new JTextField();
in.setBounds(80,40,200,30);
in.addActionListener(this);
out=new JTextField();
out.setBounds(10,80,280,60);
out.setEditable(false);
/***********************************************/
ok=new JButton("確定");
ok.setBounds(10,150,100,30);
ok.addActionListener(this);
clear=new JButton("清除");
clear.setBounds(190,150,100,30);
clear.addActionListener(this);
/***********************************************/
f.add(l1);
f.add(l2);
f.add(in);
f.add(out);
f.add(ok);
f.add(clear);
}
public static void main(String args[])
{
new Ch82();
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==ok||e.getSource()==in)
{
double n=Double.parseDouble(in.getText())*3.3058;
out.setText("面積為:"+n+"平方公尺");
}
else
{
in.setText("");
out.setText("");
}
}
}
複製代碼
作者:
張峻瑋
時間:
2016-1-30 17:48
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class Ch81 implements ActionListener{
private JFrame fm;
private JLabel lb1,lb2;
private JTextField tf1,tf2;
private JButton btn1,btn2;
Ch81()
{
fm=new JFrame("土地面積換算");
fm.setBounds(100, 100, 220, 200);
fm.setVisible(true);
fm.setResizable(false);
fm.setLayout(null);
fm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
lb1=new JLabel("1坪=3.3058平方公尺",JLabel.CENTER);
lb2=new JLabel("輸入坪數:");
lb1.setBounds(5,15,200,20);
lb2.setBounds(10,45,70,20);
tf1=new JTextField();
tf2=new JTextField();
tf1.setBounds(70,38,135,30);
tf2.setBounds(10,80,195,45);
tf2.setEditable(false);
tf1.addActionListener(this);
btn1=new JButton("確定");
btn2=new JButton("清除");
btn1.setBounds(10,140,92,25);
btn2.setBounds(111,140,92,25);
btn1.addActionListener(this);
btn2.addActionListener(this);
fm.add(lb1);
fm.add(lb2);
fm.add(tf1);
fm.add(tf2);
fm.add(btn1);
fm.add(btn2);
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==tf1 || e.getSource()==btn1)
{
double area=Double.parseDouble(tf1.getText())*3.3058;
tf2.setText("面積為"+area+"平方公尺");
}
if(e.getSource()==btn2)
{
tf1.setText("");
tf2.setText("");
}
}
public static void main(String[] args) {
Ch81 app=new Ch81();
}
}
複製代碼
作者:
張彥承
時間:
2016-6-7 19:27
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class Ch82 implements ActionListener
{
private JFrame fm;
private JLabel lb1, lb2;
private JTextField tf1, tf2;
private JButton btn1, btn2;
Ch82()
{
lb1=new JLabel("1坪=3.3058平方公尺",JLabel.CENTER);
lb1.setBounds(0, 10, 215, 30);
lb2=new JLabel("輸入坪數:");
lb2.setBounds(10, 40, 60, 40);
tf1=new JTextField();
tf1.setBounds(70, 45, 134, 30);
tf1.addActionListener(this);
tf2=new JTextField();
tf2.setBounds(10, 85, 195, 40);
tf2.setEditable(false);
btn1=new JButton("確定");
btn1.setBounds(10, 135, 92, 25);
btn1.addActionListener(this);
btn2=new JButton("清除");
btn2.setBounds(112, 135, 92, 25);
btn2.addActionListener(this);
fm=new JFrame("土地面積計算");
fm.setBounds(100, 100, 220, 200);
fm.setVisible(true);
fm.setResizable(false);
fm.setLayout(null);
fm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fm.add(lb1);
fm.add(lb2);
fm.add(tf1);
fm.add(tf2);
fm.add(btn1);
fm.add(btn2);
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==tf1 || e.getSource()==btn1)
{
double area=Double.parseDouble(tf1.getText())*3.3058;
String areaStr=String.valueOf(area);
//String areaStr=Double.toString(area);
tf2.setText("面積為: "+areaStr+" 平方公尺");
}
if(e.getSource()==btn2)
{
tf1.setText("");
tf2.setText("");
}
}
public static void main(String[] args) {
Ch82 app=new Ch82();
}
}
複製代碼
歡迎光臨 種子論壇 | 高雄市資訊培育協會學員討論區 (http://istak.org.tw/seed/)
Powered by Discuz! 7.2