【发布时间】:2013-06-02 01:48:30
【问题描述】:
我有使用JComboBox 呈现的列,我有显示JComboBox 内每种类型的选定项目数量的标签。
问题是我想为每一行触发不同的ItemListener。
现在我有一列,所有单元格都呈现JComboBox,但都触发相同的ItemListener 为什么??
这让我很紧张。
这是我的代码:
listaPessoasModel = new DefaultTableModel(dadosPessoasTableColumn, 0);
listaPessoasTable = new JTable(listaPessoasModel);
listaPessoasTable.addKeyListener(newLineTableListener);
listaPessoasTable.setFillsViewportHeight(true);
JScrollPane scrollPane = new JScrollPane(listaPessoasTable);
scrollPane.setBounds(205, 344, 385, 169);
TableColumn classeColumn = listaPessoasTable.getColumnModel().getColumn(2);
classeColumn.setCellRenderer(new ClasseTableCellRender());
classeComboBox = new JComboBox<Classe>(new Vector<Classe>(Classe.allInstances()));
classeComboBox.setSelectedIndex(-1);
classeColumn.setCellEditor(new DefaultCellEditor(classeComboBox));
classeComboBox.setRenderer(classeComboBoxRenderer);
classeComboBox.addItemListener(new classeComboBoxItemListener());
这里是我所有的听众和模特:
private final class classeComboBoxItemListener implements ItemListener {
@Override
public void itemStateChanged(ItemEvent e) {
Classe object = (Classe) e.getItem();
System.out.println("ItemListener , objecto -> " + object);
if(object != null && !newItemClasseComboControl){
if(e.getStateChange() == ItemEvent.SELECTED)
updateLabelLugares(false, object);
if(e.getStateChange() == ItemEvent.DESELECTED)
updateLabelLugares(true, object);
}
}
}
static class ClasseTableCellRender extends DefaultTableCellRenderer {
private static final long serialVersionUID = 1L;
public ClasseTableCellRender() { super(); }
public void setValue(Object value) {
if(value instanceof Classe)
setText((value == null) ? "" : ((Classe) value).tipo().toString());
else
setText((value == null) ? "" : value.toString());
}
}
private ListCellRenderer<Object> classeComboBoxRenderer = new DefaultListCellRenderer() {
private static final long serialVersionUID = 1L;
@Override
public Component getListCellRendererComponent(JList<?> list,
Object value,
int index,
boolean isSelected,
boolean cellHasFocus) {
Classe classe = (Classe) value;
if(value != null)
value = classe.tipo().toString();
return super.getListCellRendererComponent(list, value,
index, isSelected, cellHasFocus);
}
};
上面是一个屏幕截图,显示了我要查找的内容。
这些数字只是为了代表这个想法,因为这仍然不起作用。我无法让项目侦听器按照我想要的方式为每一行单独工作。
因为当我单击打开组合框时,它会取消选择之前选择的项目。
我希望项目侦听器仅在 jcombobox 内的项目选择时触发,并且为该列的每个单元格单独触发,因此我可以正确更新标签。
【问题讨论】:
-
现在我有一列,所有单元格都呈现 JComboBox,但为什么都触发相同的 ItemListener?? 您应该为每一行维护一个标志,以便标志说明进行选择时,该行的
JComboBox's ItemListener必须执行。 -
感谢您的反馈!哪种方法可以做到这一点?如何为每一行设置不同的项目侦听器?我在 tablecolumn 设置 itemlistener ..
标签: java jtable row jcombobox itemlistener