天天看點

《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

             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.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 {

        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) {

  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,如需轉載請自行聯系原作者