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