您好,登錄后才能下訂單哦!
java中的事件是什么?怎么用?針對(duì)這些問(wèn)題,今天小編總結(jié)了這篇文章,希望能幫助更多想解決這些問(wèn)題的朋友找到更加簡(jiǎn)單易行的辦法。
學(xué)習(xí)java事件之前,對(duì)java內(nèi)部類、java常用組件、容器、布局管理器、java抽象窗口工具包這些東西有一定的了解,結(jié)合下面的知識(shí)點(diǎn),可以做一些簡(jiǎn)單的窗口程序。
Java語(yǔ)言對(duì)事件的處理采用的是授權(quán)事件模型。在這個(gè)模型下,每個(gè)組件都有相應(yīng)的事件,如按鈕有單擊事件,文本域具有內(nèi)容改變事件等。
當(dāng)某個(gè)事件被觸發(fā)后,組件就會(huì)將事件發(fā)送給組件注冊(cè)的每一個(gè)事件監(jiān)聽器,事件監(jiān)聽器中定義了與不同事件相對(duì)應(yīng)的事件的處理,此時(shí)事件監(jiān)聽器會(huì)根據(jù)不同的事件信息調(diào)用不同的事件處理者,完成對(duì)這次事件的處理,只有事件監(jiān)聽器被觸發(fā)后才會(huì)收到事件信息。
此種模型的顯著特點(diǎn)是,當(dāng)組件被觸發(fā)后,本身不去處理,而將處理的 操作交給第三方完成。例如,在GUI單擊了一個(gè)按鈕,此時(shí)該按鈕就是一個(gè)事件源對(duì)象,按鈕本身沒有權(quán)利對(duì)這次單擊做出反應(yīng),它做的就是將信息發(fā)送給本身注冊(cè)的監(jiān)聽器(事件的處理者,實(shí)質(zhì)上也是個(gè)類)來(lái)處理。
理解java的事件處理要要理解下面三個(gè)重要的概要。
(1)、事件Event——用戶操作而產(chǎn)生的事件
(2)、事件源Event source——產(chǎn)生事件的組件
(3)、事件處理方法Event handle——處理事件的方法
1、事件處理基本原理
擋在一個(gè)按鈕上觸發(fā)一個(gè)事件時(shí),虛擬機(jī)產(chǎn)生一個(gè)點(diǎn)擊事件對(duì)象,然后在按鈕即事件源上查找注冊(cè)的相關(guān)處理方法,并將事件對(duì)象傳給此方法,此方法獲得執(zhí)行。
示例程序:
在下面的程序中JButton jb就是事件源,ClickAction就是事件處理程序,jb.addActionListener(a);將事件源和事件處理程序關(guān)聯(lián)起來(lái),當(dāng)事件源上發(fā)生點(diǎn)擊事件的時(shí)候,執(zhí)行ClickAction里面定義的代碼。
源代碼如下:
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; public class EventTest { public static void main(String[] args) { JFrame j = new JFrame("示例程序1"); //1、事件源jb按鈕就是事件源,因?yàn)橐c(diǎn)擊它 JButton jb = new JButton("click"); //2、事件處理程序ClickAction表示事件處理程序 ClickAction a = new ClickAction(); //3、關(guān)聯(lián),將事件源和事件處理程序a關(guān)聯(lián)起來(lái),意思是發(fā)生點(diǎn)擊執(zhí)行a jb.addActionListener(a); //將jb源事件添加到窗口中。 j.getContentPane().add(jb); j.pack(); j.setVisible(true); } } //事件處理程序,點(diǎn)擊就是一個(gè)Action事件 class ClickAction implements ActionListener{ @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub System.out.println("hello"); } }
2、事件對(duì)象
在上面你的例子中,ActionEvent就是一個(gè)事件對(duì)象,在JButton被按下的時(shí)候,由JButton生成此事件。事件被傳遞給通過(guò)注冊(cè)監(jiān)聽器的方式注冊(cè)的ActionListener對(duì)象,通過(guò)它可以得到事件發(fā)生的時(shí)間,事件發(fā)生時(shí)的事件源等最常見的信息。
ActionEvent常見方法如下:
(1)String getActionCommand():返回與此類動(dòng)作相關(guān)的命令字符串,默認(rèn)組件為title。
(2)int getModifiers():返回發(fā)生此動(dòng)作時(shí)同時(shí)按下的鍵盤按鈕
(3)long getWhen():返回發(fā)生此事件時(shí)的事件的long形式。
示例程序:
源代碼如下:
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Date; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; public class EventTest2 { public static void main(String[] args) { JFrame j = new JFrame("示例程序2"); JPanel jp = new JPanel(); JLabel j1 = new JLabel("請(qǐng)點(diǎn)擊"); JButton jb = new JButton("click"); JButton jb1 = new JButton("click"); ClickAction2 a = new ClickAction2(); jb1.addActionListener(a);//如果jb1上發(fā)生了Action事件就執(zhí)行a里面的代碼 jb.addActionListener(a); jp.add(j1); jp.add(jb); jp.add(jb1); j.add(jp); j.setSize(400, 200); j.setVisible(true); } } class ClickAction2 implements ActionListener{ //事件發(fā)生時(shí),actionPerformed方法會(huì)被虛擬機(jī)調(diào)用,事件對(duì)象回傳給該方法 @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub long d = e.getWhen();//事件發(fā)生的事件 Date date = new Date(d);//轉(zhuǎn)化為相應(yīng)的時(shí)間 System.out.println(date); JButton sou = (JButton)e.getSource();//發(fā)生的事件源 sou.setText("點(diǎn)不著");//將點(diǎn)擊發(fā)生的按鈕的按鈕設(shè)為點(diǎn)不著 //如果沒有設(shè)置過(guò)ActionCommand,默認(rèn)得到的是按鈕的標(biāo)題 String com = e.getActionCommand(); System.out.println("command is: " +com); } }
3、事件類型
圖形界面開發(fā)中由很多的事件,這些事件以EventObject為頂層和類,按事件的類型構(gòu)成了一個(gè)樹形結(jié)構(gòu)。
具體見下圖:
EventObject是所有事件類的父類,它里面包含兩個(gè)方法:
(1)、Object getSource():最初發(fā)生Event的對(duì)象
(2)、String toString():返回此EventObject的String表示形式。
通過(guò)getSource():能夠知道事件是在那個(gè)對(duì)象上發(fā)生的。
關(guān)于其他事件類的含義,在下面會(huì)給出幾個(gè)類的源碼解釋和簡(jiǎn)單演練。
MouseEvent類
當(dāng)在一個(gè)組件上按下,釋放,點(diǎn)擊,移動(dòng)或者拖動(dòng)時(shí),就會(huì)觸發(fā)鼠標(biāo)事件。
import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.JFrame; public class MouseListenerTest { public static void main(String[] args) { JFrame j = new JFrame("我的窗口"); MouL w = new MouL(); j.addMouseListener(w); j.setSize(100, 100); j.setVisible(true); j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } class MouL implements MouseListener{ @Override public void mouseClicked(MouseEvent e) { // TODO Auto-generated method stub System.out.println("鼠標(biāo)的位置: " + e.getX() + "," + e.getY()); System.out.println("點(diǎn)擊發(fā)生了"); } @Override public void mousePressed(MouseEvent e) { // TODO Auto-generated method stub System.out.println("按下"); } @Override public void mouseReleased(MouseEvent e) { // TODO Auto-generated method stub System.out.println("松開"); } @Override public void mouseEntered(MouseEvent e) { // TODO Auto-generated method stub System.out.println("鼠標(biāo)進(jìn)入了窗口"); } @Override public void mouseExited(MouseEvent e) { // TODO Auto-generated method stub System.out.println("鼠標(biāo)離開了窗口"); } }
WindowEvent類
窗口事件,窗口打開,關(guān)閉,最大化,最小化時(shí),都會(huì)觸發(fā)窗口事件
import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import javax.swing.JFrame; public class WindowsListenerTest { public static void main(String[] args) { JFrame j = new JFrame("我的窗口"); WindowL w = new WindowL(); j.addWindowListener(w); j.setSize(100, 100); j.setVisible(true); j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } class WindowL implements WindowListener{ @Override public void windowOpened(WindowEvent e) { // TODO Auto-generated method stub System.out.println("窗口打開時(shí)我執(zhí)行windowOpened"); } @Override public void windowClosing(WindowEvent e) { // TODO Auto-generated method stub System.out.println("windowClosing"); } @Override public void windowClosed(WindowEvent e) { // TODO Auto-generated method stub System.out.println("窗口關(guān)閉時(shí)我執(zhí)行windowClosed"); } @Override public void windowIconified(WindowEvent e) { // TODO Auto-generated method stub System.out.println("窗口最小化時(shí)我執(zhí)行windowIconified"); } @Override public void windowDeiconified(WindowEvent e) { // TODO Auto-generated method stub System.out.println("窗口回復(fù)時(shí)我執(zhí)行windowDeiconified"); } @Override public void windowActivated(WindowEvent e) { // TODO Auto-generated method stub System.out.println("窗口變成活動(dòng)狀態(tài)時(shí)我執(zhí)行mouseClicked"); } @Override public void windowDeactivated(WindowEvent e) { // TODO Auto-generated method stub System.out.println("窗口變成不活動(dòng)狀態(tài)時(shí)我執(zhí)行windowDeactivated"); } }
ContainerEvent類
當(dāng)一個(gè)組件被加到容器中時(shí)或者從一個(gè)容器中刪除一個(gè)組件時(shí),會(huì)觸發(fā)事件。
import java.awt.event.ContainerListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; public class ContainerEvent { public static void main(String[] args) { JFrame j = new JFrame("我的窗口"); ContL w = new ContL(); JPanel jp = new JPanel(); jp.addContainerListener(w); JButton del = new JButton("刪除"); JButton add = new JButton("add"); jp.add(add); jp.add(del);//觸發(fā)組件添加了 jp.remove(del);//觸發(fā)組件刪除了 j.getContentPane().add(jp); j.setSize(100, 100); j.setVisible(true); j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } class ContL implements ContainerListener{ @Override public void componentAdded(java.awt.event.ContainerEvent e) { // TODO Auto-generated method stub System.out.println("組件添加了"); } @Override public void componentRemoved(java.awt.event.ContainerEvent e) { // TODO Auto-generated method stub System.out.println("組件刪除了"); } }
FocusEvent
鼠標(biāo)點(diǎn)擊等操作會(huì)讓一個(gè)組件得到或者失去焦點(diǎn)。當(dāng)一個(gè)組件得到焦點(diǎn)的時(shí)候,或者失去焦點(diǎn)的時(shí)候,就會(huì)觸發(fā)焦點(diǎn)事件
import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; public class FocusTest { public static void main(String[] args) { JFrame j = new JFrame("key test"); JPanel jp = new JPanel(); JButton j1 = new JButton("1"); JButton j2 = new JButton("2"); j1.addFocusListener(new FocusL()); j2.addFocusListener(new FocusL()); jp.add(j1); jp.add(j2); j.add(jp); j.setSize(600, 500); j.setVisible(true); } } class FocusL implements FocusListener{ @Override public void focusGained(FocusEvent e) { //得到FocusEvent發(fā)生時(shí)的對(duì)象,轉(zhuǎn)化為按鈕 // TODO Auto-generated method stub JButton j = (JButton)e.getSource(); //得到按鈕的標(biāo)題 String title = j.getText(); System.out.println("focusGained:按鈕" + title + "獲得焦點(diǎn)"); } @Override public void focusLost(FocusEvent e) { // TODO Auto-generated method stub JButton j = (JButton)e.getSource(); String title = j.getText(); System.out.println("focusLost:按鈕" + title + "失去焦點(diǎn)"); } }
4、多重監(jiān)聽器
一般情況下,事件源可以產(chǎn)生多種不同類型的事件,因而可以注冊(cè)(觸發(fā))多種不同類型的監(jiān)聽器。
一個(gè)事件源組件上可以注冊(cè)多個(gè)監(jiān)聽器,一個(gè)監(jiān)聽器可以被注冊(cè)到多個(gè)不同的事件源上。
import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import javax.swing.JFrame; import javax.swing.JTextField; public class MultiListenerTest { public static void main(String[] args) { JFrame a = new JFrame("事件處理"); JTextField jf = new JTextField(); a.add(jf, "South"); MouseM m = new MouseM(); //同一事件源上注冊(cè)兩個(gè)事件監(jiān)聽程序 //鼠標(biāo)的監(jiān)聽程序如點(diǎn)擊等 a.addMouseListener(m); //鼠標(biāo)移動(dòng)的監(jiān)聽程序 a.addMouseMotionListener(m); a.setSize(200, 200); a.setVisible(true); } } class MouseM implements MouseMotionListener, MouseListener{ @Override public void mouseClicked(MouseEvent e) { // TODO Auto-generated method stub System.out.println("clicked" + "x:" + e.getX() + ",y:" + e.getY()); } @Override public void mousePressed(MouseEvent e) { // TODO Auto-generated method stub System.out.println("mousePressed"); } @Override public void mouseReleased(MouseEvent e) { // TODO Auto-generated method stub System.out.println("mouseRelsased"); } @Override public void mouseEntered(MouseEvent e) { // TODO Auto-generated method stub System.out.println("mouseEntered"); } @Override public void mouseExited(MouseEvent e) { // TODO Auto-generated method stub System.out.println("mouseExited"); } @Override public void mouseDragged(MouseEvent e) { // TODO Auto-generated method stub System.out.println("拖動(dòng):" + e.getPoint()); } @Override public void mouseMoved(MouseEvent e) { // TODO Auto-generated method stub System.out.println("移動(dòng):" + e.getPoint()); } }
5、事件適配器(Event Adapter)
為簡(jiǎn)化編程,JDK針對(duì)大多數(shù)事件監(jiān)聽器接口定義了相應(yīng)的實(shí)現(xiàn)類——事件適配器類,在適配器中,實(shí)現(xiàn)了相應(yīng)監(jiān)聽器接口中的所有的方法,但不做任何事情。
所以定義的監(jiān)聽器類可以繼承事件適配器類,并只重寫所需要的方法。
有如下適配器:
- ComponentAdapter (組件適配器)
- ContainerAdapter (容器適配器)
- FocusAdapter (焦點(diǎn)適配器)
- KeyAdapter (鍵盤適配器)
- MouseAdapter (鼠標(biāo)適配器)
- MouseMotionAdapter (鼠標(biāo)運(yùn)動(dòng)適配器)
- WindowAdapter (窗口適配器)
鼠標(biāo)適配器示例程序:MouseListener中由多個(gè)方法,但在這里只實(shí)現(xiàn)了mouseClicked()
package 圖形界面設(shè)計(jì); import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JFrame; public class AdapterTest { public static void main(String[] args) { JFrame z = new JFrame("事件適配器測(cè)試"); z.setSize(500, 400); MouseLS a = new MouseLS(); //注冊(cè)z上的鼠標(biāo)事件處理程序,發(fā)生點(diǎn)擊等事件執(zhí)行a里的代碼 z.addMouseListener(a); z.setVisible(true); z.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } class MouseLS extends MouseAdapter{ public void mouseClicked(MouseEvent e){ // 打印出鼠標(biāo)點(diǎn)擊時(shí)的x點(diǎn)和y點(diǎn)的坐標(biāo) System.out.println("鼠標(biāo)點(diǎn)擊了:" + e.getX() + "," + e.getY()); } }
關(guān)于java中的事件就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。