java基础知识12-javaUI1

1:java GUI框架类型
一种是比较老的AWT框架,一种是新的Swing框架。awt(Abstract window toolkit)的消息机制是基于分层处理的,事件沿着层次结构沿着容器的上方传递。自从java1.1开始,java开始采用新的事件处理模型,采用委托事件模型。

2:委托事件处理
事件源与事件处理程序分开,其实就是建立一种事件源,监听器的模式,事件源就是产生消息的源头,指的是Button,Checkbox ,CheckboxGroup,Choice,List,TextArea,TextField,Menu等各种各样的空间。
监听器就是各种各样的接口,程序要处理相应的时间就必须实现这些接口。
事件处理的逻辑步骤,(1)事件源添加监听器(2)实现监听器的接口。

3:事件类型,监听器相关接口
事件 监听器
ActionEvent ActionListener
AdjustmentEvent AdjustmentListener
ComponentEvent ComponentListener
Containe rEvent ContainerListener
FocusEvent FocusListener
KeyEvent KeyListener
MouseEvent MouseListener
WindowEvent WindowListener
ItemEvent ItemListener
TextEvent TextListener
事件添加以及删除函数,形式都如下所示:
addActionListener(  ) //添加监听器
removeActionListener(   ) //删除监听器
每个事件监听器都有一个或者几个接口,当implements interface时必须实现所有的的监听器的接口函数,即便函数什么也不做,为了减少这种写空函数的麻烦,java为监听器中函数多于一个提供了一个适配器,适配器里面有默认的函数,需要的时候仅仅重写需要重写的函数即可,如下所示:
class MyWindowListener extends WindowAdapter {
		public void windowClosing(WindowEvent e) {
		System.exit(0);
			}
	}




4:applet 
applet是可以在HTML网页中运行的程序,它在运行的时候会有安全限制,它可以不需要main函数,一个典型的applet程序如下所示:
  
import java.awt.*;
	import java.applet.*;
	public class Applet1 extends Applet {
	public void paint(Graphics g) {
		g.drawString("First applet", 10, 10);
		}
	} 

所有public类必须继承Applet类,Applet中主要的方法有 init(),start(),paint(),stop(),destroy(),
init 在程序片被创建时候调用;start在程序片进入web浏览器后调用,是在Init之后;stop是在程序片离开浏览器中的视野时关闭响应操作;destroy是在程序片不再被需要时销毁程序片。




5:常用组件类型
(1)Button 按键
public Button();public Button(String label);
(2)TextFiled 输入框
TextField();TextField(int columns);TextField(String text);TextField(String text, int columns)
(3)TextArea 文本输入区域
TextArea();TextArea(int rows,int columns);TextArea(String text);
TextArea(String text,int rows,int columns);TextArea(String text,int rows,int columns,int scrollbars);
(4)Lable 标签
Label();Label(String text);Label(String text,int alignment)
(5)Checkbox 复选框
Checkbox();Checkbox(String label);Checkbox(String label, boolean state);
Checkbox(String label, boolean state, CheckboxGroup group);
Checkbox(String label, CheckboxGroup group, boolean state);
(6)CheckboxGroup 单选按钮
CheckboxGroup()
它把Checkbox 放在一起,如下所示:
CheckboxGroup cbg = new CheckboxGroup();
  add(new Checkbox("one", cbg, true));
  add(new Checkbox("two", cbg, false));
  add(new Checkbox("three", cbg, false));
(7)Choice 下拉列表
Choice();
点击会会出现一个下拉列表,可以向其中添加Item,如下程序所示:
Choice ColorChooser = new Choice();
  ColorChooser.add("Green");
  ColorChooser.add("Red");
  ColorChooser.add("Blue");
(8)List 列表框
List();List(int rows);List(int rows,boolean multipleMode);//是否允许多个选择,默认是单选的




6:古老的事件处理
applet中 的消息处理函数基本都是继承自 Class Component,
public boolean action(Event evt,Object what);
handleEvent();
例子如下,因为他们不是不是面向对象的,也没有switch-case语句,所以就必须调用复杂的if-else语句,并且还得返回父类的程序,例子如下:
public boolean action (Event evt, Object arg) {
	if(arg.equals("Button 1"))
		getAppletContext().showStatus("Button 1");
	else if(arg.equals("Button 2"))
		getAppletContext().showStatus("Button 2");
	// Let the base class handle it:
	else 
		return super.action(evt, arg);
return true; // We've handled it here
}

handleEvent 是单独处理一个对象的一个时间,当一些action不方便处理的事情就可以通过handleEvent来处理,因为它是原子性质的。下面的两段代码将是等价的:
public boolean action (Event evt, Object arg) {
	if(evt.target.equals(lst)) {
		t.setText("");
		String[] items = lst.getSelectedItems();
		for(int i = 0; i < items.length; i++)
		t.appendText(items[i] + "\n");
	}
	else if(evt.target.equals(b)) {
		if(count < flavors.length)
		lst.addItem(flavors[count++], 0);
	}
	else 
		return super.action(evt, arg);
	return true;
	}
}

*************************************************************************

public boolean handleEvent(Event evt) {
	if(evt.id == Event.LIST_SELECT || evt.id == Event.LIST_DESELECT) {
		if(evt.target.equals(lst)) {
			t.setText("");
			String[] items = lst.getSelectedItems();
			for(int i = 0; i < items.length; i++)
				t.appendText(items[i] +"\n");
		}
		else 
			return super.handleEvent(evt);
	} 
	else 
	// must return super.handleEvent(evt);
		return super.handleEvent(evt);
	return true;
}
public boolean action(Event evt, Object arg) {
	if(evt.target.equals(b)) {
		if(count < flavors.length)
		lst.addItem(flavors[count++], 0);
	}
	else 
		return super.action(evt, arg);
	return true;
}

并且必须强调的是handle中的最后一个必须返回super.handle(evt);因为必须把handle中不想处理的事情交给父类,要不然例子中的action将不会被执行。
7:布局
java中的布局有多个,我们可以采取各种各样的布局,是界面呈现自己想要的姿态
(1)FlowLayout:
按照顺序依次排放各个组件
(2)BorderLayout
将整个布局分为上下左右中五个部位
(3)GridLayout
将整个布局分为m×n块均匀大小
(4)CardLayout
一个平面上所有的组件重合,但是某一个时刻只有一个是被及激活的。通过下面这样的方式来改变激活重合的组件。
if (evt.target.equals(first)) {
		cl.first(cards);
	} 
	else if (evt.target.equals(second)) {
		cl.first(cards);
		cl.next(cards);
	} 
	else if (evt.target.equals(third)) {
		cl.last(cards);
	}  

8:程序片applet的限制
applet出于安全机制考虑,它不能访问本地磁盘,不能拥有菜单,对话框不被信任;




9:新的事件委托事件函数
新的事件处理机制采用事件源和监听器的模式,程序如下所示:
class B1 implements ActionListener {
	public void actionPerformed(ActionEvent e) {
		t.setText("Button 1");
	}
}

通过设置内部类来实现UI和事件处理相互分离的作用

10:applet 和 窗口程序的结合
通过在类中添加一个main函数就可以将程序变成一个既能在HTML中运行的程序片,又能在桌面中运行的程序片。
public static void main(String[] args) {
   	TextNew applet = new TextNew();
   	Frame aFrame = new Frame("TextNew");
	aFrame.addWindowListener(
			new Win dowAdapter() {
				public void windowClosing(WindowEvent e) 
				{
					System.exit(0);
				}
			});
	aFrame.add(applet, BorderLayout.CENTER);
	aFrame.setSize(300,200);
	applet.init();
	applet.start();
	aFrame.setVisible(true);
} 



你可能感兴趣的:(java,UI,applet,awt,事件委托)