Java事件驅動程式設計
**********************事件驅動程式設計***************************
一.基本概念
由使用者發出某個事件,驅動某段程式碼執行,叫做事件驅動程式設計
1. 事件源
誰發出了這個事件,事件的來源
單擊按鈕 事件源:按鈕
視窗關閉 視窗
電話響鈴 電話
2.事件名稱
單擊
響鈴
3.事件監聽器
事件監聽器是一個類,發生事件以後,執行這個類中某個方法中的程式碼...這個類叫做事件監聽器
4.事件物件
是對事件的一個具體的描述 封裝到事件物件中
電話響鈴 誰打的電話 打給誰的 是否接通 通話時長 ....
鍵盤按下事件 使用者到底按了哪個鍵 可以通過事件物件來獲得
類似異常物件
**********************如何註冊一個事件***************************
事件源.addXXXListener(new XXXListener());//註冊一個事件
需求1: 演示給按鈕註冊事件
演示程式碼:
package com.chapter16.事件驅動程式設計;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TestEvent {
private Frame frame = new Frame("演示給按鈕註冊事件");
private TextField textField = new TextField(20);
private Button button = new Button("點我");
//用來初始化介面
public void init(){
frame.add(textField);
frame.add(button,BorderLayout.SOUTH);
//2.給按鈕繫結一個事件
button.addActionListener(new MyActionListener());
frame.pack();
frame.setVisible(true);
}
//1.定義一個事件監聽器類
private class MyActionListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent event){
System.out.println("按鈕被單擊了");
textField.setText("Hello World!!");
}
}
public static void main(String[] args) {
TestEvent test = new TestEvent();
test.init();
}
}
需求2: 給視窗繫結關閉事件
實現WindowListener 的 windowClosing()方法 來關閉視窗
package com.chapter16.事件驅動程式設計;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
public class TestEvent {
private Frame frame = new Frame("演示給按鈕註冊事件");
private TextField textField = new TextField(20);
private Button button = new Button("點我");
//用來初始化介面
public void init(){
frame.add(textField);
frame.add(button,BorderLayout.SOUTH);
//2.給按鈕繫結一個事件
button.addActionListener(new MyActionListener());
frame.addWindowListener(new MyWindowListener());
frame.pack();
frame.setVisible(true);
}
//1.定義一個事件監聽器類
//第一種繫結事件的方式: 使用非靜態內部類
//內部類作為外部類的第五個成員 可以隨意的訪問外部類的任意成員(例如屬性)
private class MyActionListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent event){
System.out.println("按鈕被單擊了");
textField.setText("Hello World!!");
}
}
//給視窗繫結事件 需要實現 WindowListener介面
private class MyWindowListener implements WindowListener{
@Override
public void windowOpened(WindowEvent e) {
System.out.println("視窗第一次被開啟");
}
@Override
public void windowClosing(WindowEvent e) {
System.out.println("使用者檢視關閉視窗");
System.exit(0);
}
@Override
public void windowClosed(WindowEvent e) {
System.out.println("視窗已經被關閉了");
}
@Override
public void windowIconified(WindowEvent e) {
System.out.println("視窗最小化");
}
@Override
public void windowDeiconified(WindowEvent e) {
System.out.println("視窗被恢復");
}
@Override
public void windowActivated(WindowEvent e) {
System.out.println("視窗被啟用");
}
@Override
public void windowDeactivated(WindowEvent e) {
System.out.println("視窗失去焦點");
}
}
public static void main(String[] args) {
TestEvent test = new TestEvent();
test.init();
}
}
雖然實現了這個功能,但是相當麻煩,有沒有簡便方式?
有.使用介面卡
***************************事件介面卡***********************************
public class WindowAdapter implements WindowListener{
//對每個方法都提供了空實現
}
演示程式碼:
package com.chapter16.事件驅動程式設計;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class TestEvent {
private Frame frame = new Frame("演示給按鈕註冊事件");
private TextField textField = new TextField(20);
private Button button = new Button("點我");
//用來初始化介面
public void init(){
frame.add(textField);
frame.add(button,BorderLayout.SOUTH);
//2.給按鈕繫結一個事件
button.addActionListener(new MyActionListener());
frame.addWindowListener(new MyWindowAdapter());
frame.pack();
frame.setVisible(true);
}
//1.定義一個事件監聽器類
//第一種繫結事件的方式: 使用非靜態內部類
//內部類作為外部類的第五個成員 可以隨意的訪問外部類的任意成員(例如屬性)
private class MyActionListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent event){
System.out.println("按鈕被單擊了");
textField.setText("Hello World!!");
}
}
private class MyWindowAdapter extends WindowAdapter{
@Override
public void windowClosing(WindowEvent e) {
System.out.println("使用者試圖關閉視窗");
System.exit(0);
}
}
public static void main(String[] args) {
TestEvent test = new TestEvent();
test.init();
}
}
*************************製作選單***************************
1.建立一個選單(Menu),往選單中新增選單項(MenuItem)
選單也可以作為一個選單項
2.建立一個選單條(MenuBar),把選單新增到選單條中
3.呼叫frame物件.setMenuBar(menuBar);
這樣frame視窗中頂部就有選單了
*************************Swing***************************
AWT和Swing的區別
1.awt依賴於作業系統的底層實現,抽取多個作業系統中共有的函式 功能比較單一 元件比較少
2.swing 是純java實現的 ,不依賴於作業系統的底層實現, 元件比較多
Frame JFrame
Button JButton
JTable的使用
需求: 使用JTable顯示學生的資訊
package com.chapter16;
import java.util.Vector;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
public class TestJTable extends JFrame {
private static final long serialVersionUID = 1L;
public void init(){
setTitle("表格測試");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(300, 300);
// -----建立標題--------------
Vector<String> title = new Vector<String>();
title.add("序號");
title.add("學號");
title.add("姓名");
title.add("性別");
// -----建立內容--------------
Vector<String> data1 = new Vector<String>();
data1.add("1");
data1.add("10001");
data1.add("小明");
data1.add("男");
Vector<String> data2 = new Vector<String>();
data2.add("2");
data2.add("10002");
data2.add("小王");
data2.add("女");
Vector<Vector<String>> datas = new Vector<Vector<String>>();
datas.add(data1);
datas.add(data2);
// -----表格模式--------------
DefaultTableModel defaultTableModel = new DefaultTableModel(datas, title);
// -----建立表格--------------
JTable table = new JTable();
// -----設定表格模式-----------
table.setModel(defaultTableModel);
JScrollPane jScrollPane = new JScrollPane(table);
add(jScrollPane);
setVisible(true);
}
public static void main(String[] args) {
new TestJTable().init();;
}
}
************************編寫GUI程式的三種方式***************************
一.在main方法中建立Frame
public static void main(String[] args){
Frame frame = new Frame();
frame.add(元件);
}
二.使用組合
public class SimpleMenu {
private Frame frame = new Frame("測試");
//初始化介面
public void init(){
frame.add(元件);
frame.pack();
frame.setVisible(true);
}
}
三.使用繼承