[原创]代码范例:自定义组件和自定义事件

原创 2004年09月01日 19:10:00

[原创]代码范例:自定义组件和自定义事件

自定义事件:
/**
 * @(#) 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();
     }
}

flex自定义组件和自定义事件

看了一个帖子,自己写了一下。主要讲了自定义组件跟自定义事件。 先看一下自定义事件。就跟在殿堂之路中写道一样。代码如生活,理解代码就如理解生活一样一样的。 什么是事件,事件是怎么运作的呢?我是这样理解...
  • u013258319
  • u013258319
  • 2013年12月24日 15:58
  • 449

Flex自定义组件与自定义事件

1、自定义组件2、自定义事件3、结合使用 一、自定义组件(使用的是Flex组件,ActionScript组件相对麻烦点,可视化差点)该组件由一个TextArea和两个Button组成,如图: 代码:M...
  • dengxingbo
  • dengxingbo
  • 2009年12月14日 16:50
  • 3278

flex自定义组件与自定义事件

今天研究了一下flex自定义控件与事件,成功!过程详细如下: 1,首先新建一个mxml组件文件,各个参数自己填写。 ...
  • Double_XX
  • Double_XX
  • 2013年09月25日 17:14
  • 997

Flex自定义组件与自定义事件

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/dengxingbo/archive/2009/12/14/5005154.aspx 1、自定义组件2、自定义事件3、结...
  • mine_1
  • mine_1
  • 2011年05月25日 13:17
  • 918

Vue.js 组件中的v-on绑定自定义事件理解

每个 Vue 实例都实现了事件接口(Events interface),即:使用 $on(eventName) 监听事件使用 $emit(eventName) 触发事件Vue的事件系统分离自浏览器的E...
  • hayre
  • hayre
  • 2017年03月06日 11:00
  • 17488

【微信小程序】自定义组件

手把手教你实现微信小程序中的自定义组件微信小程序中的组件前言之前做小程序开发的时候,对于开发来说比较头疼的莫过于自定义组件了,当时官方对这方面的文档也只是寥寥几句,一笔带过而已,所以写起来真的是非常非...
  • i10630226
  • i10630226
  • 2017年12月17日 20:52
  • 2891

浅谈 Vue v-model指令的实现原理 - 如何利用v-model设计自定义的表单组件

vue的v-model是一个十分强大的指令,它可以自动让原生表单组件的值自动和你选择的值绑定. 我们如何利用 v-model实现自定义的表单组件呢?...
  • yangbingbinga
  • yangbingbinga
  • 2017年03月13日 11:00
  • 21186

javascript自定义事件应用实例

js自定义事件 实现观察者模式,模块之间完全通过事件协作和传递信息。写了一个典型的观察者应用和一个游戏的框架代码,来演示自定义事件的使用...
  • ruangong1203
  • ruangong1203
  • 2016年09月08日 19:45
  • 2714

浅谈JavaScript模拟事件和自定义事件

1、DOM中的事件模拟 1) DOM中的事件模拟有以下3个步骤: 步骤1:创建事件对象event 可以在document对象上使用createEvent()方法创建event对象,此方法接收一个参数,...
  • zhouziyu2011
  • zhouziyu2011
  • 2017年03月24日 23:02
  • 1378

自定义事件(观察者模式)

观察者模式由两类对象组成:主体和观察者。主体负责发布事件,同时观察者通过订阅这些事件来观察该主体。该模式的一个关键概念是主体并不知道观察者的任何事情,也就是说它可以独自存在并正常运作即使观察者不存在。...
  • chanda_yang
  • chanda_yang
  • 2016年08月04日 19:43
  • 518
收藏助手
不良信息举报
您举报文章:[原创]代码范例:自定义组件和自定义事件
举报原因:
原因补充:

(最多只允许输入30个字)