Java深入學(xué)習(xí)圖形用戶界面GUI之事件處理
Swing組件中的事件處理專門用于響應(yīng)用戶的操作,例如,響應(yīng)用戶的鼠標(biāo)單擊、按下鍵盤等操作。在Swing事件處理的過程中,主要涉及三類對(duì)象:
1、事件源:事件發(fā)生的場(chǎng)所,通常是產(chǎn)生事件的組件,如窗口、按鈕、菜單等。
2、事件對(duì)象:封裝了GUI組件上發(fā)生的特定事件(通常就是用戶的一次操作)。
3、監(jiān)聽器:負(fù)責(zé)監(jiān)聽事件源上發(fā)生的事件,并對(duì)各種事件做出相應(yīng)處理(監(jiān)聽器對(duì)象中包含事件處理器)。
實(shí)現(xiàn)Swing事件處理的主要步驟如下:
1、創(chuàng)建事件源:除了一些常見的按鈕、鍵盤等組件可以作為事件源外,還可以使用JFrame窗口在內(nèi)的頂級(jí)容器作為事件源。
2、自定義事件監(jiān)聽器:根據(jù)要監(jiān)聽的事件源創(chuàng)建指定類型的監(jiān)聽器進(jìn)行事件處理。監(jiān)聽器是一個(gè)特殊的java類,必須實(shí)現(xiàn)XxxListener接口。根據(jù)組件觸發(fā)的動(dòng)作進(jìn)行區(qū)分,例如,WindowListener用于監(jiān)聽窗口事件,ActionListener用于監(jiān)聽動(dòng)作事件。
3、為事件源注冊(cè)監(jiān)聽器:使用addXxxListener()方法為指定事件源添加特定類型的監(jiān)聽器。當(dāng)事件源上發(fā)生監(jiān)聽事件后,就會(huì)觸發(fā)綁定的事件監(jiān)聽器,由監(jiān)聽器中的方法對(duì)事件進(jìn)行相應(yīng)處理。
Swing常用事件處理有:窗體事件、鼠標(biāo)事件、鍵盤事件、動(dòng)作事件等。本文主要針對(duì)鼠標(biāo)事件實(shí)現(xiàn)一個(gè)登錄、退出的窗體操作。
鼠標(biāo)事件:
在圖形用戶界面中,用戶會(huì)經(jīng)常使用鼠標(biāo)進(jìn)行選擇、切換界面等操作,這些操作被定義為鼠標(biāo)事件,包括鼠標(biāo)按下、鼠標(biāo)松開、鼠標(biāo)單擊等。java提供了一個(gè)MouseEvent類描述鼠標(biāo)事件。處理鼠標(biāo)事件時(shí),首先需要通過實(shí)現(xiàn)MouseListener接口定義監(jiān)聽器(也可以通過繼承適配器MouseAdapter類定義監(jiān)聽器),然后調(diào)用addMouseListener()方法將監(jiān)聽器綁定到事件源對(duì)象。
鼠標(biāo)事件案例一:通過實(shí)現(xiàn)MouseListener接口定義監(jiān)聽器來實(shí)現(xiàn)登錄、退出操作
import javax.swing.*; import java.awt.*; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; public class GUI_3事件處理 { public static void main(String[] args) { guitext1 gt=new guitext1(); } } //創(chuàng)建一個(gè)鼠標(biāo)監(jiān)聽類實(shí)現(xiàn)監(jiān)聽接口 class guitext1 implements MouseListener { JFrame jf; JPanel jp; JLabel l1,l2; JTextField f1,f2; JButton jb1,jb2; public guitext1() { jf = new JFrame("登錄窗口"); jf.setBounds(300, 200, 350, 300); jp = new JPanel(); Font font = new Font("仿宋", Font.BOLD, 20); l1 = new JLabel("用戶名:"); l1.setFont(font); f1 = new JTextField("請(qǐng)輸入用戶名!",20); f1.setFont(font); l2 = new JLabel("密 碼:"); l2.setFont(font); f2 = new JTextField("請(qǐng)輸入密碼!",20); f2.setFont(font); jb1 = new JButton("登錄"); jb1.setFont(font); jb1.addMouseListener(this);//登錄按鈕注冊(cè)監(jiān)聽器 jb2 = new JButton("退出"); jb2.setFont(font); jb2.addMouseListener(this);//退出按鈕注冊(cè)監(jiān)聽器 jp.add(l1); jp.add(f1); jp.add(l2); jp.add(f2); jp.add(jb1); jp.add(jb2); jf.add(jp); jf.setVisible(true); } //這些方法可以不寫,但是必須要?jiǎng)?chuàng)建 @Override public void mousePressed(MouseEvent e) { } @Override public void mouseReleased(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } //鼠標(biāo)點(diǎn)擊事件 //mouseClicked==>在組件上單擊(按下并釋放)鼠標(biāo)按鈕時(shí)調(diào)用。 @Override public void mouseClicked(MouseEvent e) { //getSource()==>得到事件源 if(e.getSource().equals(jb1)) { if(f1.getText().equals("小明")&&f2.getText().equals("123456")) { //showMessageDialog==>提供一個(gè)名為“消息”的信息消息對(duì)話框。 JOptionPane.showMessageDialog(null, "登錄成功!"); }else{ JOptionPane.showMessageDialog(null, "登錄失敗,請(qǐng)重新輸入!"); //將文本清空 f1.setText(null); f2.setText(null); } }//getSource()==>得到事件源 if(e.getSource().equals(jb2)) { JOptionPane.showMessageDialog(null, "退出成功!"); //關(guān)閉當(dāng)前窗口 //jf.dispose(); //系統(tǒng)退出 System.exit(0); } } }
案例二:通過繼承適配器MouseAdapter類定義監(jiān)聽器來實(shí)現(xiàn)登錄、退出操作
import javax.swing.*; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; public class GUI_3事件處理2 { public static void main(String[] args) { guitext2 gt=new guitext2(); } } class guitext2{ JFrame jf; JPanel jp; JLabel l1,l2; JTextField f1,f2; JButton jb1,jb2; public guitext2() { jf = new JFrame("登錄窗口"); jf.setBounds(300, 200, 350, 300); jp = new JPanel(); Font font = new Font("仿宋", Font.BOLD, 20); l1 = new JLabel("用戶名:"); l1.setFont(font); //輸入用戶名,JTextField==>允許編輯單行文本,顯示原始字符 f1 = new JTextField(null,20); f1.setFont(font); l2 = new JLabel("密 碼:"); l2.setFont(font); //f2 = new JTextField("請(qǐng)輸入密碼!",20); //JPasswordField是一個(gè)輕量級(jí)組件,允許編輯單行文本,其中視圖指示輸入的內(nèi)容,但不顯示原始字符。 f2=new JPasswordField(null,20); f2.setFont(font); jb1 = new JButton("登錄"); jb1.setFont(font); //為按鈕添加(注冊(cè))自定義鼠標(biāo)監(jiān)聽事件監(jiān)聽器,并將f1,f2傳入 guitext2_1 gt=new guitext2_1(f1,f2); jb1.addMouseListener(gt); jb2 = new JButton("退出"); jb2.setFont(font); jb2.addMouseListener(gt); // jb2.addMouseListener(new guitext2_1());//另一種寫法 jp.add(l1); jp.add(f1); jp.add(l2); jp.add(f2); jp.add(jb1); jp.add(jb2); jf.add(jp); jf.setVisible(true); } } //自定義一個(gè)鼠標(biāo)監(jiān)聽類 //MouseAdapter==>用于接收鼠標(biāo)事件的抽象適配器類 class guitext2_1 extends MouseAdapter { //將f1,f2傳入 JTextField f1,f2; public guitext2_1(JTextField f1, JTextField f2) { this.f1 = f1; this.f2 = f2; } //mouseClicked==>在組件上單擊(按下并釋放)鼠標(biāo)按鈕時(shí)調(diào)用。 public void mouseClicked(MouseEvent e) { //getSource()==>得到事件源 JButton jButton=(JButton)e.getSource(); if(jButton.getText().equals("登錄")){ if(f1.getText().equals("小明")&&f2.getText().equals("123456")) { JOptionPane.showMessageDialog(null, "登錄成功!"); }else{ //showMessageDialog==>提供一個(gè)名為“消息”的信息消息對(duì)話框。 JOptionPane.showMessageDialog(null, "登錄失?。?); //將文本清空 f1.setText(null); f2.setText(null); } } if(jButton.getText().equals("退出")){ JOptionPane.showMessageDialog(null, "退出成功!"); //系統(tǒng)退出 System.exit(0); } } }
案例三:內(nèi)部類
import javax.swing.*; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; public class GUI_3事件處理2 { public static void main(String[] args) { guitext2 gt=new guitext2(); } } class guitext2{ JFrame jf; JPanel jp; JLabel l1,l2; JTextField f1,f2; JButton jb1,jb2; public guitext2() { jf = new JFrame("登錄窗口"); jf.setBounds(300, 200, 350, 300); jp = new JPanel(); Font font = new Font("仿宋", Font.BOLD, 20); l1 = new JLabel("用戶名:"); l1.setFont(font); //輸入用戶名,JTextField==>允許編輯單行文本,顯示原始字符 f1 = new JTextField(null,20); f1.setFont(font); l2 = new JLabel("密 碼:"); l2.setFont(font); //f2 = new JTextField("請(qǐng)輸入密碼!",20); //JPasswordField是一個(gè)輕量級(jí)組件,允許編輯單行文本,其中視圖指示輸入的內(nèi)容,但不顯示原始字符。 f2=new JPasswordField(null,20); f2.setFont(font); jb1 = new JButton("登錄"); jb1.setFont(font); //為按鈕添加(注冊(cè))自定義鼠標(biāo)監(jiān)聽事件監(jiān)聽器 guitext2_1 gt=new guitext2_1(); jb1.addMouseListener(gt); jb2 = new JButton("退出"); jb2.setFont(font); jb2.addMouseListener(gt); jb2.addMouseListener(new guitext2_1());//另一種寫法 jp.add(l1); jp.add(f1); jp.add(l2); jp.add(f2); jp.add(jb1); jp.add(jb2); jf.add(jp); jf.setVisible(true); } //內(nèi)部類 //MouseAdapter==>用于接收鼠標(biāo)事件的抽象適配器類 class guitext2_1 extends MouseAdapter { //mouseClicked==>在組件上單擊(按下并釋放)鼠標(biāo)按鈕時(shí)調(diào)用。 public void mouseClicked(MouseEvent e) { //getSource()==>得到事件源 JButton jButton=(JButton)e.getSource(); if(jButton.getText().equals("登錄")){ if(f1.getText().equals("小明")&&f2.getText().equals("123456")) { JOptionPane.showMessageDialog(null, "登錄成功!"); }else{ //showMessageDialog==>提供一個(gè)名為“消息”的信息消息對(duì)話框。 JOptionPane.showMessageDialog(null, "登錄失?。?); //將文本清空 f1.setText(null); f2.setText(null); } } if(jButton.getText().equals("退出")){ JOptionPane.showMessageDialog(null, "退出成功!"); //系統(tǒng)退出 System.exit(0); } } } }
案例四:匿名內(nèi)部類
import javax.swing.*; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; public class GUI_3事件處理3 { public static void main(String[] args) { guitext3 gt=new guitext3(); } } class guitext3{ JFrame jf; JPanel jp; JLabel l1,l2; JTextField f1,f2; JButton jb1,jb2; public guitext3() { jf = new JFrame("登錄窗口"); jf.setBounds(300, 200, 350, 300); jp = new JPanel(); Font font = new Font("仿宋", Font.BOLD, 20); l1 = new JLabel("用戶名:"); l1.setFont(font); //輸入用戶名,JTextField==>允許編輯單行文本,顯示原始字符 f1 = new JTextField(null,20); f1.setFont(font); l2 = new JLabel("密 碼:"); l2.setFont(font); //f2 = new JTextField("請(qǐng)輸入密碼!",20); //JPasswordField是一個(gè)輕量級(jí)組件,允許編輯單行文本,其中視圖指示輸入的內(nèi)容,但不顯示原始字符。 f2=new JPasswordField(null,20); f2.setFont(font); jb1 = new JButton("登錄"); //匿名內(nèi)部類 jb1.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { if(f1.getText().equals("小明")&&f2.getText().equals("123456")) { JOptionPane.showMessageDialog(null, "登錄成功!"); }else{ //showMessageDialog==>提供一個(gè)名為“消息”的信息消息對(duì)話框。 JOptionPane.showMessageDialog(null, "登錄失??!"); //將文本清空 f1.setText(null); f2.setText(null); } } }); jb1.setFont(font); jb2 = new JButton("退出"); //匿名內(nèi)部類 jb2.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { JOptionPane.showMessageDialog(null, "退出成功!"); //系統(tǒng)退出 System.exit(0); } }); jb2.setFont(font); jp.add(l1); jp.add(f1); jp.add(l2); jp.add(f2); jp.add(jb1); jp.add(jb2); jf.add(jp); jf.setVisible(true); } }
其實(shí)這些是由復(fù)雜的代碼逐漸簡(jiǎn)化的過程。
我突然發(fā)現(xiàn)其中的JPanel還沒有給大家解讀過,所以在這里插入一下這個(gè)小知識(shí):
JPanel面板組件是一個(gè)無邊框且不能被移動(dòng)、放大、縮小或者關(guān)閉的面板,它的默認(rèn)布局管理器是FlowLayout。也可以使用JPanel帶參數(shù)的構(gòu)造函數(shù)JPanel(LayoutManager layout)或者setLayout()成員方法設(shè)置JPanel布局管理器。JPanel也被稱為中間容器。
到此這篇關(guān)于Java深入學(xué)習(xí)圖形用戶界面GUI之事件處理的文章就介紹到這了,更多相關(guān)Java事件處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
dubbo如何實(shí)現(xiàn)consumer從多個(gè)group中調(diào)用指定group的provider
這篇文章主要介紹了dubbo如何實(shí)現(xiàn)consumer從多個(gè)group中調(diào)用指定group的provider問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03SpringCloud-Hystrix-Dashboard客戶端服務(wù)監(jiān)控的實(shí)現(xiàn)方法
這篇文章主要介紹了SpringCloud-Hystrix-Dashboard客戶端服務(wù)監(jiān)控的實(shí)現(xiàn)方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03Java 9中如何對(duì)IntegerCache進(jìn)行修改詳解
這篇文章主要給大家介紹了關(guān)于Java 9中如何對(duì)IntegerCache進(jìn)行修改的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或使用java9具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起看看吧。2017-12-12Java實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)IO版本
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)IO版本,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04Java實(shí)現(xiàn)二叉樹的深度優(yōu)先遍歷和廣度優(yōu)先遍歷算法示例
這篇文章主要介紹了Java實(shí)現(xiàn)二叉樹的深度優(yōu)先遍歷和廣度優(yōu)先遍歷算法,結(jié)合實(shí)例形式詳細(xì)分析了二叉樹的定義、深度優(yōu)先遍歷與廣度優(yōu)先遍歷算法原理與相關(guān)操作實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-04-04Java+OpenCV實(shí)現(xiàn)人臉檢測(cè)并自動(dòng)拍照
這篇文章主要為大家詳細(xì)介紹了Java+OpenCV實(shí)現(xiàn)人臉檢測(cè),并調(diào)用筆記本攝像頭實(shí)時(shí)抓拍,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07Springmvc數(shù)據(jù)格式化原理及代碼案例
這篇文章主要介紹了Springmvc數(shù)據(jù)格式化原理及代碼案例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10