《Java编程思想》读书笔记(11)
Swing的事件模型的优点就在于它的灵活性。你可以调用方法给组件添加或删除事件。今天再看这一节时,想到了一个以前没想过的小问题,如果一个按钮先后注册了两个监听者Listerner1, Listerner2,那么在单击按钮时,事件处理的顺序到底是如何的哪?真的是我以前一直以为的两者构成了一个监听者链表,Listerner2接在Listerner1后面吗?那就是说Listerner1会先处理接收的事件哪?真的是这样吗?
 package com.vitamin.UI;
package com.vitamin.UI; import java.awt.BorderLayout;
import java.awt.BorderLayout; import java.awt.Container;
import java.awt.Container; import java.awt.event.ActionEvent;
import java.awt.event.ActionEvent; import java.awt.event.ActionListener;
import java.awt.event.ActionListener;
 import com.vitamin.*;
import com.vitamin.*; import com.vitamin.Console.console;
import com.vitamin.Console.console; import java.awt.*;
import java.awt.*; import javax.swing.*;
import javax.swing.*;
 public class HelloTest extends JFrame
public class HelloTest extends JFrame {
{ private JButton btnOK = null;
    private JButton btnOK = null; private JLabel lbInfo = null;
    private JLabel lbInfo = null; /**
    /** * @param args
     * @param args */
     */ public HelloTest()
    public HelloTest() {
    { this.btnOK = new JButton("确定");
        this.btnOK = new JButton("确定"); this.lbInfo = new JLabel();
        this.lbInfo = new JLabel(); this.btnOK.addActionListener(new L1());
        this.btnOK.addActionListener(new L1()); this.btnOK.addActionListener(new L2());
        this.btnOK.addActionListener(new L2()); Container con = this.getContentPane();
        Container con = this.getContentPane(); con.setLayout(new BorderLayout());
        con.setLayout(new BorderLayout()); con.add(this.btnOK,BorderLayout.SOUTH);
        con.add(this.btnOK,BorderLayout.SOUTH); con.add(this.lbInfo,BorderLayout.NORTH);
        con.add(this.lbInfo,BorderLayout.NORTH); console.run(this,400,400);
        console.run(this,400,400); }
    } class L1 implements ActionListener
    class L1 implements ActionListener {
    { public void actionPerformed(ActionEvent e)
         public void actionPerformed(ActionEvent e) {
         { lbInfo.setText("");
             lbInfo.setText(""); }
         } }
    } class L2 implements ActionListener
    class L2 implements ActionListener {
    { public void actionPerformed(ActionEvent e)
         public void actionPerformed(ActionEvent e) {
         { JOptionPane.showMessageDialog(HelloTest.this,"L2接收到事件");
             JOptionPane.showMessageDialog(HelloTest.this,"L2接收到事件"); lbInfo.setText("Hello");
             lbInfo.setText("Hello"); }
         } }
    } public static void main(String[] args)
    public static void main(String[] args)  {
    { // TODO Auto-generated method stub
        // TODO Auto-generated method stub HelloTest ht = new HelloTest();
        HelloTest ht = new HelloTest(); 
        
 }
    }
 }
}
运行后居然发现” L2接收到事件”先发生了,因为lbInfo的Text是空的。汗。。。
将业务逻辑(business logic)与用户界面分离开来
一般情况下,设计类的时候总是强调一个类"只作一件事情"。涉及用户界面的时候更是如此,因为你很可能会把"要作什么"同"要怎样显示"给混在一起了。这种耦合严重妨碍了代码的复用。比较好的做法是将"业务逻辑(business login)"同GUI分离开来。这样不仅方便了业务逻辑代码的复用,也简化了GUI的复用。
还有一种情况,就是多层系统(multitiered systems),也就是说”业务对象(business object)"完全贮存在另一台机器上。业务规则的集中管理能使规则的更新立即对新交易生效,因此这是这类系统所追求的目标。但是很多应用程序都会用到这些业务对象,所以它们绝不能同特定的显示模式连在一起。它们应该只做业务处理,别的什么都不管.
 import javax.swing.*;
import javax.swing.*; import java.awt.*;
import java.awt.*; import javax.swing.event.*;
import javax.swing.event.*; import java.awt.event.*;
import java.awt.event.*; import java.applet.*;
import java.applet.*; import com.vitamin.Console.*;
import com.vitamin.Console.*; class BusinessLogic {
class BusinessLogic { private int modifier;
  private int modifier; public BusinessLogic(int mod) { modifier = mod; }
  public BusinessLogic(int mod) { modifier = mod; } public void setModifier(int mod) { modifier = mod; }
  public void setModifier(int mod) { modifier = mod; } public int getModifier() { return modifier; }
  public int getModifier() { return modifier; } // Some business operations:
  // Some business operations: public int calculation1(int arg){ return arg * modifier;}
  public int calculation1(int arg){ return arg * modifier;} public int calculation2(int arg){ return arg + modifier;}
  public int calculation2(int arg){ return arg + modifier;} }
} public class Separation extends JApplet {
public class Separation extends JApplet { private JTextField
  private JTextField t = new JTextField(15),
    t = new JTextField(15), mod = new JTextField(15);
    mod = new JTextField(15); private JButton
  private JButton calc1 = new JButton("Calculation 1"),
    calc1 = new JButton("Calculation 1"), calc2 = new JButton("Calculation 2");
    calc2 = new JButton("Calculation 2"); private BusinessLogic bl = new BusinessLogic(2);
  private BusinessLogic bl = new BusinessLogic(2); public static int getValue(JTextField tf) {
  public static int getValue(JTextField tf) { try {
    try { return Integer.parseInt(tf.getText());
      return Integer.parseInt(tf.getText()); } catch(NumberFormatException e) {
    } catch(NumberFormatException e) { return 0;
      return 0; }
    } }
  } class Calc1L implements ActionListener {
  class Calc1L implements ActionListener { public void actionPerformed(ActionEvent e) {
    public void actionPerformed(ActionEvent e) { t.setText(Integer.toString(
      t.setText(Integer.toString( bl.calculation1(getValue(t))));
        bl.calculation1(getValue(t)))); }
    } }
  } class Calc2L implements ActionListener {
  class Calc2L implements ActionListener { public void actionPerformed(ActionEvent e) {
    public void actionPerformed(ActionEvent e) { t.setText(Integer.toString(
      t.setText(Integer.toString( bl.calculation2(getValue(t))));
        bl.calculation2(getValue(t)))); }
    } }
  } // If you want something to happen whenever
  // If you want something to happen whenever // a JTextField changes, add this listener:
  // a JTextField changes, add this listener: class ModL implements DocumentListener {
  class ModL implements DocumentListener { public void changedUpdate(DocumentEvent e) {}
    public void changedUpdate(DocumentEvent e) {} public void insertUpdate(DocumentEvent e) {
    public void insertUpdate(DocumentEvent e) { bl.setModifier(getValue(mod));
      bl.setModifier(getValue(mod)); }
    } public void removeUpdate(DocumentEvent e) {
    public void removeUpdate(DocumentEvent e) { bl.setModifier(getValue(mod));
      bl.setModifier(getValue(mod)); }
    } }
  } public void init() {
  public void init() { Container cp = getContentPane();
    Container cp = getContentPane(); cp.setLayout(new FlowLayout());
    cp.setLayout(new FlowLayout()); cp.add(t);
    cp.add(t); calc1.addActionListener(new Calc1L());
    calc1.addActionListener(new Calc1L()); calc2.addActionListener(new Calc2L());
    calc2.addActionListener(new Calc2L()); JPanel p1 = new JPanel();
    JPanel p1 = new JPanel(); p1.add(calc1);
    p1.add(calc1); p1.add(calc2);
    p1.add(calc2); cp.add(p1);
    cp.add(p1); mod.getDocument().addDocumentListener(new ModL());
    mod.getDocument().addDocumentListener(new ModL()); JPanel p2 = new JPanel();
    JPanel p2 = new JPanel(); p2.add(new JLabel("Modifier:"));
    p2.add(new JLabel("Modifier:")); p2.add(mod);
    p2.add(mod); cp.add(p2);
    cp.add(p2); }
  } public static void main(String[] args) {
  public static void main(String[] args) { console.run(new Separation(), 250, 100);
    console.run(new Separation(), 250, 100); }
  } }
}作者:洞庭散人
出处:http://phinecos.cnblogs.com/
posted on 2006-06-08 23:54 Phinecos(洞庭散人) 阅读(451) 评论(0) 收藏 举报
 
                    
                

 
     
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号