Java深入學習圖形用戶界面GUI之事件處理
Swing組件中的事件處理專門用于響應用戶的操作,例如,響應用戶的鼠標單擊、按下鍵盤等操作。在Swing事件處理的過程中,主要涉及三類對象:
1、事件源:事件發(fā)生的場所,通常是產生事件的組件,如窗口、按鈕、菜單等。
2、事件對象:封裝了GUI組件上發(fā)生的特定事件(通常就是用戶的一次操作)。
3、監(jiān)聽器:負責監(jiān)聽事件源上發(fā)生的事件,并對各種事件做出相應處理(監(jiān)聽器對象中包含事件處理器)。
實現Swing事件處理的主要步驟如下:
1、創(chuàng)建事件源:除了一些常見的按鈕、鍵盤等組件可以作為事件源外,還可以使用JFrame窗口在內的頂級容器作為事件源。
2、自定義事件監(jiān)聽器:根據要監(jiān)聽的事件源創(chuàng)建指定類型的監(jiān)聽器進行事件處理。監(jiān)聽器是一個特殊的java類,必須實現XxxListener接口。根據組件觸發(fā)的動作進行區(qū)分,例如,WindowListener用于監(jiān)聽窗口事件,ActionListener用于監(jiān)聽動作事件。
3、為事件源注冊監(jiān)聽器:使用addXxxListener()方法為指定事件源添加特定類型的監(jiān)聽器。當事件源上發(fā)生監(jiān)聽事件后,就會觸發(fā)綁定的事件監(jiān)聽器,由監(jiān)聽器中的方法對事件進行相應處理。
Swing常用事件處理有:窗體事件、鼠標事件、鍵盤事件、動作事件等。本文主要針對鼠標事件實現一個登錄、退出的窗體操作。
鼠標事件:
在圖形用戶界面中,用戶會經常使用鼠標進行選擇、切換界面等操作,這些操作被定義為鼠標事件,包括鼠標按下、鼠標松開、鼠標單擊等。java提供了一個MouseEvent類描述鼠標事件。處理鼠標事件時,首先需要通過實現MouseListener接口定義監(jiān)聽器(也可以通過繼承適配器MouseAdapter類定義監(jiān)聽器),然后調用addMouseListener()方法將監(jiān)聽器綁定到事件源對象。
鼠標事件案例一:通過實現MouseListener接口定義監(jiā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)建一個鼠標監(jiā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("請輸入用戶名!",20);
f1.setFont(font);
l2 = new JLabel("密 碼:");
l2.setFont(font);
f2 = new JTextField("請輸入密碼!",20);
f2.setFont(font);
jb1 = new JButton("登錄");
jb1.setFont(font);
jb1.addMouseListener(this);//登錄按鈕注冊監(jiān)聽器
jb2 = new JButton("退出");
jb2.setFont(font);
jb2.addMouseListener(this);//退出按鈕注冊監(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);
}
//這些方法可以不寫,但是必須要創(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) {
}
//鼠標點擊事件
//mouseClicked==>在組件上單擊(按下并釋放)鼠標按鈕時調用。
@Override
public void mouseClicked(MouseEvent e) {
//getSource()==>得到事件源
if(e.getSource().equals(jb1)) {
if(f1.getText().equals("小明")&&f2.getText().equals("123456")) {
//showMessageDialog==>提供一個名為“消息”的信息消息對話框。
JOptionPane.showMessageDialog(null, "登錄成功!");
}else{
JOptionPane.showMessageDialog(null, "登錄失敗,請重新輸入!");
//將文本清空
f1.setText(null);
f2.setText(null);
}
}//getSource()==>得到事件源
if(e.getSource().equals(jb2)) {
JOptionPane.showMessageDialog(null, "退出成功!");
//關閉當前窗口
//jf.dispose();
//系統(tǒng)退出
System.exit(0);
}
}
}案例二:通過繼承適配器MouseAdapter類定義監(jiā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("請輸入密碼!",20);
//JPasswordField是一個輕量級組件,允許編輯單行文本,其中視圖指示輸入的內容,但不顯示原始字符。
f2=new JPasswordField(null,20);
f2.setFont(font);
jb1 = new JButton("登錄");
jb1.setFont(font);
//為按鈕添加(注冊)自定義鼠標監(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);
}
}
//自定義一個鼠標監(jiān)聽類
//MouseAdapter==>用于接收鼠標事件的抽象適配器類
class guitext2_1 extends MouseAdapter {
//將f1,f2傳入
JTextField f1,f2;
public guitext2_1(JTextField f1, JTextField f2) {
this.f1 = f1;
this.f2 = f2;
}
//mouseClicked==>在組件上單擊(按下并釋放)鼠標按鈕時調用。
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==>提供一個名為“消息”的信息消息對話框。
JOptionPane.showMessageDialog(null, "登錄失??!");
//將文本清空
f1.setText(null);
f2.setText(null);
}
}
if(jButton.getText().equals("退出")){
JOptionPane.showMessageDialog(null, "退出成功!");
//系統(tǒng)退出
System.exit(0);
}
}
}案例三:內部類
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("請輸入密碼!",20);
//JPasswordField是一個輕量級組件,允許編輯單行文本,其中視圖指示輸入的內容,但不顯示原始字符。
f2=new JPasswordField(null,20);
f2.setFont(font);
jb1 = new JButton("登錄");
jb1.setFont(font);
//為按鈕添加(注冊)自定義鼠標監(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);
}
//內部類
//MouseAdapter==>用于接收鼠標事件的抽象適配器類
class guitext2_1 extends MouseAdapter {
//mouseClicked==>在組件上單擊(按下并釋放)鼠標按鈕時調用。
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==>提供一個名為“消息”的信息消息對話框。
JOptionPane.showMessageDialog(null, "登錄失??!");
//將文本清空
f1.setText(null);
f2.setText(null);
}
}
if(jButton.getText().equals("退出")){
JOptionPane.showMessageDialog(null, "退出成功!");
//系統(tǒng)退出
System.exit(0);
}
}
}
}案例四:匿名內部類
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("請輸入密碼!",20);
//JPasswordField是一個輕量級組件,允許編輯單行文本,其中視圖指示輸入的內容,但不顯示原始字符。
f2=new JPasswordField(null,20);
f2.setFont(font);
jb1 = new JButton("登錄");
//匿名內部類
jb1.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if(f1.getText().equals("小明")&&f2.getText().equals("123456")) {
JOptionPane.showMessageDialog(null, "登錄成功!");
}else{
//showMessageDialog==>提供一個名為“消息”的信息消息對話框。
JOptionPane.showMessageDialog(null, "登錄失?。?);
//將文本清空
f1.setText(null);
f2.setText(null);
}
}
});
jb1.setFont(font);
jb2 = new JButton("退出");
//匿名內部類
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);
}
}其實這些是由復雜的代碼逐漸簡化的過程。
我突然發(fā)現其中的JPanel還沒有給大家解讀過,所以在這里插入一下這個小知識:
JPanel面板組件是一個無邊框且不能被移動、放大、縮小或者關閉的面板,它的默認布局管理器是FlowLayout。也可以使用JPanel帶參數的構造函數JPanel(LayoutManager layout)或者setLayout()成員方法設置JPanel布局管理器。JPanel也被稱為中間容器。
到此這篇關于Java深入學習圖形用戶界面GUI之事件處理的文章就介紹到這了,更多相關Java事件處理內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
dubbo如何實現consumer從多個group中調用指定group的provider
這篇文章主要介紹了dubbo如何實現consumer從多個group中調用指定group的provider問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03
SpringCloud-Hystrix-Dashboard客戶端服務監(jiān)控的實現方法
這篇文章主要介紹了SpringCloud-Hystrix-Dashboard客戶端服務監(jiān)控的實現方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03
Java實現二叉樹的深度優(yōu)先遍歷和廣度優(yōu)先遍歷算法示例
這篇文章主要介紹了Java實現二叉樹的深度優(yōu)先遍歷和廣度優(yōu)先遍歷算法,結合實例形式詳細分析了二叉樹的定義、深度優(yōu)先遍歷與廣度優(yōu)先遍歷算法原理與相關操作實現技巧,需要的朋友可以參考下2018-04-04

