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

Java:使jcombobox的一个项目不可选择(比如子标题),并编辑该项目的字体

邵昆琦
2023-03-14

如何使组合框中的一个项目无法选择,因为我需要将组合框中的项目与子主题分开。

有可能单独修改特定项目的字体吗?

        jComboBox_btech_course.setFont(new java.awt.Font("Tahoma", 0, 14));
        jComboBox_btech_course.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Select Course" }));
        jComboBox_btech_course.setName("");

private class theHandler implements ActionListener
{
    public void actionPerformed(ActionEvent evt) 
    {
        //BTech courses

        if(jComboBox_mtech_dept.getSelectedItem().equals("Civil Engineering"))
        {
            jComboBox_btech_course.removeAllItems();
            jComboBox_btech_course.addItem("Building Construction");
            jComboBox_btech_course.addItem("Principle And Practice");
            jComboBox_btech_course.addItem("Surveying");
            jComboBox_btech_course.addItem("Engineering Geology");
            jComboBox_btech_course.addItem("Structural Analysis");
            jComboBox_btech_course.addItem("Hydraulic Engineering");
            jComboBox_btech_course.addItem("Environmental Engineering");
            jComboBox_btech_course.addItem("Structural Design");
            jComboBox_btech_course.addItem("Geotechnical Engineering");
            /*This item has to be unselectable*/
            jComboBox_btech_course.addItem("***Sub-topic***");
            jComboBox_btech_course.addItem("Transportation Engineering");
            jComboBox_btech_course.addItem("Foundation Engineering");
            jComboBox_btech_course.addItem("Estimation & Valuation");
            jComboBox_btech_course.addItem("Hydrology & Flood Control");
            jComboBox_btech_course.addItem("System Analysis, Project Planning And Construction Management");
            jComboBox_btech_course.addItem("Irrigation Engineering");
            jComboBox_btech_course.addItem("Computer Application in Civil Engineering");
            jComboBox_btech_course.addItem("Planning, Design & Detailing");
        }
    }
}

共有3个答案

章玮
2023-03-14

您可以通过以下方式添加自定义的< code>ItemListener

addItemListener(ItemListener aListener)

并且在该方法中禁用选择或将选择切换到上面的项目。

鲁炳
2023-03-14

为了获得您需要的内容,您需要实现< code>ComboBoxEditor。

这样,你可以决定在你的情况下,或者在任何其他情况下,你想做什么

柴兴贤
2023-03-14

前言:在提议的解决方案中,我假设您想禁用以"**"开头的项目。您可以将此逻辑更改为您想要的任何内容。在改进的版本中,MyComboModel类(见下文)甚至可以存储哪些项目被禁用,从而允许将任意项目标记为禁用。

您的问题的解决方案涉及2件事:

为此,您可以使用自定义的< code>ComboBoxModel,并覆盖其< code>setSelectedItem()方法,以便在要选择的项目是禁用的项目时不执行任何操作:

class MyComboModel extends DefaultComboBoxModel<String> {
    public MyComboModel() {}
    public MyComboModel(Vector<String> items) {
        super(items);
    }
    @Override
    public void setSelectedItem(Object item) {
        if (item.toString().startsWith("**"))
            return;
        super.setSelectedItem(item);
    };
}

您可以通过将它的一个实例传递给< code>JComboBox构造函数来设置这个新模型:

JComboBox<String> cb = new JComboBox<>(new MyComboModel());

为此,您必须使用自定义的< code>ListCellRenderer,并且在< code > getListCellRendererComponent()方法中,您可以为禁用和启用的项目配置不同的视觉外观:

Font f1 = cb.getFont();
Font f2 = new Font("Tahoma", 0, 14);

cb.setRenderer(new DefaultListCellRenderer() {
    @Override
    public Component getListCellRendererComponent(JList<?> list, Object value,
            int index, boolean isSelected, boolean cellHasFocus) {
        if (value instanceof JComponent)
            return (JComponent) value;

        boolean itemEnabled = !value.toString().startsWith("**"); 

        super.getListCellRendererComponent(list, value, index,
                isSelected && itemEnabled, cellHasFocus);

        // Render item as disabled and with different font:
        setEnabled(itemEnabled);
        setFont(itemEnabled ? f1 : f2);

        return this;
    }
});
 类似资料:
  • 这可能是一个骗局——我找不到它——我基本上只是试图通过提供我自己的ListCellRenler来自定义JComboBox显示: 当我展开JComboBox列表时,组件会正确显示名称。但是,在选择项目时,显示将恢复为myObj的toString()值。 我错过什么了吗?

  • 我有一个包含5个项目的BottomNavigationBar。除了名称和图标,第一个项目与其他项目相同。这是bottom_nav菜单的xml 这是用于图标的绘图的xml 最后,这是我用于Bar本身的xml 其余可绘图项的xml完全相同(它们使用不同的图标,但这与xml本身无关)。但是,名称_配置项在底部导航栏中不可见。单击时,它的行为与其他项目相同(它们传递SharedReferences值并移动

  • 我有一个可过滤和可编辑的JComboBox。我想为JComboBox中的每一项设置一个工具提示——我想我应该使用JToolTip来做这件事。 我试着用了这个链接的答案:Java Swing:JComboBox项目上的Mouseover text?。 但是当JComboBox显示过滤的项目时,JToolTip索引的顺序会发生变化。在这种情况下,我不知道如何为每个JComboBox项目设置正确的JTo

  • 我有一个可编辑的JCombobox。我已经完成了从数据库加载数据所需的操作。 我正在尝试重写mouseListener,但它不起作用。 那么,在鼠标单击jComboBox弹出菜单(其中有value)后,如何从searchTF中删除选定的数据。或者-。任何帮助都是非常感激的。

  • 问题内容: 这似乎很基本,但我无法弄清楚。 我有一个表“ item_tags”,我想选择所有与标签1和2匹配的项目(例如,每个项目都必须同时具有两个标签)。 我将如何在mysql中执行此操作? 创建表是: 谢谢! 问题答案: 使用: 您需要定义GROUP BY和HAVING子句,并且不同标签ID的数量必须等于您在IN子句中指定的标签数。

  • 问题内容: 我有一个显示来自数据库Patient_Details的名称的JComboBox 这是来自comboitem类,该类仅返回名称,而不返回id 我的问题是如何获取选定的项目,以便可以执行此操作,我不知道如何执行此操作,我已经尝试了所有代码约2小时,将不胜感激 NB我是Java初学者 问题答案: 只需在组合框中添加一个即可。当被调用时,你可以看一下所选择的价值和呼叫你需要什么都的方法。 例如