《Java编程思想》读书笔记(11)


Swing的事件模型的优点就在于它的灵活性。你可以调用方法给组件添加或删除事件。今天再看这一节时,想到了一个以前没想过的小问题,如果一个按钮先后注册了两个监听者Listerner1, Listerner2,那么在单击按钮时,事件处理的顺序到底是如何的哪?真的是我以前一直以为的两者构成了一个监听者链表,Listerner2接在Listerner1后面吗?那就是说Listerner1会先处理接收的事件哪?真的是这样吗?


packagecom.vitamin.UI;
importjava.awt.BorderLayout;
importjava.awt.Container;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;

importcom.vitamin.*;
importcom.vitamin.Console.console;
importjava.awt.*;
importjavax.swing.*;

publicclassHelloTestextendsJFrame
{
privateJButtonbtnOK=null;
privateJLabellbInfo=null;
/**
*
@paramargs
*/

publicHelloTest()
{
this.btnOK=newJButton("确定");
this.lbInfo=newJLabel();
this.btnOK.addActionListener(newL1());
this.btnOK.addActionListener(newL2());
Containercon
=this.getContentPane();
con.setLayout(
newBorderLayout());
con.add(
this.btnOK,BorderLayout.SOUTH);
con.add(
this.lbInfo,BorderLayout.NORTH);
console.run(
this,400,400);
}

classL1implementsActionListener
{
publicvoidactionPerformed(ActionEvente)
{
lbInfo.setText(
"");
}

}

classL2implementsActionListener
{
publicvoidactionPerformed(ActionEvente)
{
JOptionPane.showMessageDialog(HelloTest.
this,"L2接收到事件");
lbInfo.setText(
"Hello");
}

}

publicstaticvoidmain(String[]args)
{
//TODOAuto-generatedmethodstub
HelloTestht=newHelloTest();


}


}


运行后居然发现” L2接收到事件先发生了,因为lbInfoText是空的。汗。。。

将业务逻辑(business logic)与用户界面分离开来

一般情况下,设计类的时候总是强调一个类"只作一件事情"。涉及用户界面的时候更是如此,因为你很可能会把"要作什么"同"要怎样显示"给混在一起了。这种耦合严重妨碍了代码的复用。比较好的做法是将"业务逻辑(business login)"同GUI分离开来。这样不仅方便了业务逻辑代码的复用,也简化了GUI的复用。

还有一种情况,就是多层系统(multitiered systems),也就是说”业务对象(business object)"完全贮存在另一台机器上。业务规则的集中管理能使规则的更新立即对新交易生效,因此这是这类系统所追求的目标。但是很多应用程序都会用到这些业务对象,所以它们绝不能同特定的显示模式连在一起。它们应该只做业务处理,别的什么都不管.

importjavax.swing.*;
importjava.awt.*;
importjavax.swing.event.*;
importjava.awt.event.*;
importjava.applet.*;
importcom.vitamin.Console.*;
classBusinessLogic{
privateintmodifier;
publicBusinessLogic(intmod){modifier=mod;}
publicvoidsetModifier(intmod){modifier=mod;}
publicintgetModifier(){returnmodifier;}
//Somebusinessoperations:
publicintcalculation1(intarg){returnarg*modifier;}
publicintcalculation2(intarg){returnarg+modifier;}
}

publicclassSeparationextendsJApplet{
privateJTextField
t
=newJTextField(15),
mod
=newJTextField(15);
privateJButton
calc1
=newJButton("Calculation1"),
calc2
=newJButton("Calculation2");
privateBusinessLogicbl=newBusinessLogic(2);
publicstaticintgetValue(JTextFieldtf){
try{
returnInteger.parseInt(tf.getText());
}
catch(NumberFormatExceptione){
return0;
}

}

classCalc1LimplementsActionListener{
publicvoidactionPerformed(ActionEvente){
t.setText(Integer.toString(
bl.calculation1(getValue(t))));
}

}

classCalc2LimplementsActionListener{
publicvoidactionPerformed(ActionEvente){
t.setText(Integer.toString(
bl.calculation2(getValue(t))));
}

}

//Ifyouwantsomethingtohappenwhenever
//aJTextFieldchanges,addthislistener:
classModLimplementsDocumentListener{
publicvoidchangedUpdate(DocumentEvente){}
publicvoidinsertUpdate(DocumentEvente){
bl.setModifier(getValue(mod));
}

publicvoidremoveUpdate(DocumentEvente){
bl.setModifier(getValue(mod));
}

}

publicvoidinit(){
Containercp
=getContentPane();
cp.setLayout(
newFlowLayout());
cp.add(t);
calc1.addActionListener(
newCalc1L());
calc2.addActionListener(
newCalc2L());
JPanelp1
=newJPanel();
p1.add(calc1);
p1.add(calc2);
cp.add(p1);
mod.getDocument().addDocumentListener(
newModL());
JPanelp2
=newJPanel();
p2.add(
newJLabel("Modifier:"));
p2.add(mod);
cp.add(p2);
}

publicstaticvoidmain(String[]args){
console.run(
newSeparation(),250,100);
}

}
优质内容筛选与推荐>>
1、【C语言】 任意十进制数字转十六进制
2、在Windows上通过Xshell将文件上传到Linux上
3、用JS获取客户端IP的方法
4、设计一个卖不同种类车的4s店
5、用C#创建XML


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号