当前位置: 首页 > 知识库问答 >
问题:

禁用单个JComboBox项目

王炜
2023-03-14

这是一个相当普遍的问题,我用过的解决方案和我后来搜索发现的差不多。其中一个实现了带有< code>JLabel的< code>ListCellRenderer,它根据当前选择的索引启用或禁用自身:

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;
}

问题是,尽管列表项在视觉上显示为禁用,但尽管调用了< code>setFocusable,它仍然可以被选中。我该如何禁用它?

共有1个答案

司马越
2023-03-14

您需要某种方法阻止组合框设置无法从中选择的项。

我能想到的最简单的方法是将选择的变化捕获在模型本身中。

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);

        }

    }

}

现在,这是一个快速的黑客来证明这一点。您真正需要的是以某种方式将某些标记为不可选择。我能想到的最简单的方法是在中提供一个属性,例如是可选择的

如果做不到这一点,您可以构造一个特殊的 ComboBoxModel,该模型维护一个单独的内部模型,其中包含对所有不可选的引用,以便可以使用快速 model.contains(item) 来确定该项是否可选。

 类似资料:
  • 1.我创建了一个JComboBox和Jtable。当用户从JComboBox中选择项目时,它们被添加到Jtable中 2.我不想让用户选择他以前在JComboBox中选择的项目 3.因此必须禁用选定的选项(不可选择)。我该怎么做?4.下面的代码在添加到JTable中后从JComboBox中删除该选定项,但我有兴趣禁用它

  • 我有一个,其中有8个项目,我想显示其中的所有项目,但在特定条件下,用户只能选择前两个项目,因此我编写了程序,如果条件为真,用户选择任何其他选项,则会显示一个消息框,显示然后自动选择默认值。到现在为止,一直都还不错。 但现在的问题是,用户无法通过查看的选项来判断他可以选择哪些选项,因此我想做的是,如果条件为真,那么除前两个选项之外的所有选项都应该被禁用(或灰显或其他),这样用户就可以判断出您无法选择

  • 问题内容: 我正在尝试结合2个jcombobox。1个组合框用于显示费用类别。第二个组合框正在从文本文件读取文件以显示产品类型。如果我更改第一个组合框,我希望第二个组合框将根据用户在第一个组合框中的选择进行更改。 我是否仍有可能从文本文件加载其他组合框?该子项将不是Arrays,而是与以前相同,因为它位于cboperson代码的底部。 编辑的代码: 问题答案: 例如

  • 我在设置JComboBox时遇到问题。用户在separte面板上有几个选项,这些选项决定是否应该启用/禁用JComboBox——我的问题是,即使禁用了JComboBox,用户仍然可以从中进行选择(当组合框变灰时,它被禁用)!JComboBox使用自定义TableCellRenderer和自定义DefaultCellEditor。JComboBox也是JTable中一行的单元格/列。 下面是代码的细

  • 我有一个JComboBox,其中的项是查询的结果。我在这里要做的是为每个项目设置一个标签和一个值。问题是,当我想要获取所选项目的值以创建新对象时,我无法。如你所见,我可以使用proveedorCombo获得标签。getSelectedItem()方法,但我不需要它,我需要ID,如何才能让它创建对象“a”?我试图将其放入“for bucle”中,如您所见,我显示了de-label和值,但我无法将该变

  • 问题内容: 我正在寻找与该答案类似的解决方案,但更安全。我想禁用证书验证,但仅针对单个请求(这是我所需要的)。因此,它应该执行以下一项或多项操作 一个请求完成后,返回安全状态 仅禁用给定URL的验证 (也许)仅将不安全设置用于一个线程 附录 我真的想知道当我要一个更安全的解决方案时,与原始问题(得分+46)相比,这个问题(得分-2)出了什么问题。 有人可以解释吗? 解释为什么我需要这样做:有一个有