java - JTable JComboBox 默认在列表展开时显示第一项

标签 java swing jtable jcombobox jlist

我一直试图通过大量 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 不包含字符串,而是包含一组更复杂的自定义对象,我认为这会分散对主要问题的注意力。

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

我还提供了一些屏幕截图来更好地描述我的问题。第一个图像是未选择 JComboBox 时,仅显示当前选定的项目。 Unselected, in default state

第二张图片是我刚刚单击 JComboBox 来调出列表时的图像。如图所示,它将立即显示第一个项目,无论它是什么。 Selected, with list expanded

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

<小时/>

编辑

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

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

敌人确实有一个射弹的 setter/getter ,所以我可以确定当前选择的敌人是什么,获取它的射弹,执行 toString() 来查找它在列表中的表示方式,然后执行 setValueAt() .

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

最佳答案

除非为每行动态生成 JComboBox 的值,否则您应该能够提前准备 CellEditor,例如...

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

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

enter image description here enter image description here

已更新

在组合框值是每行动态生成的情况下,您可以做更多类似的事情......

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); 的使用,这会将所选值设置为单元格的当前值...

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

关于java - JTable JComboBox 默认在列表展开时显示第一项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28665550/

相关文章:

java - jTable更新按钮并添加新的

java - JTable 中的 MS Access DB 中带有日期的单元格只有日期而没有时间

java - 同一输入有两个不同的 MD5?

java - Servlet session 不是持久的

java - Spring MVC 和 JSP。基本步骤

java - java GUI创建的线程安全问题

java - 动态简单文本编辑器 Java

java - 如何让一个表中传递的数据不再显示在另一个表中

java - JTable 不会在 fireTableChanged 上刷新

java - 当两个值相等时如何返回 ArrayList 中的 max?