一个更巨大的Bean
接下的措施例子稍微巨大一些,尽量这没有什么代价。这个措施是一张岂论鼠标何时移动都环绕它画一个小圆的,而且一个行动吸收器被激活。画布。当按下鼠标键时,我们可以改变的属性是圆的巨细,除此之外尚有被显示文字的色彩,巨细,内容。BangBean同样拥有它本身的addActionListener()和removeActionListener()要领,因此我们可以附上本身的当用户单击在BangBean上时会被激活的吸收器。这样,我们将可以或许确承认支持的属性和事件:
//: BangBean.java
// A graphical Bean
package bangbean;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
public class BangBean extends Canvas
implements Serializable {
protected int xm, ym;
protected int cSize = 20; // Circle size
protected String text = "Bang!";
protected int fontSize = 48;
protected Color tColor = Color.red;
protected ActionListener actionListener;
public BangBean() {
addMouseListener(new ML());
addMouseMotionListener(new MML());
}
public int getCircleSize() { return cSize; }
public void setCircleSize(int newSize) {
cSize = newSize;
}
public String getBangText() { return text; }
public void setBangText(String newText) {
text = newText;
}
public int getFontSize() { return fontSize; }
public void setFontSize(int newSize) {
fontSize = newSize;
}
public Color getTextColor() { return tColor; }
public void setTextColor(Color newColor) {
tColor = newColor;
}
public void paint(Graphics g) {
g.setColor(Color.black);
g.drawOval(xm – cSize/2, ym – cSize/2,
cSize, cSize);
}
// This is a unicast listener, which is
// the simplest form of listener management:
public void addActionListener (
ActionListener l)
throws TooManyListenersException {
if(actionListener != null)
throw new TooManyListenersException();
actionListener = l;
}
public void removeActionListener(
ActionListener l) {
actionListener = null;
}
class ML extends MouseAdapter {
public void mousePressed(MouseEvent e) {
Graphics g = getGraphics();
g.setColor(tColor);
g.setFont(
new Font(
"TimesRoman", Font.BOLD, fontSize));
int width =
g.getFontMetrics().stringWidth(text);
g.drawString(text,
(getSize().width – width) /2,
getSize().height/2);
g.dispose();
// Call the listener’s method:
if(actionListener != null)
actionListener.actionPerformed(
new ActionEvent(BangBean.this,
ActionEvent.ACTION_PERFORMED, null));
}
}
class MML extends MouseMotionAdapter {
public void mouseMoved(MouseEvent e) {
xm = e.getX();
ym = e.getY();
repaint();
}
}
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
// Testing the BangBean:
public static void main(String[] args) {
BangBean bb = new BangBean();
try {
bb.addActionListener(new BBL());
} catch(TooManyListenersException e) {}
Frame aFrame = new Frame("BangBean Test");
aFrame.addWindowListener(
new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
aFrame.add(bb, BorderLayout.CENTER);
aFrame.setSize(300,300);
aFrame.setVisible(true);
}
// During testing, send action information
// to the console:
static class BBL implements ActionListener {
public void actionPerformed(ActionEvent e) {
System.out.println("BangBean action");
}
}
} ///:~
#p#分页标题#e#
最重要的是我们会留意到BangBean执行了这种串联化的接口。这意味着应用措施构建东西可以在措施设计者调解完属性值后操作串联为BangBean贮藏所有的信息。当Bean作为运行的应用措施的一部门被建设时,那些被贮藏的属性被从头规复,因此我们可以正确地获得我们的设计。
我们能看到凡是同Bean一起运行的所有的字段都是专用的——答允只能通过要领来会见,凡是操作“属性”布局。
当我们凝望着addActionListener()的签名时,我们会留意到它可以发生出一个TooManyListenerException(太多吸收器异常)。这个异常指明它是一个单一的范例的,意味着当事件产生时,它只能通知一个吸收器。一般环境下,我们会利用具有多种范例的事件,以便一个事件通知多个的吸收器。可是,那样会陷入直到下一章我们才气筹备好的了局中,因此这些内容会被从头回首(下一个标题是“Java Beans 的从头回首”)。单一范例的事件回避了这个困难。
当我们按下鼠标键时,文字被安入BangBean中间,而且假如行动吸收器字段存在,它的actionPerformed()要领就被挪用,建设一个新的ActionEvent工具在处理惩罚进程中。无论何时鼠标移动,它的新座标将被捕获,而且画布会被重画(像我们所看到的抹去一些画布上的文字)。
main()要领增加了答允我们从呼吁行中测试措施的成果。当一个Bean在一个开拓情况中,main()要领不会被利用,但拥有它是绝对有益的,因为它提供了快捷的测试本领。无论何时一个ActionEvent产生,main()要领都将建设了一个帧并安放了一个BangBean在它内里,还在BangBean中附上了一个简朴的行动吸收器以打印到节制台。虽然,一般来说应用措施构建东西将建设大大都的Bean的代码。当我们通过BeanDumper可能安顿BangBean到一个可激活Bean的开拓情况中去运行BangBean时,我们会留意到会有许多特另外属性和行动明明高出了上面的代码。那是因为BangBean从画布中担任,而且画布就是一个Bean,因此我们看到它的属性和事件同样的符合。