1. 程式人生 > >Java事件驅動程式設計

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);

}
}


三.使用繼承