2012-07-25 42 views
5

是否有任何理由爲什麼在LWUIT中一個Button可以擁有自己的ActionListener(通過button.addActionListener)而Command卻不行?爲什麼按鈕具有動作偵聽器並且命令不在LWUIT中?

爲特定命令設置偵聽器的唯一方法是向表單添加一個ActionListener,並檢查事件來自哪個Command的偵聽器,如下所示?

public void startApp() { 
    Display.init(this); 
    f = new Form("Mixed Record"); 
    exit = new Command("Exit"); 
    start = new Command("Start"); 
    Button button = new Button("Button"); 

    f.addCommand(exit); 
    f.addCommand(start); 
    f.addCommand(delete); 
    f.addComponent(button); 

    f.addCommandListener(new ActionListener() { 

     public void actionPerformed(ActionEvent ae) { 
      if (ae.getCommand().equals(exit)) { 
       //Do Exit command code 
      } else if (ae.getCommand().equals(start)) { 
       //Do Start command code 
      } 
     } 
    }); 

    button.addActionListener(new ActionListener() { 

     public void actionPerformed(ActionEvent ae) { 
      //Do button code 
     } 
    }); 

    f.show(); 
} 

回答

6

嗯,我不能準確地告訴你爲什麼編寫LWUIT的人做出了這個決定,但有幾個理由說明它的意義。

當表單包含多個命令時,它們被分組在一個菜單中。每次用戶展開然後摺疊菜單,最多執行一個Command。因此,命令在概念上比另一個更多地鏈接到按鈕,特別是因爲從一個窗體到另一個窗體重用Button子類並不罕見。

也可能有人擔心使LWUIT窗體的API看起來很像MIDP規範中的LCDUI窗體。

我也很喜歡你的代碼顯示了決策的一個積極結果:

你已經有2個無名內部類(在ActionListener的子類)在你的代碼。如果每個Command都有自己的ActionListener,那麼您可能會寫入3個未命名的內部類。即使當您花費更多時間查看包含多個未命名內部類的代碼的堆棧痕跡時,開發人員也往往會這麼做,您會意識到在每個指定類中有多個代碼是不好的做法。

+0

我明白了。它現在是有道理的..(而不是隻是討厭)。謝謝你的詳細回覆! – 2012-07-26 05:56:11

+1

Command是一個動作監聽器(你可以將它的子類化並在其actionPerformed方法中編寫代碼,因此向動作監聽器添加一個動作監聽器似乎是一種有點混淆的間接方式,這就是爲什麼我們沒有這樣做(原始合着者的LWUIT) – 2012-07-29 08:25:38

相關問題