5

LWUIT で、Command が持たないのに、Button が (button.addActionListener を介して) 独自の ActionListener を持つことができる理由はありますか?

特定のコマンドのリスナーを持つ唯一の方法は、フォームに ActionListener を追加し、以下のようにイベントが発生したコマンドのリスナーを確認することですか?

    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();
}
4

1 に答える 1

6

LWUIT を作成した人々がその決定を下した理由を正確に説明することはできませんが、それが理にかなっている理由はいくつかあります。

フォームに複数のコマンドが含まれている場合、それらはメニューにグループ化されます。ユーザーがメニューを展開して折りたたむたびに、最大 1 つの Command が実行されます。そのため、コマンドは概念的にボタンよりも相互にリンクされています。特に、あるフォームから別のフォームにボタンのサブクラスを再利用することは珍しくないためです。

また、LWUIT フォームの API を MIDP 仕様の LCDUI フォームと非常によく似たものにすることについても懸念があったかもしれません。

また、あなたのコードが決定の肯定的な結果を示していることも気に入っています。

コードには、既に 2 つの名前のない内部クラス (ActionListener サブクラス) があります。各 Command が独自の ActionListener を持っている場合、名前のない内部クラスを 3 つ記述したことになるでしょう。開発者はそれを頻繁に行う傾向がありますが、複数の名前のない内部クラスを含むコードのスタック トレースをもう少し調べてみると、各名前の付いたクラスに複数のクラスを含めるのは悪い習慣であることがわかります。

于 2012-07-25T20:16:21.527 に答える