java swing事件_第四节 Java Swing事件处理
第四節:事件處理
一個圖形界面完的成只是程序開發中起步的工作,因為要想讓每一個組件都發揮其作用,就必須對所有的組件進行事件處理。那么什么是事件處理,所謂事件就表示一個對象發生狀態變化。例如,每當按下一個按鈕時,實際上按鈕的狀態就發生了變化,而如果要想處理此事件,就需要監聽者不斷地進行監聽事件的變化,并根據時間進行相應的處理。事件要想被處理,必須使用事件監聽器,所有的事件監聽器都是以接口的形式出現的,處理時只要實現此接口就行。整個事件處理流程如下圖所示:
下面通過幾個事件來進一步說明事件的處理流程。
窗體事件
WindowsListener是專門處理窗體的事件監聽接口,一個窗體的所有變化,如窗體的打開,關閉等都可以使用這個接口進行監聽。此接口定義的方法如下:
public?void?windowOpened(WindowEvent?e)//窗口打開時觸發
public?void?windowClosing(WindowEvent?e)//窗口正在關閉時觸發
public?void?windowIconified(WindowEvent?e)//窗口最小化時觸發
public?void?windowDeiconified(WindowEvent?e)//窗口從最小化恢復到正常狀態時觸發
public?void?windowActivated(WindowEvent?e)//將窗口變為活動窗口時觸發
public?void?windowDeactivated(WindowEvent?e)//將窗口變為不活動窗口時觸發
建立一個監聽器
import?java.awt.event.WindowEvent;
import?java.awt.event.WindowListener;
public?class?MyWindowEventHandle?implements?WindowListener{
@Override
public?void?windowOpened(WindowEvent?e)?{
//?TODO?Auto-generated?method?stub
System.out.println("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("windowClosed-->窗口被關閉");
System.exit(1);//系統退出
}
@Override
public?void?windowIconified(WindowEvent?e)?{
//?TODO?Auto-generated?method?stub
System.out.println("windowIconifed-->窗口最小化");
}
@Override
public?void?windowDeiconified(WindowEvent?e)?{
//?TODO?Auto-generated?method?stub
System.out.println("windowDeiconified-->窗口最小化恢復");
}
@Override
public?void?windowActivated(WindowEvent?e)?{
//?TODO?Auto-generated?method?stub
System.out.println("windowActivated-->窗口被選中");
}
@Override
public?void?windowDeactivated(WindowEvent?e)?{
//?TODO?Auto-generated?method?stub
System.out.println("windowDeactivated-->窗口被選中");
}
}
單單只有一個監聽器是不夠的,還需要在組件上注冊監聽,這樣才可以處理,直接使用窗體的addWindowListener(監聽對象)方法即可注冊。
import?java.awt.Color;
import?javax.swing.JFrame;
public?class?MyWindowEventJFrame01?{
public?static?void?main(String?args[]){
JFrame?jFrame=new?JFrame("Welcome?to?MichaelLee!");
//將此窗口加入到一個窗口監聽器中,這樣監聽器就可以根據時間進行處理
jFrame.addWindowListener(new?MyWindowEventHandle());
jFrame.setSize(400,300);
jFrame.setBackground(Color.black);
jFrame.setLocation(500,300);
jFrame.setVisible(true);
}
}
程序運行結果:
windowActivated-->窗口被選中
windowOpened-->窗口被打開
windowIconifed-->窗口最小化
windowDeactivated-->窗口被選中
windowDeiconified-->窗口最小化恢復
windowActivated-->窗口被選中
windowClosing-->窗口關閉
windowDeactivated-->窗口被選中
程序運行后會顯示一個窗體,此時對窗體進行相應的狀態變化,則在后臺會打印出以上的信息。
監聽適配器:
大致了解事件處理的基本流程后,大家可能會有這樣一個疑問,如果現在只需對關閉窗口的事件進行監聽,其他的操作根本就不關心,那末還有必要覆寫那么多的方法嗎?能不能只根據個人的需要來進行覆寫?答案是肯定的。要想解決這個問題,可以使用Adapter(適配器)類。以WindowAdapter為例,用戶只要繼承了此類,就可以根據自己的需要覆寫方法。比如現在我們只關心關閉窗口和打開窗口。
通過WindowAdapter實現監聽
import?java.awt.event.WindowAdapter;
import?java.awt.event.WindowEvent;
public?class?MyWindowAdapterHandler?extends?WindowAdapter{
@Override
public?void?windowOpened(WindowEvent?e)?{
//?TODO?Auto-generated?method?stub
super.windowOpened(e);
System.out.println("窗口被打開!");
}
@Override
public?void?windowClosing(WindowEvent?e)?{
//?TODO?Auto-generated?method?stub
super.windowClosed(e);
System.out.println("窗口關閉!");
}
}
注冊事件監聽
import?java.awt.Color;
import?javax.swing.JFrame;
public?class?MyWindowEventJFrame02?{
public?static?void?main(String?args[]){
JFrame?jFrame=new?JFrame("Welcome?to?MichaelLee!");
jFrame.addWindowListener(new?MyWindowAdapterHandler());
jFrame.setSize(500,400);
jFrame.setLocation(300,400);
jFrame.setBackground(Color.BLUE);
jFrame.setVisible(true);
}
}
程序運行結果:
窗口被打開!
窗口關閉!
此時只監聽窗口被打開以及被關閉事件,但是這樣一來又會出現一個新的問題,如果此監聽處理只需操作一次,那末就沒必要將其設置成一個單獨的類,此時就可以利用匿名內部類來完成。
使用匿名內部類:
import?java.awt.Color;
import?java.awt.event.WindowAdapter;
import?java.awt.event.WindowEvent;
import?java.awt.event.WindowListener;
import?javax.swing.JFrame;
public?class?MyWindowEventJframe03?{
public?static?void?main(String?args[]){
JFrame?jFrame=new?JFrame("Welcome?to?MichaelLee!");
//此時直接使用WindowAdapter的子類完成監聽的處理
jFrame.addWindowListener(new?WindowAdapter()?{
//覆寫窗口的關閉方法
@Override
public?void?windowOpened(WindowEvent?e)?{
//?TODO?Auto-generated?method?stub
super.windowOpened(e);
System.out.println("窗口被打開!");
}
@Override
public?void?windowClosing(WindowEvent?e)?{
//?TODO?Auto-generated?method?stub
super.windowClosed(e);
System.out.println("窗口關閉!");
}
});
jFrame.setSize(500,400);
jFrame.setLocation(300,400);
jFrame.setBackground(Color.BLUE);
jFrame.setVisible(true);
}
}
效果與上面的一樣,可以看出直接編寫匿名內部類可以減少監聽類的定義,這在開發中是較為常見的一種做法。
動作事件及監聽處理:
要想讓一個按鈕變得有意義,就必須使用事件處理。在Swing事件處理中可以使用ActionListener接口處理按鈕的動作事件,ActionListener接口只定義了一個方法
Void?actiongPerformed(ActionEvent?e)//發生操作時調用
是用以上接口監聽按鈕的單擊事件
import?java.awt.Color;
import?java.awt.Font;
import?java.awt.Frame;
import?java.awt.GridLayout;
import?java.awt.event.ActionEvent;
import?java.awt.event.ActionListener;
import?java.awt.event.WindowAdapter;
import?java.awt.event.WindowEvent;
import?javax.swing.JButton;
import?javax.swing.JFrame;
import?javax.swing.JLabel;
import?javax.swing.JPanel;
import?javax.swing.JTextField;
class?ActionHandler{
private?JFrame?jframe=new?JFrame("Welcome?to?MichaelLee!");
private?JButton?btn=new?JButton("顯示");
private?JLabel??lab=new?JLabel();
private?JTextField?text=new?JTextField(10);//定義一個文本域
private?JPanel?pan=new?JPanel();//定義一個版面
public?ActionHandler(){
Font?font=new?Font("Serif",Font.ITALIC+Font.BOLD,28);
lab.setFont(font);
lab.setText("等待用戶輸入!");
btn.addActionListener(new?ActionListener()?{
@Override
public?void?actionPerformed(ActionEvent?e)?{
//?TODO?Auto-generated?method?stub
if(e.getSource()==btn){//判斷觸發源是否是按鈕
lab.setText(text.getText());//將文本文字設置到標簽
}
}
});
//此時直接使用WindowAdapter的子類完成監聽的處理
jframe.addWindowListener(new?WindowAdapter()?{
//覆寫窗口的關閉方法
@Override
public?void?windowOpened(WindowEvent?e)?{
//?TODO?Auto-generated?method?stub
super.windowOpened(e);
System.out.println("窗口被打開!");
}
@Override
public?void?windowClosing(WindowEvent?e)?{
//?TODO?Auto-generated?method?stub
super.windowClosed(e);
System.out.println("窗口關閉!");
}
});
jframe.setLayout(new?GridLayout(2,1));
pan.setLayout(new?GridLayout(1,2));
pan.add(text);
pan.add(btn);
jframe.add(pan);
jframe.add(lab);
jframe.add(lab);
jframe.pack();//根據組件自動調整窗口
jframe.setLocation(500,400);
jframe.setBackground(Color.BLUE);
jframe.setVisible(true);
}
}
public?class?MyActionEventDemon01?{
public?static?void?main(String?args[]){
new?ActionHandler();
}
}
運行程序首先會出現這樣一個界面
在文本框中輸入內容后,單擊顯示,界面會變成這樣
此時只要單擊按鈕就會觸發監聽器
了解了動作事件之后,實際上就可以使用此事件完成一個簡單的用戶登錄操作。例如在程序中輸入的用戶名為MichaelLee密碼為2014/7/9
則認為是合法用戶,提示登錄成功的信息。反之,則提示登陸失敗的信息。代碼如下:
先建一個類
class?logincheck?{
private?String?name;
private?String?password;
public?logincheck(String?name,String?password){
this.name=name;
this.password=password;
}
public?boolean?validate(){
if("MichaelLee".equals(name)&&"2014/7/9".equals(password)){
return?true;
}else{
return?false;
}
}
}
登錄操作實現:
import?java.awt.Font;
import?java.awt.event.ActionEvent;
import?java.awt.event.ActionListener;
import?java.awt.event.WindowAdapter;
import?java.awt.event.WindowEvent;
import?javax.swing.JButton;
import?javax.swing.JFrame;
import?javax.swing.JLabel;
import?javax.swing.JPasswordField;
import?javax.swing.JTextField;
class?ActionHandle{//監聽事件一旦形成,就一直處于監聽狀態,除非窗口關閉
private?JFrame?jFrame=new?JFrame("Welcome?to?MichaelLee!");
private?JButton?submit=new?JButton("登錄");
private?JButton?reset=new?JButton("重置");
private?JLabel?nameLabel=new?JLabel("用戶名");
private?JLabel?passJLabel=new?JLabel("密碼");
private?JLabel?infoLabel=new?JLabel("用戶登錄系統");
private?JTextField?nameField=new?JTextField();
private?JPasswordField?passField=new?JPasswordField();
public?ActionHandle(){
Font?font=new?Font("Serif",Font.BOLD,12);
infoLabel.setFont(font);
submit.addActionListener(new?ActionListener()?{
@Override
public?void?actionPerformed(ActionEvent?e)?{
//?TODO?Auto-generated?method?stub
if(e.getSource()==submit){//判斷觸發源是否是提交按鈕
//System.out.println("NO!");
String?tname=nameField.getText();
String?tpass=passField.getText();
logincheck?log=new?logincheck(tname,tpass);
if(log.validate()){//對用戶名和密碼進行驗證
infoLabel.setText("登陸成功,歡迎光臨!");
}else{
infoLabel.setText("登錄失敗,錯誤的用戶名或密碼");
}
}
}});
reset.addActionListener(new?ActionListener()?{
@Override
public?void?actionPerformed(ActionEvent?e)?{
//?TODO?Auto-generated?method?stub
if(e.getSource()==reset){//判斷觸發源是否是重置按鈕
nameField.setText("");//清空文本框內容
passField.setText("");//清空密碼框內容
infoLabel.setText("用戶登錄");
}
}
});
jFrame.addWindowListener(new?WindowAdapter()?{
@Override
public?void?windowOpened(WindowEvent?e)?{
//?TODO?Auto-generated?method?stub
super.windowOpened(e);
System.out.println("窗口打開");
}
@Override
public?void?windowClosing(WindowEvent?e)?{
//?TODO?Auto-generated?method?stub
super.windowClosing(e);
System.out.println("窗口關閉");
}
@Override
public?void?windowIconified(WindowEvent?e)?{
//?TODO?Auto-generated?method?stub
super.windowIconified(e);
System.out.println("窗口最小化");
}
@Override
public?void?windowDeiconified(WindowEvent?e)?{
//?TODO?Auto-generated?method?stub
super.windowDeiconified(e);
System.out.println("取消窗口最小化");
}
@Override
public?void?windowActivated(WindowEvent?e)?{
//?TODO?Auto-generated?method?stub
super.windowActivated(e);
System.out.println("選中窗口");
}
@Override
public?void?windowDeactivated(WindowEvent?e)?{
//?TODO?Auto-generated?method?stub
super.windowDeactivated(e);
System.out.println("取消窗口選中");
}
});
jFrame.setLayout(null);
nameLabel.setBounds(5,5,60,20);
passJLabel.setBounds(5,30,60,?20);
infoLabel.setBounds(5,65,220,30);
nameField.setBounds(65,5,100,20);
passField.setBounds(65,30,100,20);
submit.setBounds(165,5,60,20);
reset.setBounds(165,30,60,20);
jFrame.add(infoLabel);
jFrame.add(nameField);
jFrame.add(nameLabel);
jFrame.add(passField);
jFrame.add(passJLabel);
jFrame.add(reset);
jFrame.add(submit);
jFrame.setSize(380,130);
jFrame.setVisible(true);
}
}
public?class?MyActionExentDemon03?{
public?static?void?main(String?args[]){
new?ActionHandle();
}
}
程序運行結果
輸入正確的用戶名和密碼則會出現提示登陸成功,否則提示登錄失敗,單擊重置按鈕,內容被清空。
鍵盤事件及監聽處理
在Swing中可以直接使用KeyListener接口對鍵盤的操作進行監聽
KeyListener接口的方法
public?void?keyTyped(KeyEvent?e)//輸入某個鍵時調用
public?void?keyPressed(KeyEvent?e)//鍵盤按下時調用
public?void?keyReleased(KeyEvent?e)//鍵盤松開時調用
public?char?getKeyChar()//返回輸入的字符,只針對與keyTyped有意義
public?int?getKeyCode()//返回輸入字符的鍵碼
public?static?String?getKeyText(int?keyCode)//返回此鍵的信息,如‘HOME’‘F1’或‘A’等
實現鍵盤監聽
import?java.awt.event.KeyEvent;
import?java.awt.event.KeyListener;
import?java.awt.event.WindowAdapter;
import?java.awt.event.WindowEvent;
import?javax.swing.JFrame;
import?javax.swing.JScrollPane;
import?javax.swing.JTextArea;
class?MykeyHandle?extends?JFrame?implements?KeyListener{
public?JTextArea?textArea=new?JTextArea();
public?MykeyHandle(){
super.setTitle("Welcome?to?MichaelLee!");
JScrollPane?src=new?JScrollPane(textArea);
src.setBounds(5,?5,?300,?200);
super.add(src);
textArea.addKeyListener(this);
super.setSize(310,?210);
super.setVisible(true);
super.addWindowListener(new?WindowAdapter()?{
@Override
public?void?windowOpened(WindowEvent?e)?{
//?TODO?Auto-generated?method?stub
super.windowOpened(e);
System.out.println("窗口打開");
}
@Override
public?void?windowClosing(WindowEvent?e)?{
//?TODO?Auto-generated?method?stub
super.windowClosing(e);
System.out.println("窗口關閉");
}
});
}
@Override
public?void?keyTyped(KeyEvent?e)?{
//?TODO?Auto-generated?method?stub
System.out.println("輸入的內容是:"+e.getKeyChar()+"\n");//輸出到后臺
textArea.append("輸入的內容是:"+e.getKeyChar()+"\n");//輸入到多行文本框中
}
@Override
public?void?keyPressed(KeyEvent?e)?{
//?TODO?Auto-generated?method?stub
System.out.println("鍵盤"+KeyEvent.getKeyText(e.getKeyCode())+"鍵按下\n");//輸出到后臺
textArea.append("鍵盤"+KeyEvent.getKeyText(e.getKeyCode())+"鍵按下\n");//輸入到多行文本框中
}
@Override
public?void?keyReleased(KeyEvent?e)?{
//?TODO?Auto-generated?method?stub
System.out.println("鍵盤"+KeyEvent.getKeyText(e.getKeyCode())+"鍵松開\n");//輸出到后臺
textArea.append("鍵盤"+KeyEvent.getKeyText(e.getKeyCode())+"鍵松開\n");//輸入到多行文本框中
}
}
public?class?MyKeyEventDemon01?{
public?static?void?main(String?args[]){
new?MykeyHandle().textArea.append("hahhahahhahah!");
}
}
運行結果
This表示當前對象,以上程序中,MyKeyHandle實現了KeyListener監聽接口,所以此類也是監聽操作類,這樣當JTextArea增加事件時直接使用This關鍵字,如下所示:
text.addKeyListener(this);
This表示當前對象,此時將this加入到監聽器中,就表示將一個監聽處理類加入到監聽器中。
在鍵盤監聽中也可以使用KeyAdapter適配器完成鍵盤事件的監聽
使用KeyAdapter
import?java.awt.event.KeyAdapter;
import?java.awt.event.KeyEvent;
import?java.awt.event.WindowAdapter;
import?java.awt.event.WindowEvent;
import?javax.swing.JFrame;
import?javax.swing.JScrollPane;
import?javax.swing.JTextArea;
class?Mykeyhandle2?extends?JFrame{
//此類直接繼承了JFrame,以下的super可以理解為JFrame
private?JTextArea?textArea=new?JTextArea();
public?Mykeyhandle2(){
super.setTitle("Welcome?to?MichaelLee!");
JScrollPane?src=new?JScrollPane(textArea);
src.setBounds(5,?5,?300,?200);
super.add(src);
textArea.addKeyListener(new?KeyAdapter()?{//直接使用KeyAdapter完成監聽,可以選擇需要的方法進行覆寫
@Override
public?void?keyTyped(KeyEvent?e)?{
//?TODO?Auto-generated?method?stub
super.keyTyped(e);
System.out.println("輸入的內容是:"+e.getKeyChar()+"\n");
textArea.append("輸入的內容是:"+e.getKeyChar()+"\n");
}
});
super.setSize(310,?210);
super.setVisible(true);
super.addWindowListener(new?WindowAdapter()?{
@Override
public?void?windowOpened(WindowEvent?e)?{
//?TODO?Auto-generated?method?stub
super.windowOpened(e);
System.out.println("窗口打開");
}
@Override
public?void?windowClosing(WindowEvent?e)?{
//?TODO?Auto-generated?method?stub
super.windowClosing(e);
System.out.println("窗口關閉");
}
});
}
}
public?class?MyKeyEventDemon02?{
public?static?void?main(String?args[]){
new?Mykeyhandle2();
}
}
運行效果
對鼠標事件進行監聽可以使用MouseListener接口,常用方法如下:
public?void?mouseClicked(MouseEvent?e)//鼠標單擊時調用
public?void?mousePressed(MouseEvent?e)//按下時調用
public?void?mouseReleased(MouseEvent?e)//松開時調用
public?void?mouseEntered(MouseEvent?e)//鼠標進入到組件時調用
public?void?mouseExited(MouseEvent?e)//鼠標離開組件時調用
Public?static?final?int?BUTTON1//表示鼠標左鍵的常量
Public?static?final?int?BUTTON2//表示鼠標滾軸的常量
Public?static?final?int?BUTTON3//表示鼠標右鍵的常量
Public?int?getButton()//以數字形式返回按下的鼠標鍵
Public?int?getClickCount()//返回鼠標的單擊次數
Public?int?getX()//返回鼠標操作的X坐標
Public?int?getY()//返回鼠標操作的Y坐標
實現鼠標監聽
import?java.awt.event.MouseEvent;
import?java.awt.event.MouseListener;
import?java.awt.event.WindowAdapter;
import?java.awt.event.WindowEvent;
import?javax.swing.JFrame;
import?javax.swing.JScrollPane;
import?javax.swing.JTextArea;
class?MyMousehandle?extends?JFrame?implements?MouseListener{
private?JTextArea?textArea=new?JTextArea();
public?MyMousehandle(){
super.setTitle("Welcome?to?MichaelLee!");
JScrollPane?src=new?JScrollPane(textArea);
src.setBounds(5,?5,?300,?200);
super.add(src);
textArea.addMouseListener(this);
super.setSize(310,210);
super.setVisible(true);
super.addWindowListener(new?WindowAdapter()?{
@Override
public?void?windowClosing(WindowEvent?e)?{
//?TODO?Auto-generated?method?stub
super.windowClosing(e);
System.exit(1);
}
});
}
@Override
public?void?mouseClicked(MouseEvent?e)?{
//?TODO?Auto-generated?method?stub
int?c=e.getButton();
String?mouseInfo=null;
if(c==MouseEvent.BUTTON1){
mouseInfo="左鍵";
}else?if(c==MouseEvent.BUTTON3){
mouseInfo="右鍵";
}else?if(c==MouseEvent.BUTTON2){
mouseInfo="滾軸";
}
textArea.append("鼠標單擊:"+mouseInfo+"\n");
}
@Override
public?void?mousePressed(MouseEvent?e)?{
//?TODO?Auto-generated?method?stub
textArea.append("鼠標按下。\n");
}
@Override
public?void?mouseReleased(MouseEvent?e)?{
//?TODO?Auto-generated?method?stub
textArea.append("鼠標松開。\n");
}
@Override
public?void?mouseEntered(MouseEvent?e)?{
//?TODO?Auto-generated?method?stub
textArea.append("鼠標進入組件。\n");
}
@Override
public?void?mouseExited(MouseEvent?e)?{
//?TODO?Auto-generated?method?stub
textArea.append("鼠標離開組件。\n");
}
}
public?class?MyMouseEventdemon01?{
public?static?void?main(String?args[]){
new?MyMousehandle();
}
}
對鼠標事件進行監聽可以使用MouseListener接口,常用方法如下:
public?void?mouseClicked(MouseEvent?e)//鼠標單擊時調用
public?void?mousePressed(MouseEvent?e)//按下時調用
public?void?mouseReleased(MouseEvent?e)//松開時調用
public?void?mouseEntered(MouseEvent?e)//鼠標進入到組件時調用
public?void?mouseExited(MouseEvent?e)//鼠標離開組件時調用
Public?static?final?int?BUTTON1//表示鼠標左鍵的常量
Public?static?final?int?BUTTON2//表示鼠標滾軸的常量
Public?static?final?int?BUTTON3//表示鼠標右鍵的常量
Public?int?getButton()//以數字形式返回按下的鼠標鍵
Public?int?getClickCount()//返回鼠標的單擊次數
Public?int?getX()//返回鼠標操作的X坐標
Public?int?getY()//返回鼠標操作的Y坐標
實現鼠標監聽
import?java.awt.event.MouseEvent;
import?java.awt.event.MouseListener;
import?java.awt.event.WindowAdapter;
import?java.awt.event.WindowEvent;
import?javax.swing.JFrame;
import?javax.swing.JScrollPane;
import?javax.swing.JTextArea;
class?MyMousehandle?extends?JFrame?implements?MouseListener{
private?JTextArea?textArea=new?JTextArea();
public?MyMousehandle(){
super.setTitle("Welcome?to?MichaelLee!");
JScrollPane?src=new?JScrollPane(textArea);
src.setBounds(5,?5,?300,?200);
super.add(src);
textArea.addMouseListener(this);
super.setSize(310,210);
super.setVisible(true);
super.addWindowListener(new?WindowAdapter()?{
@Override
public?void?windowClosing(WindowEvent?e)?{
//?TODO?Auto-generated?method?stub
super.windowClosing(e);
System.exit(1);
}
});
}
@Override
public?void?mouseClicked(MouseEvent?e)?{
//?TODO?Auto-generated?method?stub
int?c=e.getButton();
String?mouseInfo=null;
if(c==MouseEvent.BUTTON1){
mouseInfo="左鍵";
}else?if(c==MouseEvent.BUTTON3){
mouseInfo="右鍵";
}else?if(c==MouseEvent.BUTTON2){
mouseInfo="滾軸";
}
textArea.append("鼠標單擊:"+mouseInfo+"\n");
}
@Override
public?void?mousePressed(MouseEvent?e)?{
//?TODO?Auto-generated?method?stub
textArea.append("鼠標按下。\n");
}
@Override
public?void?mouseReleased(MouseEvent?e)?{
//?TODO?Auto-generated?method?stub
textArea.append("鼠標松開。\n");
}
@Override
public?void?mouseEntered(MouseEvent?e)?{
//?TODO?Auto-generated?method?stub
textArea.append("鼠標進入組件。\n");
}
@Override
public?void?mouseExited(MouseEvent?e)?{
//?TODO?Auto-generated?method?stub
textArea.append("鼠標離開組件。\n");
}
}
public?class?MyMouseEventdemon01?{
public?static?void?main(String?args[]){
new?MyMousehandle();
}
}
也可以通過MouseAdapter實現指定鼠標操作的監聽
import?java.awt.event.MouseAdapter;
import?java.awt.event.MouseEvent;
import?java.awt.event.WindowAdapter;
import?java.awt.event.WindowEvent;
import?javax.swing.JFrame;
import?javax.swing.JScrollPane;
import?javax.swing.JTextArea;
class?MyMousehandle3?extends?JFrame{
private?JTextArea?textArea=new?JTextArea();
public?MyMousehandle3(){
super.setTitle("Welcome?to?MichaelLee!");
JScrollPane?scr=new?JScrollPane(textArea);
scr.setBounds(5,?5,?300,?200);
super.add(scr);
textArea.addMouseListener(new?MouseAdapter()?{
@Override
public?void?mouseClicked(MouseEvent?e)?{//z只覆寫mouseClicked方法
//?TODO?Auto-generated?method?stub
super.mouseClicked(e);
int?c=e.getButton();
String?mouseInfo=null;
if(c==MouseEvent.BUTTON1){
mouseInfo="左鍵";
}else?if(c==MouseEvent.BUTTON3){
mouseInfo="右鍵";
}else{
mouseInfo="滾軸";
}
textArea.append("鼠標單擊:"+mouseInfo+"\n");
}
});
super.setSize(310,210);
super.setVisible(true);
super.addWindowListener(new?WindowAdapter()?{
@Override
public?void?windowClosing(WindowEvent?e)?{
//?TODO?Auto-generated?method?stub
super.windowClosing(e);
System.exit(1);
}
});
}
}
public?class?MyMouseEventDemon02?{
public?static?void?main(String?args[]){
new?MyMousehandle();
}
}
鼠標拖曳事件及監聽處理
在一般的圖形界面經常可以看到鼠標拖曳操作的處理,在Swing事件處理方法中可以使用MouseMotionListener接口完成鼠標的拖曳操作。此接口常用方法:
Void?mouseDragged(MouseEvent?e)//在組件上按下并拖動時調用
Void?MouseMoved(MouseEvent?e)//鼠標移動到組件時調用
觀察鼠標拖曳操作
鼠標拖曳事件及監聽處理
在一般的圖形界面經??梢钥吹绞髽送弦凡僮鞯奶幚?#xff0c;在Swing事件處理方法中可以使用MouseMotionListener接口完成鼠標的拖曳操作。此接口常用方法:
Void?mouseDragged(MouseEvent?e)//在組件上按下并拖動時調用
Void?MouseMoved(MouseEvent?e)//鼠標移動到組件時調用
觀察鼠標拖曳操作
import?java.awt.event.MouseEvent;
import?java.awt.event.MouseMotionListener;
import?java.awt.event.WindowAdapter;
import?java.awt.event.WindowEvent;
import?javax.swing.JButton;
import?javax.swing.JFrame;
class?MyMouseMotionhandle?extends?JFrame{
public?MyMouseMotionhandle(){
super.setTitle("Welcome?to?MichaelLee!");
super.addMouseMotionListener(new?MouseMotionListener()?{
@Override
public?void?mouseMoved(MouseEvent?e)?{
//?TODO?Auto-generated?method?stub
System.out.println("鼠標移動到窗體");
}
@Override
public?void?mouseDragged(MouseEvent?e)?{
//?TODO?Auto-generated?method?stub
System.out.println("鼠標拖也到:X="+e.getX()+",Y="+e.getY());
}
});
/*JButton?ibt=new?JButton("按鈕");
super.add(ibt);*/
super.setSize(310,210);
super.setVisible(true);
super.addWindowListener(new?WindowAdapter()?{
@Override
public?void?windowClosing(WindowEvent?e)?{
//?TODO?Auto-generated?method?stub
super.windowClosing(e);
System.exit(1);
}
});
}
}
public?class?MyMouseMotionEventDemon01?{
public?static?void?main(String?args[]){
new?MyMouseMotionhandle();
}
}
程序運行后發現,只要鼠標一向窗體移動就會觸發mouseMoved()事件,只要是在窗體上拖曳,就會觸發mouseDragged事件。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的java swing事件_第四节 Java Swing事件处理的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Python map/reduce
- 下一篇: angularjs1-5,class,
