改變對象的狀態(tài)被稱為事件,即事件描述源的狀態(tài)變化。事件產(chǎn)生用戶與圖形用戶界面組件交互的結(jié)果。例如,點擊一個按鈕,移動鼠標(biāo),通過鍵盤輸入一個字符,從列表中選擇一個項目,滾動頁面都是導(dǎo)致一個事件發(fā)生的活動。
事件可以大致分為兩類::
前臺事件 - 這些事件需要用戶的直接互動。它們是由在圖形用戶界面中人與圖形組件交互的結(jié)果而產(chǎn)生的。例如,點擊一個按鈕,移動鼠標(biāo),通過鍵盤輸入一個字符,從列表中選擇一個項目,滾動頁面等。
事件處理是一種機制,如果一個事件發(fā)生時,它控制該事件,并且決定應(yīng)該會發(fā)生什么。這種機制具有被稱為事件處理程序的代碼,當(dāng)一個事件發(fā)生時,它是可執(zhí)行的。Java 使用代理事件模型來處理事件。該模型定義了標(biāo)準(zhǔn)的機制來生成和處理事件。讓我們來簡要介紹這個模型。
代理事件模型具有下列主要參與者,即:
源 - 源是一個對象,事件發(fā)生在該對象上。源負(fù)責(zé)提供發(fā)生事件的信息給它的處理器。Java 提供源對象的類。
這種方法的好處是,用戶界面邏輯完全從生成事件的邏輯中分開。用戶界面元素能夠把事件的處理委派給一段單獨的代碼。在這個模型中,監(jiān)聽器需要用源對象注冊,以便監(jiān)聽器能夠接收事件通知。這是一個有效的處理事件的方式,因為這些事件通知只發(fā)送給那些想要接收它們的監(jiān)聽器。
用戶單擊按鈕,然后生成事件。
現(xiàn)在有關(guān)事件類的對象是自動創(chuàng)建的,源和事件的信息在同一對象得到填充。
事件對象被轉(zhuǎn)發(fā)到注冊監(jiān)聽器類的方法中。
為了設(shè)計一個監(jiān)聽器類,我們必須開發(fā)一些監(jiān)聽器接口。這些監(jiān)聽器接口預(yù)測一些公共的抽象回調(diào)方法,這些方法必須由監(jiān)聽器類來實現(xiàn)。
這些方法由 API 提供者來提供,由應(yīng)用程序員來定義,并且由應(yīng)用程序開發(fā)者來調(diào)用。這里的回調(diào)方法代表一個事件方法。響應(yīng)一個事件 java jre 將觸發(fā)回調(diào)方法。所有這些回調(diào)方法在監(jiān)聽器接口中被提供。
如果一個組件需要一些監(jiān)聽器監(jiān)聽它的事件,源必須自己注冊給監(jiān)聽器。
使用你選擇的任何編輯器創(chuàng)建下面的 Java 程序,在 D:/ > SWING > com > tutorialspoint > gui >
SwingControlDemo.java
package com.tutorialspoint.gui;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class SwingControlDemo {
private JFrame mainFrame;
private JLabel headerLabel;
private JLabel statusLabel;
private JPanel controlPanel;
public SwingControlDemo(){
prepareGUI();
}
public static void main(String[] args){
SwingControlDemo swingControlDemo = new SwingControlDemo();
swingControlDemo.showEventDemo();
}
private void prepareGUI(){
mainFrame = new JFrame("Java SWING Examples");
mainFrame.setSize(400,400);
mainFrame.setLayout(new GridLayout(3, 1));
headerLabel = new JLabel("",JLabel.CENTER );
statusLabel = new JLabel("",JLabel.CENTER);
statusLabel.setSize(350,100);
mainFrame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent windowEvent){
System.exit(0);
}
});
controlPanel = new JPanel();
controlPanel.setLayout(new FlowLayout());
mainFrame.add(headerLabel);
mainFrame.add(controlPanel);
mainFrame.add(statusLabel);
mainFrame.setVisible(true);
}
private void showEventDemo(){
headerLabel.setText("Control in action: Button");
JButton okButton = new JButton("OK");
JButton submitButton = new JButton("Submit");
JButton cancelButton = new JButton("Cancel");
okButton.setActionCommand("OK");
submitButton.setActionCommand("Submit");
cancelButton.setActionCommand("Cancel");
okButton.addActionListener(new ButtonClickListener());
submitButton.addActionListener(new ButtonClickListener());
cancelButton.addActionListener(new ButtonClickListener());
controlPanel.add(okButton);
controlPanel.add(submitButton);
controlPanel.add(cancelButton);
mainFrame.setVisible(true);
}
private class ButtonClickListener implements ActionListener{
public void actionPerformed(ActionEvent e) {
String command = e.getActionCommand();
if( command.equals( "OK" )) {
statusLabel.setText("Ok Button clicked.");
}
else if( command.equals( "Submit" ) ) {
statusLabel.setText("Submit Button clicked.");
}
else {
statusLabel.setText("Cancel Button clicked.");
}
}
}
}
使用命令提示符編譯該程序。轉(zhuǎn)到 D:/ > SWING 并輸入下面的命令。
D:\AWT>javac com\tutorialspoint\gui\SwingControlDemo.java
如果沒有錯誤出現(xiàn),就意味著編譯成功。使用下面的命令來運行程序。
D:\AWT>java com.tutorialspoint.gui.SwingControlDemo
驗證下面的輸出
更多建議: