Java中的事件模型

事件監聽

實例代碼:

import java.awt.*;
import java.awt.event.*;

public class TestActionEvent{
	public static void main(String[] args){
		Frame f = new Frame("Test");
		Button b = new Button("Press Me!");
		Monitor bh = new Monitor();
		b.addActionListener(bh);
		f.add(b,BorderLayout.CENTER);
		f.pack();
		f.setVisible(true);
	}
}

class Monitor implements ActionListener{
	public void actionPerformed(ActionEvent e){
		System.out.println("A button has been pressed");
	}
}

TextFiled

  • TextFiled對象可能發生Action事件,與該事件對應的事件是java.awt.event.ActionEvent;
  • 用來處理ActionEvent事件是實現了java.awt.event.ActionListener接口的類的對象,ActionListener接口定義有方法:public void actionPerformed(ActionEvent e);
  • 實現該接口的類要在該方法中添加處理該事件的語句;
  • 使用addActionListener(ActionListener I)方法爲TextField對象註冊一個ActionListener對象,當TextField對象發生Action事件的時候,會生成一個ActionEvent對象,該對象作爲參數傳遞給ActionListener對象的actionPerformer方法在方法中可以獲取該對象的信息,並做相應的處理。

實例代碼:

import java.awt.*;
import java.awt.event.*;
public class TFActionEvent{
	public static void main(String[] args){
		new TFFrame();
	}
}

class TFFrame extends Frame{
	TFFrame(){
		TextField tf = new TextField();
		add(tf);
		tf.addActionListener(new TFActionListener());
		pack();
		setVisible(true);
	}
}

class TFActionListener implements ActionListener{
	public void actionPerformed(ActionEvent e){
		TextField tf = (TextField)e.getSource();
		System.out.println(tf.getText());
		tf.setText(" ");
	}
}

內部類

  • 可以非常方便的訪問包裝類的成員變量和成員方法;
  • 該類不允許或不需要其他類進行訪問時。

實例代碼:

import java.awt.*;
import java.awt.event.*;
public class TFMath1{
	public static void main(String[] args){
		//調用launchFrame方法
		new TFFrame().launchFrame();
	}
}
//繼承Frame類
class TFFrame extends Frame{
	//爲了actionPerformed方法能拿到num裏的數,把它聲明爲成員變量
	TextField num1,num2,num3;
	//讓Frame運行起來
	public void launchFrame(){
		//添加控件
		num1 = new TextField(10);
		num2 = new TextField(10);
		num3 = new TextField(10);
		Label lblPlus = new Label("+");
		Button btnEqual = new Button("=");
		
		btnEqual.addActionListener(new MyMonitor());
		//設置控件佈局
		setLayout(new FlowLayout());
		add(num1);
		add(lblPlus);
		add(num2);
		add(btnEqual);
		add(num3);
		//打包
		pack();
		//讓界面顯示
		setVisible(true);
	}
	class MyMonitor implements ActionListener{
		public void actionPerformed(ActionEvent e){
			//拿到num裏的數轉換成Integer
			int n1 = Integer.parseInt(num1.getText());
			int n2 = Integer.parseInt(num2.getText());
			num3.setText(""+(n1+n2));
		}
	}
}

Graphics

  • 每個Component都有一個paint(Graphics g)用於實現繪圖目的,每次重畫該component是都自動調用paint方法;
  • Graphics類中提供該類許多繪圖方法,如:drawRect(int x,int y,int width,int height)

實例代碼:

import java.awt.*;
public class TestPaint{
	public static void main(String[] args){
		new PaintFrame().launchFrame();
	}
}
class PaintFrame extends Frame{
	public void launchFrame(){
		setBounds(200,200,640,480);
		setVisible(true);
	}
	public void paint(Graphics g){
		Color c = g.getColor();
		g.setColor(Color.green);
		g.fillOval(50,50,50,50);
		g.setColor(Color.blue);
		g.fillRect(80,80,80,80);
		g.setColor(c);
	}
}

鼠標事件適配器

  • 抽象類java.awt.event.MouseAdapter實現了MouseListener接口,可以使用其子類作爲MouseEvent的監聽器,只要重寫其相應的方法即可;
  • 對於其他的監聽器,也有對應的適配器;
  • 使用適配器可以避免監聽器類定義沒有必要的空方法;
  • GUI/MyMouseAdapter.java鼠標適配器;
  • repaint-updata()-paint()

實例代碼:

import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class MyMouseAdapter{
	public static void main(String[] args){
		new MyFrame("Drawing...");
	}
}

class MyFrame extends Frame{
	ArrayList points = null;
	MyFrame(String s){
		super(s);
		points = new ArrayList();
		setLayout(null);
		setBounds(300,300,300,300);
		this.setBackground(new Color(204,204,204));
		setVisible(true);
		this.addMouseListener(new Monitor());
	}
	
	public void paint(Graphics g){
		Iterator i = points.iterator();
		while(i.hasNext()){
			Point p = (Point)i.next();
			g.setColor(Color.RED);
			g.fillOval(p.x,p.y,8,8);
		}
	}
	
	public void addPoint(Point p){
		points.add(p);
	}
}

class Monitor extends MouseAdapter{
	public void mousePressed(MouseEvent e){
		MyFrame f = (MyFrame)e.getSource();
		f.addPoint(new Point(e.getX(),e.getY()));
		f.repaint();
	}
}

匿名類

實例代碼:

import java.awt.*;
import java.awt.event.*;

public class TestAnonymouse{
	Frame f = new Frame("Test");
	TextField tf = new TextField(10);
	Button b = new Button("Start");
	
	public TestAnonymouse(){
		f.add(b,"North");
		f.add(tf,"South");
		
		b.addActionListener(new ActionListener(){
			private int i;
			public void actionPerformed(ActionEvent e){
				tf.setText(e.getActionCommand() + ++i);
			}
		});
		f.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e){
				System.exit(0);
			}
		});
		
		f.pack();
		f.setVisible(true);
	}
	public static void main(String args[]){
		new TestAnonymouse();
	}
}

鍵盤事件

實例代碼:

import java.awt.*;
import java.awt.event.*;

public class TestKey{
	public static void main(String[] args){
		new KeyFrame().launchFrame();
	}
}

class KeyFrame extends Frame{
	public void launchFrame(){
		setSize(300,300);
		setLocation(400,400);
		addKeyListener(new MyKeyMonitor());
		setVisible(true);
	}
	
	class MyKeyMonitor extends KeyAdapter{
		public void keyPressed(KeyEvent e){
			int keyCode = e.getKeyCode();
			if(keyCode == KeyEvent.VK_UP){
				System.out.println("UP");
			}
		}
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章