Java GUI 基础知识2 监听机制

TestActionEvent.java

没有调用方法,但是有反应。反应自己要编写程序有反应。

事件模型:一定要有某些反应。

写程序,监听的操作是自动发生的,一直监听。钩子函数,(回调函数)

怎么让它自动执行,首先告诉人家你的方法名是什么,也不知道,但是这样好像也不行,

实现某个特定的接口,然后button类里面也有特定的方法。

事件分很多中,监听事件的接口也有很多。但某件发生时,封装成一个对象,当成一个参数,传递给监听事件。

栗子:TestActionEvent2.java


通过把actionCommand,把一个按钮的acitonCommand设置为别的。用来区别不同的按钮。


栗子:TFActionEvent.java

TextField tf = (TextField)e.getSource();拿到事件源,把这个源对象当作ActionEvent的父类。

所以需要强制类型转换。

栗子:TFPassword.java


内部类:

Frame像一个大管家,我们要拿到这个大管家的引用。

不需要内部的东西。

持有对方的引用。

直接访问大管家。

如下面:


门面模式。拿到管家的引用。和谁有关系,使用大管家访问他。




栗子:

package com.zhj.www;

import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Label;
import java.awt.TextField;
import java.awt.event.*;

public class TFMath {
	public static void main(String[] args) {
		new TFFrame().launchFrame();
	}
}
class TFFrame extends Frame{
	TextField num1,num2,num3;
	public void launchFrame() {
		num1 =new TextField(10);
		num2 =new TextField(10);
		num3 =new TextField(15);//初始化
		Label lblPlus = new Label("+");
		Button btnEqual = new Button("=");
		//btnEqual.addActionListener(new MyMonitor(this));
		btnEqual.addActionListener(new MyMonitor());
		setLayout(new FlowLayout());
		add(num1);
		add(lblPlus);
		add(num2);
		add(btnEqual);
		add(num3);
		pack();
		setVisible(true);
	}
	/*内部类:随意访问成员变量和方法,class文件带有美元符号是内部类*/
	class MyMonitor implements ActionListener{
		public void actionPerformed(ActionEvent e) {
			int n1 =Integer.parseInt(num1.getText());
			int n2 =Integer.parseInt(num2.getText());
			num3.setText(""+ (n1+n2));
		}
	}
}
/*
class MyMonitor implements ActionListener{
	/*TextField num1,num2,num3;
	public MyMonitor(TextField num1,TextField num2,TextField num3) {
		this.num1 = num1;
		this.num2 = num2;
		this.num3 = num3;
		
		
	}
	
	*//*大管家模式*/
	/*
	TFFrame tfFrame =null;//持有Frame的引用
	public MyMonitor(TFFrame tfFrame) {
		this.tfFrame = tfFrame;
	}
	public void actionPerformed(ActionEvent e) {
		int n1 =Integer.parseInt(tfFrame.num1.getText());
		int n2 =Integer.parseInt(tfFrame.num2.getText());
		
		tfFrame.num3.setText(""+ (n1+n2));
	}
}
*/
---------------------------------------------------------------------------------------------------------------------



TestPaint.java

g就是画笔,Graphics类

paint是重写Container里的方法。

paint方法什么时候会被调用?缩小或扩大窗口,也就是重画的时候。

恢复现场->Color c = g.getColor();g.setColor(c);

先调用update()->paint()。Updata()实现双缓冲。



MouseAdapter实现MouseListener接口。

为什么要这样?

因为MouseListener有6个方法,我们需要全部写。

MouseAdapter实现了MouseListener接口,只不过是空的,

我们只需要重写我们需要的MouseAdapter的某个方法。

事件发生时,他会把这个事件的信息包装成一个对象(MouseEvent e)。

Point对象,AWT类中有一个点对象,封装了x,y。

f.repaint();//对当前点的重画,对Frame强制进行重画。


TestWindowClose.java

TestWindowClose.java

package com.zhj.www;

import java.awt.Color;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class TestWindowClose {
	public static void main(String[] args) {
		new MyFrame55("MyFrame");
	}
}
class MyFrame55 extends Frame{
	public MyFrame55(String s) {
		super(s);
		/*Frame*/
		setLayout(null);
		setBounds(300,300,400,300);
		this.setBackground(new Color(204, 204, 255));
		setVisible(true);
		/*添加监听*/
		//this.addWindowListener(new MyWindowMonitor());
		
		//匿名的内部类 new 一个WindowAdapter(父类)
		this.addWindowListener(
			new WindowAdapter() {
				public void windowClosing(WindowEvent e) {
					setVisible(false);
					System.exit(-1);
				}
		});
	}
	/*//内部类
	class MyWindowMonitor extends WindowAdapter{
		public void windowClosing(WindowEvent e) {
			setVisible(false);
			System.exit(0);//0是正常退出,-1是非正常退出。
		}
	}
	*/
}



事件WindowEvent类,处理事件的接口WindowListener

匿名的内部类:但要看懂,什么时候使用匿名类?

经常修改不要使用匿名类。



package com.zhj.www;

import java.awt.Frame;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

public class TestKey {
	public static void main(String[] args) {
		new KeyFrame().launchFrame();
	}
}
class KeyFrame extends Frame{
	
	public void launchFrame() {
		setSize(200, 200);
		setLocation(300, 300);
		
		this.addKeyListener(new MyKeyMonitor());
		setVisible(true);
	}
	
	class MyKeyMonitor extends KeyAdapter{
		public void keyPressed(KeyEvent e) {
			//System.out.println("ok");
			int keyCode = e.getKeyCode();
			if(keyCode ==KeyEvent.VK_UP) {
				System.out.println("up");
			}
		}
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_39241397/article/details/79854629