[原创]代码范例:自定义组件和自定义事件
自定义事件: /** * @(#) ODTButtonEvent.java * * Copyright 2004 Opensource Develop Team. All rights reserved. */
// package package com.opensource.event;
// import classes import java.awt.AWTEvent;
/** * 自定义按钮事件。 * * @author ODT * @version 1.0 06/05/2004 * @see AWTEvent * @since JDK 1.3 */ public class ODTButtonEvent extends AWTEvent { public static final int ENTERED = 1; // 鼠标进入BUTTON public static final int EXITED = 2; // 鼠标退出BUTTON public static final int PRESSED = 3; // 鼠标按下 public static final int RELEASED = 4; // 鼠标释放
Object item; int buttonState;
public ODTButtonEvent(ODTButtonable source, Object item, int buttonState) { super(source, -1); this.item = item; this.buttonState = buttonState; }
public ODTButtonable getODTButtonable() { return (ODTButtonable) source; // 返回被监听的对象 }
public Object getItem() { return item; }
public int getButtonState() { return buttonState; // 返回按钮状态 }
public String paramString() { String s = null; switch (buttonState) { case ENTERED: s = "ENTERED"; break; case EXITED: s = "EXITED"; break; case PRESSED: s = "PRESSED"; break; case RELEASED: s = "RELEASED"; break; default: s = "unknown button state"; }
return super.paramString() + " [button=" + s + "]"; } }
自定义监听接口: /** * @(#) ODTButtonListener.java * * Copyright 2004 Opensource Develop Team. All rights reserved. */
// package package com.opensource.event;
// import classes import java.util.EventListener;
/** * 监听ODTButtonEvent接口 * * @author ODT * @version 1.0 06/05/2004 * @see EventListener * @since JDK 1.3 */ public interface ODTButtonListener extends EventListener { void buttonStateChanged(ODTButtonEvent event); // 触发事件 }
自定义构件注册监听器接口: /** * @(#) ODTButtonable.java * * Copyright 2004 Opensource Develop Team. All rights reserved. */
// package package com.opensource.event;
// import classes
/** * 构件实现此接口,可以扩展监听者注册感兴趣的扩展事件 * * @author ODT * @version 1.0 06/05/2004 * @since JDK 1.3 */ public interface ODTButtonable { public void addButtonListener(ODTButtonListener l); // 注册监听器 public void removeButtonListener(ODTButtonListener l); // 取消监听器 }
以上是对自定义事件机制的描述,下面是自定义组件。
自定义组件:
/** * @(#) ODTButton.java * * Copyright 2004 Opensource Develop Team. All rights reserved. */
// package package com.opensource.odt;
// import classes import java.util.*; import java.awt.*; import java.awt.event.*;
import com.opensource.event.*;
/** * 实现ItemExpandable接口的构件 * * @author ODT * @version 1.0 06/05/2004 * @see Component * @see ODTButtonable * @since JDK 1.3 */ public class ODTButton extends Component implements ODTButtonable { private int stated; private Vector listeners = new Vector();
public ODTButton() { addMouseListener(new MouseAdapter() { public void mouseEntered(MouseEvent event) { stated = ODTButtonEvent.ENTERED; entered(stated); repaint(); }
public void mousePressed(MouseEvent event) { stated = ODTButtonEvent.PRESSED; pressed(stated); repaint(); }
public void mouseExited(MouseEvent event) { stated = ODTButtonEvent.EXITED; exited(stated); repaint(); } }); }
public void entered(int stated) { ODTButtonEvent e = new ODTButtonEvent(this, this, stated); processButtonEvent(e); // 利用processButtonEvent(e)来触发事件 }
public void pressed(int stated) { ODTButtonEvent e = new ODTButtonEvent(this, this, stated); processButtonEvent(e); }
public void exited(int stated) { ODTButtonEvent e = new ODTButtonEvent(this, this, stated); processButtonEvent(e); }
public void paint(Graphics g) { drawBorder(g); drawContent(g); }
public Dimension getPreferredSize() { return new Dimension(50, 20); }
public void addButtonListener(ODTButtonListener l) { listeners.addElement(l); }
public void removeButtonListener(ODTButtonListener l) { listeners.removeElement(l); } public synchronized void processButtonEvent(ODTButtonEvent event) { Enumeration e = listeners.elements(); while (e.hasMoreElements()) { ODTButtonListener l = (ODTButtonListener) e.nextElement(); l.buttonStateChanged(event); // 触发事件 } }
// 按钮边框 public void drawBorder(Graphics g) { Dimension size = getSize(); g.setColor(new Color(174, 23, 145)); g.drawRoundRect(0, 0, size.width-1, size.height-1, 5, 5); } // 改变按钮颜色 public void drawContent(Graphics g) { Dimension size = getSize(); if (stated == ODTButtonEvent.ENTERED) { g.setColor(new Color(248, 199, 238)); } else g.setColor(new Color(236, 111, 210));
g.fillRoundRect(1, 1, size.width-2, size.height-2, 5, 5); } }
测试自定义组件和事件:
/** * @(#) ODTButtonTest.java * * Copyright 2004 Opensource Develop Team. All rights reserved. */
// package package com.opensource.odt;
// import classes import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*;
import com.opensource.event.*;
/** * 测试自定义组件和事件代码范例 * * @author ODT * @version 1.0 06/05/2004 * @see JFrame * @see ODTButtonListener * @since JDK 1.3 */ public class ODTButtonTest extends JFrame implements ODTButtonListener { public ODTButtonTest() { ODTButton button = new ODTButton(); button.addButtonListener(this); // 注册监听器 getContentPane().setLayout(new FlowLayout()); getContentPane().add(button); getContentPane().setBackground(Color.WHITE); setSize(400, 500); setVisible(true); } // 所触发的事件 public void buttonStateChanged(ODTButtonEvent event) { ODTButtonable ie = event.getODTButtonable(); System.out.println(event.paramString()); }
public static void main(String[] args) { new ODTButtonTest(); } }

|