JComboBoxに実行時に変更されるランダムな項目がいくつかあります。私はgetListCellRendererComponent(...)を使ってJLabelとしてそれらを設定しました。私はまた、これらのJlabelのいくつかをsetEnabled(false)として設定しました。選択したJComboBoxアイテムが有効か無効かを検出
ユーザーがそのJComboBoxからアイテムを選択すると、が有効かどうかを検出できる方法がありますか?
JComboBoxに実行時に変更されるランダムな項目がいくつかあります。私はgetListCellRendererComponent(...)を使ってJLabelとしてそれらを設定しました。私はまた、これらのJlabelのいくつかをsetEnabled(false)として設定しました。選択したJComboBoxアイテムが有効か無効かを検出
ユーザーがそのJComboBoxからアイテムを選択すると、が有効かどうかを検出できる方法がありますか?
renedererはそれらをペイントするだけで、チェックするisEnabled値がないようにします。代わりに、cellRendererが選択を参照しているときに値が許可されているかどうかを判断するために使用するのと同じロジックを使用します。あるいは、無効にする代わりにリストからそれらの値を削除することもできます。
もちろん、「同じロジック」を使用する場合、これはメソッドに抽出してそのメソッドを呼び出すことを意味します。 –
私の代わりの解決方法は同じロジックを使用することでした。私は別の方法があると思った。 – Brad
リスト/コンボ(またはいずれかのコレクションコンポーネント)のアイテムは、ある状態のビジネスオブジェクトの表現であると考えられます。次に、異なる状態を認識しているレンダラーを実装し、レンダラーが状態を適切な視覚的表現にマッピングするようにします。
// 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());
}
多分私はあなたの説明を誤解していますが、決して_components_を項目として追加しないでください。あなたはしません - そうですか? – kleopatra
@kleopatra:はい、そうです...これには問題がありますか?私はアイコン+いくつかの項目を無効にする必要があります。 – Brad
問題は別々の懸念を混ぜている(スイングは分離しているために長い道のりを行くため、レンダラが存在する理由です;-)。より揺れ動くようにデザインする方法については私の答えを見てください。 – kleopatra