Java Swing中處理各組件事 件的一般步驟.doc_第1頁
Java Swing中處理各組件事 件的一般步驟.doc_第2頁
Java Swing中處理各組件事 件的一般步驟.doc_第3頁
Java Swing中處理各組件事 件的一般步驟.doc_第4頁
Java Swing中處理各組件事 件的一般步驟.doc_第5頁
已閱讀5頁,還剩2頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

Java Swing中處理各組件事件的一般步驟是:1新建一個組件(如JButton)。2將該組件添加到相應的面板(如JPanel)。3注冊監聽器以監聽事件源產生的事件(如通過ActionListener來響應用戶點擊按鈕)。4定義處理事件的方法(如在ActionListener中的actionPerformed中定義相應方法)。以上步驟我們可以用多種方法實現。但人們通常用二種方法。第一種方法是只利用一個監聽器以及多個if語句來決定是哪個組件產生的事件;第二種方法是使用多個內部類來響應不同組件產生的各種事件,其具體實現又分兩種方式,一種是匿名內部類,一種是一般內部類。為了說明如何使用上述三種方法實現事件的處理方法,我們建立一個簡單的應用程序。該程序界面有兩個按鈕,當用戶點擊相應的按鈕,就會彈出一個對話框顯示相應的內容。通過這個簡單程序,你可以實現自己更多、更復雜的用戶界面程序。首先,我們利用單個監聽器來實現該程序。我們定義一個名為Simple1的類來包括所有代碼。所有的用戶行為(如點擊按鈕)由一個監聽器SimpleListenner中的actionPerformed方法來處理。以下是代碼:import java.awt.*;import java.awt.event.*;import javax.swing.*;public class Simple1private static JFrame frame;/ 定義為靜態變量以便main使用private static JPanel myPanel; / 該面板用來放置按鈕組件private JButton button1;/ 這里定義按鈕組件private JButton button2;/ 以便讓ActionListener使用public Simple1()/ 構造器, 建立圖形界面/ 新建面板myPanel = new JPanel();/ 新建按鈕button1 = new JButton(按鈕1);/ 新建按鈕1button2 = new JButton(按鈕2);SimpleListener ourListener = new SimpleListener();/ 建立一個actionlistener讓兩個按鈕共享button1.addActionListener(ourListener);button2.addActionListener(ourListener);myPanel.add(button1); / 添加按鈕到面板myPanel.add(button2);private class SimpleListener implements ActionListenerpublic void actionPerformed(ActionEvent e)/ 利用getActionCommand獲得按鈕名稱/ 也可以利用getSource()來實現/ if (e.getSource() =button1)String buttonName = e.getActionCommand();if (buttonName.equals(按鈕1)JOptionPane.showMessageDialog(frame,按鈕1 被點擊);else if (buttonName.equals(按鈕2)JOptionPane.showMessageDialog(frame,按鈕2 被點擊);elseJOptionPane.showMessageDialog(frame,Unknown event );public static void main(String s)Simple1 gui = new Simple1(); / 新建Simple1組件frame = new JFrame(Simple1);/ 新建JFrame/ 處理關閉事件的通常方法frame.addWindowListener(new WindowAdapter() public void windowClosing(WindowEvent e)System.exit(0); );frame.getContentPane().add(myPanel);frame.pack();frame.setVisible(true);讓我們來看看以上代碼是如何工作的。在main方法中,我們定義了一個JFrame,然后將面板Jpanel添加到窗體中,該面板包括兩個按鈕。相應的變量Frame,button1,button2定義在程序的開頭部分。在程序入口main方法中,首先新建Simple1組件,通過構造器建立用戶GUI,定義一個面板Jpanle,,增加兩個按鈕,然后利用 JButton.addActionListerner將兩個按鈕加入到一個活動監聽器SimpleLister中,最后,兩個按鈕添加到面板。當GUI 建立后,我們將面板添加到窗體并顯示結果。當用戶點擊按鈕時,程序調用actionPerformed方法,通過if語句來判斷是哪一個按鈕被點擊,然后 在對話框中顯示相應的內容。利用一個監聽器來處理事件的缺點是,當程序比較復雜時,需要一大串的if 語句來實現,程序代碼較難閱讀與維護。當然,如果處理的事件較少,這種方式比較簡單。通過使用匿名內部類可以解決上述存在的問題。使用簡單的匿名內部類作為addActionListener的變量即可。以下是實現代碼:import java.awt.*;import java.awt.event.*;import javax.swing.*;public class Simple2private static JFrame frame;/ 定義為靜態變量以便main使用private static JPanel myPanel; / 該面板用來放置按鈕組件private JButton button1;/ 這里定義按鈕組件private JButton button2;/ 以便讓ActionListener使用public Simple2()/ 構造器, 建立圖形界面/ 新建面板myPanel = new JPanel();/ 新建按鈕button1 = new JButton(按鈕1);/ 新建按鈕1button2 = new JButton(按鈕2);/ 每一個事件源需要一個監聽器/ 定義一個匿名內部類來監聽事件源產生的事件button1.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e)JOptionPane.showMessageDialog(frame,按鈕1 被點擊););button2.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e)JOptionPane.showMessageDialog(frame,按鈕2 被點擊););myPanel.add(button1);/ 添加按鈕到面板myPanel.add(button2);public static void main(String s)Simple2 gui = new Simple2(); / 新建Simple2組件frame = new JFrame(Simple2);/ 新建JFrame/ 處理關閉事件的通常方法frame.addWindowListener(new WindowAdapter() public void windowClosing(WindowEvent e)System.exit(0); );frame.getContentPane().add(myPanel);frame.pack();frame.setVisible(true);使用匿名內部類同樣存在許多另外的問題。首先,根據組件在代碼中被定義的不同位置,類的定義以及處理事件的代碼將分散在程序的各個部分,不是集中 在一塊,同樣不便于閱讀與維護。各事件的處理全部由嵌套的程序塊組成,視覺上很難定位程序代碼。如果事件處理程序比較復雜,內部類中的代碼將變得很長,你 將找不到相應的組件定義位置。最后,當工具欄、菜單欄目等需要處理同樣的用戶行為時,該方法將使代碼更難維護。我們使用一般的命名內部類可以解決以上許多問題。所有的事件處理方法都集中在一塊,并且都具有有意義的名稱,程序非常容易閱讀與維護。單個的事件處理程序也可以被工具欄、菜單欄等重復使用,以下是實現代碼:import java.awt.*;import java.awt.event.*;import javax.swing.*;public class Simple3private static JFrame frame;/ 定義為靜態變量以便main使用private static JPanel myPanel; / 該面板用來放置按鈕組件private JButton button1;/ 這里定義按鈕組件private JButton button2;/ 以便讓ActionListener使用/ 利用一般內部類來監聽每一個事件源產生的事件如(button1, button2)private class Button1Handler implements ActionListenerpublic void actionPerformed(ActionEvent e)JOptionPane.showMessageDialog(frame,按鈕1 被點擊);private class Button2Handler implements ActionListenerpublic void actionPerformed(ActionEvent e)JOptionPane.showMessageDialog(frame,按鈕2 被點擊);public Simple3()/ 構造器, 建立圖形界面/ 新建面板myPanel = new JPanel();/ 新建按鈕button1 = new JButton(按鈕1);/ 新建按鈕1button2 = new JButton(按鈕2);/ 對每一個組件注冊監聽內部類button1.addActionListener(new Button1Handler();button2.addActionListener(new Button2Handler();myPanel.add(button1);/ 添加按鈕到面板myPanel.add(button2);public static void main(String s)Simple3 gui = new Simple3();/ 新建Simple3組件frame = new JFrame(Simple3);/ 新建JFrame/ 處理關閉事件的通常方法frame.addWindowListener(new WindowAdapter() public void windowClosing(WindowEvent e)System.exit(0); );frame.getContentPane().add(myPanel);frame.pack();frame.setVisible(true);任何時候,按下鍵盤或鼠標的鍵就產生了事件。組件接受和處理事件的方式自JDK1.1以來都保持不變。Swing組件能夠產生許多不同類別的事件,包括那些在Java.awt.event包以及在javax.swing.event包中的事件。Swing新引入的那些事件類別往往是與特定Swing組件相關的。每一個事件類別都是一個對象,它至少指明了事件的發生源,往往還帶有其它消息,如該事件的類別、在事件發生前和發生后事件源狀態的變化,等等。事件源大部分是普通的組件或模型(models, 即MVC中的M,在以后的blog中可能會介紹Swing組件的MVC結構)。其它的對象也可能產生事件。要想收到事件產生的通知,我們需要在目標對象上注冊事件監聽器。事件監聽器是任意XXListener類或接口的具體實現(XX代指事件的類型)。XXListener是定義在java.awt.event、java.beans和javax.swing.event包中的類或接口。在每個接口中至少定義了一個方法(method),該方法以對應的XXEvent作為參數。支持發送XXEvent事件發生通知的類都須實現XXListener接口,同時提供相應的addXXListener()和removeXXListener()方法來注冊和移除這些事件監聽器,大部分的事件目標對象(target)都允許注冊任意多個事件監聽器。通常支持 XXEvent的類都提供受保護的方法(protected method)fireXX()來構造事件對象及將它送至事件處理器(event handler)進行處理。javax.swing.event.EventListenerList類EventListenerList是一個包含XXEvent/XXListener對(pairs)的陣列(數組)。JComponent及其派生類使用一個EventListenerList對象來維護其事件監聽器。所有默認的模型(models)同樣維護事件監聽器和一個EventListenerList。當一個監聽器被注冊到一個Swing組件或模型(model)時,對應的事件的Class實例(用來標識事件類別)被添加至EventListenerList陣列,后面緊隨該監聽器本身(即一個XXEvent/XXListener對)。因為這些對是儲存在陣列而不是在可變的集合(mutable collection)中(出于對效率的考慮),每一次添加和移除都會調用System.arrayCopy()來生成一個新的陣列。當收到事件時,陣列被遍歷,事件就會被送至擁有其類型的每一個事件監聽器。由于陣列是按XXEvent, XXListener, YYEvent, YYListener, . 的方式排列的,某個事件類別

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論