JAVA事件處理的三種不同方法
阿新 • • 發佈:2019-02-16
在Java的圖形介面開發中,要讓圖形介面接收到使用者的操作,就要給各個元件新增事件處理機制。在事件處理過程中,涉及到3類物件。第一是Event事件,實現使用者對圖形介面元件的操作,以類的形式出現,比如視窗操作對應類為WindowEvent,鍵盤操作對應類為KeyEvent;第二是事件源,即事件發生的場所,比如一個按鈕、單選框或複選框、文字框等;第三就是事件處理者,接收發生的事件並進行處理,也稱監聽器。 事件處理有3種不同的方法,下面進行詳細的介紹。 1、事件介面卡 Java為一些Listener介面提供了介面卡類,這樣,可以通過繼承介面卡類實現有關方法,而無關方法不用實現,大大減少了程式碼量。如: import java.awt.*; import java.awt.event.*; public class Example1 extends WindowAdapter implements ActionListener { private Frame win; private TextField tf; private TextArea ta; private Button bun; Example1() { win = new Frame("事件介面卡"); tf = new TextField(20); ta = new TextArea(10, 20); ta.setEditable(false); bun = new Button("新增"); bun.addActionListener(this); win.setLayout(new FlowLayout()); win.add(tf); win.add(bun); win.add(ta); win.addWindowListener(this); win.setSize(300, 300); win.setVisible(true); } public void actionPerformed(ActionEvent e) { String s = tf.getText(); if(s != "") { ta.append(s+"\n"); } } public void windowClosing(WindowEvent e) { System.exit(0); } public static void main(String args[]) { Example1 w = new Example1(); } } 在上面的程式中,Example1類繼承了WindowAdapter介面卡類和ActionListener介面,生成的框架中有3個元件:文字框、按鈕和文字域,當用戶按了按鈕後,發生ActionEvent事件,使用者在文字框中輸入的字串將新增到文字域中,實現程式在函式actionPerformed中。win.addWindowListener(this); 將Example1類設為監聽器,當用戶按了框架退出按鈕時,觸發WindowEvent事件,而Example1類繼承了windowClosing介面,退出程式,其它無關介面如windowOpened(開啟時)、windowIconified(圖示化)則不用實現。 2、內部類實現事件處理 import java.awt.*; import java.awt.event.*; public class Example2 implements ActionListener { private Frame win; private TextField tf; private TextArea ta; private Button bun; Example2() { win = new Frame("內部類"); tf = new TextField(20); ta = new TextArea(10, 20); ta.setEditable(false); bun = new Button("新增"); bun.addActionListener(this); win.setLayout(new FlowLayout()); win.add(tf); win.add(bun); win.add(ta); win.addWindowListener(new MyWinClose()); win.setSize(300, 300); win.setVisible(true); } public void actionPerformed(ActionEvent e) { String s = tf.getText(); if(s != "") { ta.append(s+"\n"); } } class MyWinClose extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); } } public static void main(String args[]) { Example2 w = new Example2(); } } win.addWindowListener(new MyWinClose());即把MyWinClose設為監聽器,該類繼承了WindowAdapter介面卡,實現了windowClosing介面。 使用內部類的原因如下: (1)一個內部類的物件可訪問外部類的成員方法和變數,包括私有的成員; (2)非常容易實現; (3)內部類編寫時間驅動程式很方便。 3、匿名類 import java.awt.*; import java.awt.event.*; public class Example3 implements ActionListener { private Frame win; private TextField tf; private TextArea ta; private Button bun; Example3() { win = new Frame("匿名類"); tf = new TextField(20); ta = new TextArea(10, 20); ta.setEditable(false); bun = new Button("新增"); bun.addActionListener(this); win.setLayout(new FlowLayout()); win.add(tf); win.add(bun); win.add(ta); win.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); win.setSize(300, 300); win.setVisible(true); } public void actionPerformed(ActionEvent e) { String s = tf.getText(); if(s != "") { ta.append(s+"\n"); } } public static void main(String args[]) { Example3 w = new Example3(); } } 使用匿名類更加方便,匿名就是連名字也沒有,只是顯式地呼叫一個無參的父類的構造方法。