4

これはかなり一般的な問題であり、私が使用した解決策は、後で検索して見つけたものと似ています。現在選択されているインデックスに基づいてそれ自体を有効または無効にする を使用ListCellRendererして を実装します。JLabel

public Component getListCellRendererComponent(JList list, Object value,
        int index, boolean isSelected, boolean cellHasFocus) {
    setText(value.toString());
    UIDefaults defaults = UIManager.getDefaults();
    Color fc;
    if (index == 1) {
        setEnabled(false);
        fc = defaults.getColor("Label.disabledForeground");
        setFocusable(false);
    } else {
        // fc = defaults.getColor("Label.foreground");
        fc = list.getForeground();
        setEnabled(list.isEnabled());
        setFocusable(true);
    }
    setForeground(fc);
    setBackground(isSelected ? list.getSelectionBackground() : list
            .getBackground());
    return this;
}

setFocusable問題は、視覚的にリスト項目が無効として表示されていても、呼び出しにもかかわらず選択できることです。実際に無効にするにはどうすればよいですか?

4

1 に答える 1

3

ComboBox選択できない項目を設定できないようにする方法が必要です。

私が考えることができる最も簡単な方法は、選択の変更をモデル自体に閉じ込めることです。

public class MyComboBoxModel extends DefaultComboBoxModel {

    public MyComboBoxModel() {

        addElement("Select me");
        addElement("I can be selected");
        addElement("Leave me alone");
        addElement("Hit me!!");

    }

    @Override
    public void setSelectedItem(Object anObject) {

        if (anObject != null) {

            if (!anObject.toString().equals("Leave me alone")) {

                super.setSelectedItem(anObject);

            }

        } else {

            super.setSelectedItem(anObject);

        }

    }

}

これは要点を証明する簡単なハックです。本当に必要なのは、何らかの方法で特定のitemsものを選択不可としてマークすることです。私が考えることができる最も簡単な方法は、たとえば のitemようなプロパティを提供することisSelectableです。

それができない場合は、アイテムが選択可能かどうかを判断するためにクイックを使用できるように、ComboBoxModelすべての unselectable への参照を含む別の内部モデルを維持する特別なものを構築できます。itemsmodel.contains(item)

于 2012-08-10T05:34:31.253 に答える