一般要求 首先,您必須有一個(gè)不帶有參數的公用構造器。此構造器也應該通過(guò)調用各個(gè)特性的設置方法來(lái)設置特性的缺省值,例如:
public Fireworks() { setAutoStart(true); setBackground(Color.black); setSpeed(10); setRadius(40); . . . }
如果 bean 是一個(gè)從 java.awt.Component 類(lèi)繼承而來(lái)的可視 bean,您就應該為 bean 定義一個(gè)缺省的首選大小,例如:
public Dimension getPreferredSize() { return (new Dimension(radius*3, radius*3)); }
public Dimension getMinimumSize() { return getPreferredSize(); }
特性 對于您需要的每個(gè)特性,您應該有一個(gè)帶有匹配公用 getter 和 setter 方法的專(zhuān)用實(shí)例變量,例如:
private int speed; . . . public int getSpeed() { return speed; }
public void setSpeed(int s) { speed = s; }
此 get 和 set 方法必須有與實(shí)例變量相同的名稱(chēng),但是第一個(gè)字母要大寫(xiě)并以 get 和 set 開(kāi)頭。
由于連接而在任何時(shí)候更改它們的特性時(shí),確認 Bean 在運行時(shí)行為正確也是很重要的。如果特性的更改影響到 Bean 的可視外觀(guān),您應該以此特性設置的方法來(lái)調用
repaint();。
同樣,如果特性的更改影響到 bean 的大小和位置,您需要確認獲得驗證的事物。我們建議編寫(xiě)您自己的 validateAll 方法,如下所示:
private void validateAll() { if (isValid()) { Component self = this; self.invalidate(); Component myParent = self.getParent(); if (myParent != null) { myParent.invalidate(); self = myParent; } self.validate(); } }
然后以此特性設置的方法調用
validateAll();。
bean 類(lèi)將無(wú)法進(jìn)行關(guān)于調用特性設置方法命令的假設。您應該寫(xiě) bean 以便可以初始構造它,然后在不引起錯誤的同時(shí)在任何命令中設置其特性。
操作 對于每個(gè)您需要的操作,您應該有一個(gè)公用方法,例如:
public void start() { if(thread==null) { thread=new Thread(this); thread.start(); } }
您為操作寫(xiě)的方法應該在無(wú)須期待用戶(hù)創(chuàng )建連接或設置很多特性的情況下獨立操作。 例如,如果您寫(xiě)了一個(gè)音頻 Bean,您希望通過(guò)播放操作處理打開(kāi)聲音的所有步驟、完成您需要的所有設置并播放聲音。同樣,即使聲音未播放,停止操作也應起作用。
事件 對于您需要的每個(gè)事件或事件設置,您應該定義事件和偵聽(tīng)器類(lèi)。對于此例,查看 FireworksEvent.java 源文件以及 Fireworks.java 文件。此事件類(lèi)的源應該如同這樣:
import java.awt.*; import java.util.*;
public class FireworksEvent extends EventObject { public static final int EXPLODED = 1;
int id = 0;
public FireworksEvent(Component source, int id) { super(source); this.id = id; }
public int getID() { return id; } }
您應該為此事件設置中的每個(gè)事件定義一個(gè)公用靜態(tài)結束事件標識符,例如在此例子中的 EXPLODED。
對于偵聽(tīng)器類(lèi)的源,查看 FireworksListener.java 源文件:
import java.util.*;
public interface FireworksListener extends EventListener { public abstract void exploded(FireworksEvent e); }
您應該為此事件設置中的每個(gè)事件定義一個(gè)公用抽象方法,例如在此例子中的 exploded。 而且,偵聽(tīng)器類(lèi)必須擴展 EventListener ,以使 JAR 向導能夠找到它。
然后,如果由 bean 類(lèi)播送事件,它必須跟蹤偵聽(tīng)事件的對象。要這樣做,您需要定義偵聽(tīng)器實(shí)例變量以及 addListener 和 removeListener 方法。返回 Fireworks.java 源,例如,您將查看到:
private Vector listeners = new Vector(); . . . public void addFireworksListener(FireworksListener f) { listeners.addElement(f); }
public void removeFireworksListener(FireworksListener f) { listeners.removeElement(f); }
最后,bean 類(lèi)需要以正確的次數將事件實(shí)際播送到所有的偵聽(tīng)器。要這樣做,您需要定義 processEvent 方法并以適當的次數調用它,例如:
public void processFireworksEvent(FireworksEvent e) { for (Enumeration enum = listeners.elements(); enum.hasMoreElements(); ) ((FireworksListener)enum.nextElement()).exploded(e); }
public void run() { . . . processFireworksEvent(new FireworksEvent(this, FireworksEvent.EXPLODED)); }
| |