当扩展列表时,JTable JComboBox默认显示第1项

时间:2015-02-23 01:10:13

标签: java swing jtable jcombobox jlist

我一直试图确定为什么我的JComboBox通过大量的Google搜索显示列表中的第一项,但我很难找到相关的帮助。可能是我不知道正确的术语(因此这个问题的过于具体的标题),因此找不到可以解释我的问题的信息。我查看了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的渲染器,因为我对它出现的方式很满意,并认为我的问题更多的是我忽略了在模型中实现/实现错误。< / p>

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

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

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


修改

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

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

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

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

3 个答案:

答案 0 :(得分:2)

除非为每一行动态生成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);,这会将所选值设置为单元格当前值...

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

答案 1 :(得分:1)

这是一个老人......

你的问题很可能是你没有实现&#34;等于&#34;在组合中使用的类中。

Combo需要在准备时选择当前项目,并通过迭代模型的元素并选择第一个等于单元格中的值来实现。如果没有遇到,则它将原样保留为组合(在前一个单元格编辑中的第一个元素或最后一个使用的元素)

答案 2 :(得分:0)

这是默认使用之前选择的元素的方法:

//...
Object selectedItem = box.getSelectedItem();
//Add some elements to the jComboBox
box.setSelectedItem(selectedItem);