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

当列表展开时,JTable JComboBox默认显示第一项

南门洋
2023-03-14

我一直在试图通过大量的Google搜索来确定为什么我的JComboBox显示列表中的第一个项目,但我正在努力寻找相关的帮助。可能是我不知道正确的术语(因此这个问题的标题过于具体),因此找不到可以解释我的问题的信息。我查看了JComboBox API,以及它使用的一些侦听器和模型,但它们似乎不太可能是候选者。

有问题的JComboBox在JTable中,所以我不知道这是否改变了它的默认行为。我使用的代码如下:

//row and col are final due to usage inside anonymous inner class
public TableCellEditor getCellEditor(final int row, final int col)
{
    String[] listItems = new String[arrayList.getSize()];
    int i = -1;

    for(String s : arrayList)
    {
        i++;
        listItems[i] = s;
    }

    JComboBox<String> box = new JComboBox<>(listItems);
    box.addItemListener(new ItemListener()
    {
        public void itemStateChanged(ItemEvent e)
        {
            if(e.getStateChange() == ItemEvent.SELECTED)
            {
                if(e.getItem().equals("Add/Edit Projectile"))
                {
                    //Where Editor is a JFrame that will be opened 
                    new Editor();
                }
            }
        }
    });

    DefaultCellEditor list = new DefaultCellEditor(box);
}

请注意,我的程序中的Arraylist不包含字符串,而是包含一组更复杂的html" target="_blank">自定义对象,我认为这会分散对主要问题的注意力。

我没有在JTable中包含JComboBox的渲染器,因为我对它的显示方式非常满意,并认为我的问题更多的是我忽略了在模型中实现/实现错误。

如果有人对在哪里寻找/解决方案有任何建议,我将不胜感激。

编辑

我的特定表有两列,其中左列是变量名称,右列是与变量关联的值。表的作用是显示选定对象的属性,其中不同对象的不同变量的每个值可能不相同。

在这种特殊情况下,单元格会显示一个JComboBox,其中包含我们正在制作的游戏中所有可用的射弹。每个敌人都有一种不同类型的射弹,它默认为。因此,当我点击游戏区域中的其他敌人时,该表将显示其所有当前属性(如果未更改,则为默认值)。

敌人确实有一个弹丸的getter,所以我可以确定当前选择的敌人是什么,得到它的弹丸,做一个toString()来找到它在列表中的表示方式,并做一个setValueAt()。

唯一的问题是,当列表展开时,它总是选择列表中的第一项。

共有3个答案

夏弘义
2023-03-14

这是您应该默认为先前选择的元素的方式:

//...
Object selectedItem = box.getSelectedItem();
//Add some elements to the jComboBox
box.setSelectedItem(selectedItem);
司寇祖鹤
2023-03-14

尽管这是一首老歌...

您的问题很可能是您没有在组合中使用的类中实现“equals”。

组合需要在准备时选择当前项目,通过遍历模型的元素来完成,并选择第一个等于单元格中的值的项目。如果没有遇到任何元素,那么它保持组合不变(或者是第一个元素,或者是上一次单元格编辑中使用的最后一个元素)

阎雪峰
2023-03-14

除非为每行动态生成JComboBox的值,否则您应该能够提前准备单元编辑器,例如。。。

JComboBox cb = new JComboBox(new String[]{"1", "2", "3", "4"});
DefaultCellEditor editor = new DefaultCellEditor(cb);

JTable table = new JTable(new DefaultTableModel(5, 1));
table.getColumnModel().getColumn(0).setCellEditor(editor);

这将在编辑过程开始时将编辑器的选定值设置为单元格的值

更新

在每一行动态生成组合框值的情况下,您可以执行更像...

JComboBox cb = new JComboBox();
DefaultCellEditor editor = new DefaultCellEditor(cb) {

    @Override
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
        JComboBox editor = (JComboBox) getComponent();
        String[] listItems = new String[arrayList.getSize()];
        int i = -1;
        for (String s : arrayList) {
            i++;
            listItems[i] = s;
        }

        DefaultComboBoxModel model = new DefaultComboBoxModel(listItems);
        editor.setModel(model);
        editor.setSelectedItem(value);
        return editor;
    }
};

JTable table = new JTable(new DefaultTableModel(5, 1));
table.getColumnModel().getColumn(0).setCellEditor(editor);

请注意使用 editor.setSelectedItem(value);,这会将所选值设置为单元格当前值...

您还可以重用模型,每次清除它并用新值重新填充它。如果您有大量行,您可能会发现这更有效,因为您不需要在每次编辑单元格时不断创建新模型

 类似资料:
  • 我被一个奇怪的编程问题困住了。我已经定义了一个模式,其中如果没有为列(列名是Title)传递值,那么将使用默认值(Harry)。 标题|字符变化(64)|默认“Harry”::字符变化 而且,我正在尝试通过我的java应用程序使用hibernate插入条目。 发生的情况是,hibernate在任何查询中都显式地为该列提供空值,因此这些条目的默认值不会显示在表中。 这里要提到的是,当我自己执行任何i

  • 好吧,这是一个两部分的问题,我试图最好地解释我的疑问: 代码很简单,用户不断输入成绩,程序会对其进行计数,一旦用户给出EOF条目,程序会在最后显示每个成绩的最终计数。 1) 当我运行代码时,程序会正确地跟踪我输入的每个等级的计数,但总是落在默认情况下,即使输入是正确的!为什么会这样? 2) 因此,我不完全确定“cin.get()”是如何工作的,但如果我是对的,它会接受用户输入的任何内容的第一个字符

  • 我从Highchart网站上找到了以下代码:https://jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/highcharts/demo/dynamic-update/ 我想在默认序列为空的图表上显示数据,并将设置为。我不想使用jQuery,也不想在图表中添加加载事件点。我只想在页面完全加载时添

  • 问题内容: 我只想显示包装文本块的第一行,然后在单击时显示整个块。另外,我想知道如何在第二次单击时将其切换回紧凑的单行版本。 有没有简单的方法可以通过CSS + JavaScript做到这一点?我使用jQuery。 问题答案: 假设您不想使用任何JavaScript库(这很 奇怪 )。 HTML: CSS: JavaScript: 另外,如果您想使用jQuery之类的JavaScript框架,则可

  • 本文向大家介绍SpringSecurity 默认表单登录页展示流程源码,包括了SpringSecurity 默认表单登录页展示流程源码的使用技巧和注意事项,需要的朋友参考一下 SpringSecurity 默认表单登录页展示流程源码 本篇主要讲解 SpringSecurity提供的默认表单登录页 它是如何展示的的流程, 涉及 1.FilterSecurityInterceptor, 2.Excep