分享
 
 
 

通过Java Swing看透MVC设计模(二)

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

ButtonModel类

ButtonModel维护着三种类型的状态信息:是否被按下(pressed),是否“武装上了”(armed),是否被选择(selected)。它们都是boolean类型的值。

一个按钮被按下(pressed)是指当鼠标在按钮上面的时候,按下鼠标但是还没有松开鼠标按钮的状态,及时用户此时把鼠标拖拽到按钮的外面也没有改变这种状态。

一个按钮是否“武装了”(armed)是指按钮被按下,并且鼠标还在按钮的上面。

一些按钮还可能被选择(selected),这种状态通过重复的点击按钮取得true或者false的值。

下面的代码是状态pressed的一个缺省的实现。状态armed以及selected实现的代码与之类似。ButtonModel类应该被继承,这样可以覆盖缺省的状态定义,实现有个性的按钮。

private boolean boolPressed = false;

public boolean isPressed()

{

return boolPressed;

}

public void setPressed(boolean boolPressed)

{

this.boolPressed = boolPressed;

fireChangeEvent(new ChangeEvent(button));

}

按钮的模型button model还负责通知其他对象(事件监听器)它们所感兴趣的事件。从下面的代买中我们可以看出当按钮的转台发生改变的时候就会发出一个ChangeEvent。下面就是代码:

private Vector vectorChangeListeners = new Vector();

public void addChangeListener(ChangeListener changelistener)

{

vectorChangeListeners.addElement(changelistener);

}

public void removeChangeListener(ChangeListener changelistener)

{

vectorChangeListeners.removeElement(changelistener);

}

protected void fireChangeEvent(ChangeEvent changeevent)

{

Enumeration enumeration = vectorChangeListeners.elements();

while (enumeration.hasMoreElements())

{

ChangeListener changelistener =(ChangeListener)enumeration.nextElement();

changelistener.stateChanged(changeevent);

}

}

在进入下一节之前,你应该多花一些时间来仔细阅读一下ButtonModel类的源代码。

ButtonUI类

按钮的view/controller是负责构建表示层的。缺省情况下它仅仅是用背景色画一个矩形而已,他们的子类继承了他们并且覆盖了绘制的方法,使得按钮可以有许多不同的表现,例如MOTIF,Windows 95,Java样式等等。

public void update(Button button, Graphics graphics)

{

}

public void paint(Button button, Graphics graphics)

{

Dimension dimension = button.getSize();

Color color = button.getBackground();

graphics.setColor(color);

graphics.fillRect(0, 0, dimension.width, dimension.height);

}

ButtonUI类并不自己处理AWT事件,他们会使用一个定制的事件监听器把低级的AWT事件翻译为高级的Button模型期望的语义事件。下面就是安装/卸载事件监听器的代码。

private static ButtonUIListener buttonuilistener = null;

public void installUI(Button button)

{

button.addMouseListener(buttonuilistener);

button.addMouseMotionListener(buttonuilistener);

button.addChangeListener(buttonuilistener);

}

public void uninstallUI(Button button)

{

button.removeMouseListener(buttonuilistener);

button.removeMouseMotionListener(buttonuilistener);

button.removeChangeListener(buttonuilistener);

}

View/Controller实际上就是一些方法。他们不维护任何自己的状态信息。因此,许多按钮的实例可以共享一个ButtonUI实例。ButtonUI是通过在方面的参数列表里面加上按钮的引用来区分各个不同的按钮。

同样,希望你能多花一些时间来看看ButtonUI类,然后咱们进入下一节。

ButtonUIListener类

ButtonUIListener类可以帮助Button类去转变鼠标或者键盘的输入为对按钮模型的操作。这个监听器类实现了:MouseListener,MouseMotionListener,ChangeListener接口,并且处理一下事件:

public void mouseDragged(MouseEvent mouseevent)

{

Button button = (Button)mouseevent.getSource();

ButtonModel buttonmodel = button.getModel();

if (buttonmodel.isPressed())

{

if (button.getUI().contains(button, mouseevent.getPoint()))

{

buttonmodel.setArmed(true);

}

else

{

buttonmodel.setArmed(false);

}

}

}

public void mousePressed(MouseEvent mouseevent)

{

Button button = (Button)mouseevent.getSource();

ButtonModel buttonmodel = button.getModel();

buttonmodel.setPressed(true);

buttonmodel.setArmed(true);

}

public void mouseReleased(MouseEvent mouseevent)

{

Button button = (Button)mouseevent.getSource();

ButtonModel buttonmodel = button.getModel();

buttonmodel.setPressed(false);

buttonmodel.setArmed(false);

}

public void stateChanged(ChangeEvent changeevent)

{

Button button = (Button)changeevent.getSource();

button.repaint();

}

总结

我希望你能按照上面讲述的方法去做。如果不能,那么所有的努力都将白费。这个例子以及Swing用户界面组件的好处在于你不用去花时间去弄明白他们底层是如何设计实现的就可以很方便的使用他们了。他们都提供了缺省的model以及view/controller,然后,当你自己做组件的时候,你会发现上面的思想的强大之处。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有