我有用 呈现的列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);
}
};
上面是一个屏幕截图,显示了我正在寻找的内容。
这些数字只是为了代表这个想法,因为这仍然不起作用。我无法让项目侦听器按照我想要的方式为每一行单独工作。
因为当我单击打开 ComboBox 时,它会取消选择先前选择的项目。
我希望项目侦听器仅在 jcombobox 内的项目选择时触发,并且为该列的每个单元格单独触发,因此我可以正确更新标签。