我一直试图确定为什么我的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时,只显示当前选定的项目。
第二张图片是我刚刚点击JComboBox以显示列表的时候。如图所示,它将立即显示第一个项目,无论它是什么。
如果有人对于在哪里寻找/解决方案有任何建议,我将非常感激。
修改
我的特定表有两列,其中左列是变量名,右列是与变量关联的值。表的作用是显示所选对象的属性,其中不同对象的不同变量的每个值可能不相同。
在这种特殊情况下,单元格显示一个JComboBox,其中包含我们正在制作的游戏中所有可用的Projectiles。每个敌人都有默认的不同类型的射弹。因此,当我点击游戏区域中的另一个敌人时,该表格将显示其所有当前属性(默认值如果尚未更改)。
敌人确实有射弹的吸气剂,所以我可以确定当前选择的敌人是什么,得到它的射弹,做一个toString()来找到它在列表中的表现方式,并做一个setValueAt() 。
唯一的问题是,当列表扩展时,它总是在列表中选择第一个项目。
答案 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);
这将在编辑过程开始时将编辑器的选定值设置为单元格的值
<强>更新强>
在每行动态生成组合框值的情况下,您可以执行更多类似......
的操作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);