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

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


package com.vitamin.UI;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import com.vitamin.*;
import com.vitamin.Console.console;
import java.awt.*;
import javax.swing.*;

public class HelloTest extends JFrame
{
    private JButton btnOK = null;
    private JLabel lbInfo = null;
    /**
     * @param args
     */
    public HelloTest()
    {
        this.btnOK = new JButton("确定");
        this.lbInfo = new JLabel();
        this.btnOK.addActionListener(new L1());
        this.btnOK.addActionListener(new L2());
        Container con = this.getContentPane();
        con.setLayout(new BorderLayout());
        con.add(this.btnOK,BorderLayout.SOUTH);
        con.add(this.lbInfo,BorderLayout.NORTH);
        console.run(this,400,400);
    }
    class L1 implements ActionListener
    {
         public void actionPerformed(ActionEvent e)
         {
             lbInfo.setText("");
         }
    }
    class L2 implements ActionListener
    {
         public void actionPerformed(ActionEvent e)
         {
             JOptionPane.showMessageDialog(HelloTest.this,"L2接收到事件");
             lbInfo.setText("Hello");
         }
    }
    public static void main(String[] args) 
    {
        // TODO Auto-generated method stub
        HelloTest ht = new HelloTest();
        

    }

}


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

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

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

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


import javax.swing.*;
import java.awt.*;
import javax.swing.event.*;
import java.awt.event.*;
import java.applet.*;
import com.vitamin.Console.*;
class BusinessLogic {
  private int modifier;
  public BusinessLogic(int mod) { modifier = mod; }
  public void setModifier(int mod) { modifier = mod; }
  public int getModifier() { return modifier; }
  // Some business operations:
  public int calculation1(int arg){ return arg * modifier;}
  public int calculation2(int arg){ return arg + modifier;}
}
public class Separation extends JApplet {
  private JTextField
    t = new JTextField(15),
    mod = new JTextField(15);
  private JButton
    calc1 = new JButton("Calculation 1"),
    calc2 = new JButton("Calculation 2");
  private BusinessLogic bl = new BusinessLogic(2);
  public static int getValue(JTextField tf) {
    try {
      return Integer.parseInt(tf.getText());
    } catch(NumberFormatException e) {
      return 0;
    }
  }
  class Calc1L implements ActionListener {
    public void actionPerformed(ActionEvent e) {
      t.setText(Integer.toString(
        bl.calculation1(getValue(t))));
    }
  }
  class Calc2L implements ActionListener {
    public void actionPerformed(ActionEvent e) {
      t.setText(Integer.toString(
        bl.calculation2(getValue(t))));
    }
  }
  // If you want something to happen whenever
  // a JTextField changes, add this listener:
  class ModL implements DocumentListener {
    public void changedUpdate(DocumentEvent e) {}
    public void insertUpdate(DocumentEvent e) {
      bl.setModifier(getValue(mod));
    }
    public void removeUpdate(DocumentEvent e) {
      bl.setModifier(getValue(mod));
    }
  }
  public void init() {
    Container cp = getContentPane();
    cp.setLayout(new FlowLayout());
    cp.add(t);
    calc1.addActionListener(new Calc1L());
    calc2.addActionListener(new Calc2L());
    JPanel p1 = new JPanel();
    p1.add(calc1);
    p1.add(calc2);
    cp.add(p1);
    mod.getDocument().addDocumentListener(new ModL());
    JPanel p2 = new JPanel();
    p2.add(new JLabel("Modifier:"));
    p2.add(mod);
    cp.add(p2);
  }
  public static void main(String[] args) {
    console.run(new Separation(), 250, 100);
  }
}



本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2006/06/08/421153.html,如需转载请自行联系原作者
目录
相关文章
|
存储 安全 Java
小白聊《JAVA编程思想》-一切都是对象(一)
小白聊《JAVA编程思想》-一切都是对象(一)
71 0
|
存储 Java 容器
小白聊《JAVA编程思想》-对象导论二
小白聊《JAVA编程思想》-对象导论二
73 0
|
存储 Java 数据安全/隐私保护
小白聊《JAVA编程思想》 对象导论一
小白聊《JAVA编程思想》 对象导论一
79 0
|
Java
Java编程思想(面向对象)第四版PDF分享
探索《Java编程思想》第四版,理解Java不仅是特性集合,更是解决问题的强大工具。本书深入设计层面,构建编程思维模型,助你逐步精通Java。[阅读更多](https://zhangfeidezhu.com/?p=355) ![Java编程思想](https://ucc.alicdn.com/pic/developer-ecology/nrw3f3oqlpmag_c8ff959a921545f1bbabcefd37f029cf.png)
133 1
Java编程思想(面向对象)第四版PDF分享
|
设计模式 安全 Java
Java编程思想重点开发必看
Java编程思想重点开发必看
75 0
|
设计模式 Java 程序员
《On Java 8》中文版,又名《Java 编程思想》中文第五版
《On Java 8》中文版,又名《Java 编程思想》中文第五版
467 0
|
设计模式 Java 程序员
感动哭了!Java界的四大名著之一:Java编程思想最新中文版已开源
还记得这本书吗?是不是已经在你的桌上铺满厚厚的一层灰了?随着 Java 8 的出现,这门语言在许多地方发生了翻天覆地的变化。最新版已经出来了,在新的版本中,代码的运用和实现上与以往不尽相同。
|
设计模式 敏捷开发 Java
全网首发!Java界的四大名著之一:Java编程思想最新中文版已开源
老版《Java编程思想》(原书名《Thinking in Java》)得益作者开放深度研讨的创作方式,受到了全世界读者的追捧,被译为了十几种语言。但遗憾的是,在经历了 4 个版本的更新后,其最后一版发布于 2007 年,之后再无更新。
|
Java 测试技术 API
读书笔记-Spring中更好的Java泛型操作API-ResolvableType
读书笔记-Spring中更好的Java泛型操作API-ResolvableType
213 0
|
存储 Java 程序员
Java的第五篇文章——面向对象的编程思想(类和对象)
Java的第五篇文章——面向对象的编程思想(类和对象)