質問

わかりました、だから私が追加した場合 ActionListener GUI要素に、そしてそれがです それだけ 要素私はそれを使用します ActionListener で、チェックボックスを選択した状態を取得するために使用する次の行(a、b)のどれが重要ですか?

final JCheckBox checkbox = (JCheckBox)this.buildResult.get("cbDebugTick");
checkbox.addActionListener(new ActionListener() {
    @Override public void actionPerformed(ActionEvent event){               
            boolean bChecked =
            // (a) checkbox.isSelected();
            // (b) ((JCheckBox)event.getSource()).isSelected();
            model.setPrintDebugOn(bChecked);
        }
});

私が追加すると私には理にかなっています ActionListener 複数のGUI要素にオブジェクトし、(b)を使用する必要があります。

(b)では、盲目的にキャストしても大丈夫ですか event.getSource()JCheckBox, 、私はアクションリスナーを追加した人なので、または守備的にプログラムして、 instanceof 小切手?

ノート: この質問は、一般的なイベントリスナーの文脈にあります。 kdgregoryには、特にreのいくつかの良い点があります。チェックボックスを考慮していないチェックボックス。

役に立ちましたか?

解決

(b)では、厳密であるためには、実際にチェックを行う必要がありますが、それほど重要ではありません。 (b)は「より良いコード」になるでしょうが、これらの行は両方とも問題あり、受け入れられると思います。

ただし、通常、アクションリスナーで行われることは、チェックボックスにカスタマイズされた別のメソッドを呼び出すだけです。だからそれは次のように見えるでしょう:

 @Override public void actionPerformed(ActionEvent event) {                                  
    //your treatment would be in this method, where it would be acceptable to use (a)                  
    onCheckBoxActionPerformed(event)
}

他のヒント

私はどちらもしません。

チェックボックスをクリックすると、アクションが開始される場合は、 ItemListener, 、次に、の選択状態を見てください ItemEvent.

ただし、チェックボックスは通常、アクションを呼び出すものではなく、状態を管理します。したがって、より良いアプローチは、アクションをキックオフするものに応じて、すべてのチェックボックスを調べることです。


編集:OPが提起したより大きな問題についてのいくつかの解説。

まず、スイングの大部分が一貫した動作モデルではなく、実装の利便性を表していることを認識することが重要です。 jcheckboxjbutton スペース内をクリックすることは意味のあるという事実以外に共通点はありません。しかし、彼らは両方から継承します アブストラクトボタン, 、ボタンのラベルなどの実装の詳細を提供します。また、ボタンが「押されている」こと、そしてボタンを押すと意味のある動作(アクション)が開始されると想定しています。ただし、JCheckboxの場合、ボタンプレスは重要ではなく、状態の変更は重要です。その状態の変更は、ItemListenerに合図されます。これは、状態の変更が他のボタンタイプに対して無意味であるにもかかわらず、AbstractButtonでも定義されています(Javadocは「チェックボックス」とも言います)。

スイングが正しくなったことの1つは、使用しにくい場合、その考えです アクション そのアクションを開始するコントロールとは別のものです。アクションオブジェクトは、複数のコントロールから呼び出すことができます:メニュー項目、ダイアログ上のプッシュボタン、キーストロークなど。デザインの観点からより重要なのは、何が起こる必要があるかを把握しようとする一般的な「リスナー」のアイデアからあなたを連れ去ることです。たとえば、1人のリスナーがメニューシステム全体から入力を受信するアプリを見て、その後、大きなIF/他のチェーンを通過して、どのメニュー項目が押されたかを把握します。アクションを使用すると、より多くのクラスがあることを意味しますが、長期的にはより保守可能なアプリが得られます。

最後に、ユーザビリティの観点から、JCheckboxやJTextareaなどの状態を維持するコントロールと、JButtonやJMenuitemなどのアクションを開始するコントロールとの間には違いがあります。ラジオボタンをクリックすると、別のページに移動する(Web)アプリを見ました。良くないね。リスナーを内部で使用することを計画していても、一部のモデルの状態を更新するために、GUI要素のコレクションが自分自身でモデルを提供しない理由を自問する必要があります。

For the case where the listener is exclusive (such as an anon listener), I use (a).

If the listener will be reused (eg, this is an instance of ActionListener) I'll write it as:

@Override
public void actionPerformed(ActionEvent event) {
    Object src = event.getSource();
    if (src == checkbox) {
        boolean bChecked = checkbox.isSelected();
        // ...
    }
}

If you have several checkboxes and they are processed the same way, then instanceof makes sense.

I'd program with b defensively as it's the best-practice option. But if only you are ever going to use the code then there is no reason why you can't do a. However, imagine how happy you will be with yourself if you come back to it at some future point, change something and find you wrote good code which you can directly reuse...

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top