動作監聽:?
先創建一個圖形化界面,接著創建一個按鈕對象,設置按鈕的大小。
添加一個addActionListener();
addActionListener()
?方法定義在?java.awt.event.ActionListener
?接口相關的上下文中,許多支持用戶交互產生動作事件的組件類(如?JButton
、JMenuItem
?等)都實現了該方法。通過調用這個方法,可以將一個實現了?ActionListener
?接口的對象注冊到組件上,當組件上發生特定動作(通常是點擊操作)時,會觸發相應的動作事件,進而調用監聽器中的處理方法。
import javax.swing.*;public class Test3 {public static void main(String[] args){JFrame jFrame=new JFrame();jFrame.setSize(603,680);jFrame.setTitle("演示");jFrame.setAlwaysOnTop(true);jFrame.setLocationRelativeTo(null);jFrame.setDefaultCloseOperation(3);jFrame.setLayout(null);//創建一個按鈕對象JButton jtb=new JButton();jtb.setBounds(0,0,100,50);//jtb:組件對象,表示你要給哪個組件添加事件//addActionListener:表示我要給組件添加哪個事件監聽jtb.addActionListener(new MyJFrame2());//把按鈕添加到界面當中jFrame.getContentPane().add(jtb);jFrame.setVisible(true);}
}
但是,這個new MyJFrame2()只被用了一次,所以可以使用匿名內部類,在 GUI 編程中,為組件添加事件監聽器時,經常使用匿名內部類來實現事件監聽器接口。在 Java 中,匿名內部類是一種特殊的局部內部類,它沒有顯式的類名。使用匿名內部類可以在需要創建一個實現某個接口或繼承某個類的對象時,無需顯式定義一個新的類,從而使代碼更加簡潔。
jtb.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {System.out.println("別點");}
第二種方式:?
我們先聲明并初始化兩個JButton類,他們兩個要是成員變量,這樣整段代碼都能使用它,接著創建成員構造方法。創建一個窗口,并創造兩個按鈕對象。按鈕對象可以直接調用this(這里的this為了實現下面actionPerformed方法)
Object source = e.getSource()
:獲取觸發動作事件的組件對象。if (source == jtb1)
:判斷觸發事件的組件是否為?jtb1
,如果是,則將?jtb1
?按鈕的大小設置為 200x200 像素。else if (source == jtb2)
:若觸發事件的組件是?jtb2
,則使用?Random
?類生成兩個 0 到 199 之間的隨機整數,作為?jtb2
?按鈕的新寬度和高度。
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;public class Test3 extends JFrame implements ActionListener {JButton jtb1=new JButton("點");JButton jtb2=new JButton("點");public Test3(){this.setSize(603,680);this.setTitle("演示");this.setAlwaysOnTop(true);this.setLocationRelativeTo(null);this.setDefaultCloseOperation(3);this.setLayout(null);//創建一個按鈕對象jtb1.setBounds(0,0,100,50);jtb1.addActionListener(this);jtb2.setBounds(0,0,100,50);jtb2.addActionListener(this);//jtb:組件對象,表示你要給哪個組件添加事件//addActionListener:表示我要給組件添加哪個事件監聽//把按鈕添加到界面當中this.getContentPane().add(jtb1);this.getContentPane().add(jtb2);this.setVisible(true);}@Overridepublic void actionPerformed(ActionEvent e) {Object source = e.getSource();if(source==jtb1){jtb1.setSize(200,200);} else if (source==jtb2) {Random random=new Random();jtb2.setSize(random.nextInt(200),random.nextInt(200));}}
}
鼠標監聽:
一個鼠標點擊一個按鈕之后,可以分為:劃入動作,按下動作,松開動作,劃出動作。
給按鈕綁定鼠標事件:
一個簡單的鼠標監聽機制,當你的鼠標做相應動作的時候,程序會打印相應的動作。
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Random;public class Test3 extends JFrame implements MouseListener {JButton jtb1=new JButton("點");public Test3(){this.setSize(603,680);this.setTitle("演示");this.setAlwaysOnTop(true);this.setLocationRelativeTo(null);this.setDefaultCloseOperation(3);this.setLayout(null);jtb1.setBounds(0,0,100,50);jtb1.addMouseListener(this);//把按鈕添加到界面當中this.getContentPane().add(jtb1);this.setVisible(true);}@Overridepublic void mouseClicked(MouseEvent e) {System.out.println("單擊");}@Overridepublic void mousePressed(MouseEvent e) {System.out.println("按住不松");}@Overridepublic void mouseReleased(MouseEvent e) {System.out.println("送開");}@Overridepublic void mouseEntered(MouseEvent e) {System.out.println("劃入");}@Overridepublic void mouseExited(MouseEvent e) {System.out.println("劃出");}
}
鍵盤監聽機制:
跟前面兩個監聽方法類似
@Overridepublic void keyTyped(KeyEvent e) {// 當用戶按下并釋放一個鍵,產生一個字符時調用char keyChar = e.getKeyChar();label.setText("你輸入的字符是: " + keyChar);}@Overridepublic void keyPressed(KeyEvent e) {// 當用戶按下某個鍵時調用int keyCode = e.getKeyCode();label.setText("你按下的鍵碼是: " + keyCode);}@Overridepublic void keyReleased(KeyEvent e) {// 當用戶釋放某個鍵時調用int keyCode = e.getKeyCode();label.setText("你釋放的鍵碼是: " + keyCode);}public static void main(String[] args) {// 在事件調度線程中創建和顯示 GUIjavax.swing.SwingUtilities.invokeLater(() -> new KeyboardListenerExample());}
}