2011-04-10 17 views
2

JComboBoxに実行時に変更されるランダムな項目がいくつかあります。私はgetListCellRendererComponent(...)を使ってJLabelとしてそれらを設定しました。私はまた、これらのJlabelのいくつかをsetEnabled(false)として設定しました。選択したJComboBoxアイテムが有効か無効かを検出

ユーザーがそのJComboBoxからアイテムを選択すると、が有効かどうかを検出できる方法がありますか?

+0

多分私はあなたの説明を誤解していますが、決して_components_を項目として追加しないでください。あなたはしません - そうですか? – kleopatra

+0

@kleopatra:はい、そうです...これには問題がありますか?私はアイコン+いくつかの項目を無効にする必要があります。 – Brad

+0

問題は別々の懸念を混ぜている(スイングは分離しているために長い道のりを行くため、レンダラが存在する理由です;-)。より揺れ動くようにデザインする方法については私の答えを見てください。 – kleopatra

答えて

2

renedererはそれらをペイントするだけで、チェックするisEnabled値がないようにします。代わりに、cellRendererが選択を参照しているときに値が許可されているかどうかを判断するために使用するのと同じロジックを使用します。あるいは、無効にする代わりにリストからそれらの値を削除することもできます。

+1

もちろん、「同じロジック」を使用する場合、これはメソッドに抽出してそのメソッドを呼び出すことを意味します。 –

+0

私の代わりの解決方法は同じロジックを使用することでした。私は別の方法があると思った。 – Brad

1

リスト/コンボ(またはいずれかのコレクションコンポーネント)のアイテムは、ある状態のビジネスオブジェクトの表現であると考えられます。次に、異なる状態を認識しているレンダラーを実装し、レンダラーが状態を適切な視覚的表現にマッピングするようにします。

// the item 
public class Valve { 
    private boolean open; 
    private boolean canOperate; 
    private Point location; 
    // getters and methods as appropriate 
    public boolean isOpen() { ... 
    ...  
} 

// custom renderer 
Component getListCellRendererComponent(....) { 
    // normal config, assuming you subclass DefaultListCellRender 
    super.getListCellRendererComponent(...) 
    if (value instanceof Valve) { 
     configFromValve((Valve) value) 
    } 
    return this; 
} 
private void configFromValve(Valve valve) { 
    setText("P: (" + valve.location().x + "," + valve.getLocation().y + ")"); 
    setIcon(valve.isOpen() ? openIcon : closedIcon); 
    setEnabled(valve.canOperate()); 
} 
+0

私はあなたの実装が大好きです...しかし、コンボモデルの項目としてコンポーネントを定義することに何が問題なのですか? – Brad

+1

@bradあなたが必要としている不自然なものをいくつかのオブジェクトを持つためにクルージングとしてそうするのは間違っています。コンポーネントがビジュアルビルダーのf.iと同じように、ビジネスオブジェクトのコンポーネントであれば大丈夫かもしれませんが、それは本当にまれです。 – kleopatra

関連する問題