當窗口、窗口內的內容、外設等變動的時候,都會產生事件。
Java事件處理三要素:
1) 事件源(Event Source):即事件發生的場所,就是指各個組件,如按鈕等,點擊按鈕其實就是組件上發生的一個事件;
2) 事件(Event):事件封裝了組件上發生的事情,比如按鈕單擊、按鈕鬆開等等;
3) 事件監聽器(Event Listener):負責監聽事件源上發生的特定類型的事件,當事件到來時還必須負責處理相應的事件;
1、鍵盤事件
當向文本框中輸入內容時,將發出鍵盤事件。KeyEvent類負責捕獲鍵盤事件,可以通過爲組件添加實現了KeyListener接口的監聽器類來處理相應的鍵盤事件。
KeyListener接口共有三個抽象方法,分別在發生擊鍵事件、按鍵被按下和釋放時被觸發。如下面代碼所示
JTextArea textArea = new JTextArea();
textArea.addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) { // 按鍵被按下時被觸發
System.out.println("按下的是“" + e.getKeyChar() + "”");
}
public void keyTyped(KeyEvent e) { // 發生擊鍵事件時被觸發
// 獲得輸入的字符
System.out.println("此次輸入的是“" + e.getKeyChar() + "”");
}
public void keyReleased(KeyEvent e) { // 按鍵被釋放時被觸發
// 獲得描述keyCode的標籤
String keyText = KeyEvent.getKeyText(e.getKeyCode());
System.out.println("您釋放的是“" + keyText + "”鍵");
System.out.println();
}
}
常用的方法
2、鼠標事件
所有組件都能發出鼠標事件,MouseEvent類負責捕獲鼠標事件,可以通過爲組件添加實現了MouseListener接口的監聽器類來處理相應的鼠標事件。
MouseListener接口共有5個抽象方法,分別在光標移入或移出組件時、鼠標按鍵被按下或釋放時和發生單擊事件時被觸發。
final JLabel label = new JLabel();
label.addMouseListener(new MouseListener() {
public void mouseEntered(MouseEvent e) {// 光標移入組件時被觸發
System.out.println("光標移入組件");
}
public void mousePressed(MouseEvent e) {// 鼠標按鍵被按下時被觸發
System.out.print("鼠標按鍵被按下,");
int i = e.getButton(); // 通過該值可以判斷按下的是哪個鍵
if (i == MouseEvent.BUTTON1)
System.out.println("按下的是鼠標左鍵");
if (i == MouseEvent.BUTTON2)
System.out.println("按下的是鼠標滾輪");
if (i == MouseEvent.BUTTON3)
System.out.println("按下的是鼠標右鍵");
}
}
public void mouseClicked(MouseEvent e) // 發生單擊事件時被觸發
public void mouseExited(MouseEvent e) // 光標移出組件時被觸發
public void mouseReleased(MouseEvent e) // 鼠標按鍵被釋放時被觸發
3、窗體事件
窗體焦點發生變化的事件
// 爲窗體添加焦點事件監聽器
addWindowFocusListener(new MyWindowFocusListener());
private class MyWindowFocusListener implements WindowFocusListener {
public void windowGainedFocus(WindowEvent e) {// 窗口獲得焦點時被觸發
System.out.println("窗口獲得了焦點!");
}
public void windowLostFocus(WindowEvent e) {// 窗口失去焦點時被觸發
System.out.println("窗口失去了焦點!");
}
}
捕獲窗體狀態發生變化的事件
// 爲窗體添加狀態事件監聽器
addWindowStateListener(new MyWindowStateListener());
private class MyWindowStateListener implements WindowStateListener {
public void windowStateChanged(WindowEvent e) {
int oldState = e.getOldState();// 獲得窗體以前的狀態
int newState = e.getNewState();// 獲得窗體現在的狀態
String from = "";// 標識窗體以前狀態的中文字符串
String to = "";// 標識窗體現在狀態的中文字符串
switch (oldState) {// 判斷窗臺以前的狀態
case Frame.NORMAL:// 窗體處於正常化
from = "正常化";
break;
case Frame.MAXIMIZED_BOTH:// 窗體處於最大化
from = "最大化";
break;
default:// 窗體處於最小化
from = "最小化";
}
}
}
捕獲其他與窗體有關的事件
addWindowListener(new MyWindowListener());// 爲窗體添加其他事件監聽器
private class MyWindowListener implements WindowListener {
public void windowActivated(WindowEvent e) {// 窗體被激活時觸發
System.out.println("窗口被激活!");
}
}
public interface WindowListener extends EventListener {
public void windowActivated(WindowEvent e); //窗體被激活時觸發
public void windowOpened(WindowEvent e); //窗體被打開時觸發
public void windowIconified(WindowEvent e); //窗體被圖標化時觸發
public void windowDeiconified(WindowEvent e); //窗體被非圖標化時觸發
public void windowClosing(WindowEvent e); //窗體將要被關閉時觸發
public void windowDeactivated(WindowEvent e); //窗體不再處於激活狀態時觸發
public void windowClosed(WindowEvent e); //窗體已經被關閉時觸發
}
4、選項事件
當修改下拉菜單中的選中項時,將發出選項事件。ItemEvent類負責捕獲選項事件,可以通過爲組件添加實現了ItemListener接口的監聽器類來處理相應的選項事件。
JComboBox<String> comboBox = new JComboBox<>();// 創建一個下拉菜單
for (int i = 1; i < 6; i++) {// 通過循環添加選項
comboBox.addItem("選項" + i);
}
comboBox.addItemListener(new ItemListener() {// 添加選項事件監聽器
public void itemStateChanged(ItemEvent e) {
int stateChange = e.getStateChange();// 獲得事件類型
String item = e.getItem().toString();// 獲得觸發此次事件的選項
if (stateChange == ItemEvent.SELECTED) {// 查看是否由選中選項觸發
System.out.println("此次事件由 選中 選項“" + item + "”觸發!");
// 查看是否由取消選中選項觸發
} else if (stateChange == ItemEvent.DESELECTED) {
System.out.println("此次事件由 取消選中 選項“" + item + "”觸發!");
} else {// 由其他原因觸發
System.out.println("此次事件由其他原因觸發!");
}
}
});
getContentPane().add(comboBox);
5、表格模型中的事件
當向表格模型中添加行時,或者是修改或刪除表格模型中的現有行時,將發出表格模型事件。TableModelEvent類負責捕獲表格模型事件,可以通過爲組件添加實現了TableModelListener接口的監聽器類來處理相應的表格模型事件。
String[] columnNames = { "A", "B" };
String[][] rowValues = { { "A1", "B1" }, { "A2", "B2" },
{ "A3", "B3" }, { "A4", "B4" } };
// 創建表格模型對象
tableModel = new DefaultTableModel(rowValues, columnNames);
// 爲表格模型添加事件監聽器
tableModel.addTableModelListener(new TableModelListener() {
public void tableChanged(TableModelEvent e) {
int type = e.getType();// 獲得事件的類型
int row = e.getFirstRow() + 1;// 獲得觸發此次事件的表格行索引
int column = e.getColumn() + 1;// 獲得觸發此次事件的表格列索引
if (type == TableModelEvent.INSERT) {// 判斷是否有插入行觸發
System.out.print("此次事件由 插入 行觸發,");
System.out.println("此次插入的是第 " + row + " 行!");
// 判斷是否有修改行觸發
}
}
}