0

我有用 呈现的列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 内的项目选择时触发,并且为该列的每个单元格单独触发,因此我可以正确更新标签。

4

1 回答 1

0

那只是因为它可能没有为组合框获得正确的值,使用这个 TableCellEditor 可能会有所帮助。

class CheckBoxCellRenderer implements TableCellRenderer {

        JComboBox combo;
        JSONObject response;

        public CheckBoxCellRenderer(JComboBox comboBox) {
            this.combo = new JComboBox();
            combo.setForeground(new Color(77, 75, 71));


            for (int i = 0; i < comboBox.getItemCount(); i++) {
                combo.addItem(comboBox.getItemAt(i));
            }


            combo.addItemListener(new ItemListener() {

                @Override
                public void itemStateChanged(final ItemEvent ie) {

                    System.out.println("Item state changed --");

                }
            });

        }

        public Component getTableCellRendererComponent(JTable jtable, Object value, boolean isSelected, boolean hasFocus, int row, int column) {

            if (jtable.getSelectedRow() == row) {
                combo.setSelectedItem(value);
                combo.setActionCommand("" + row);
                return combo;
            }
            JComboBox box = new JComboBox();
            box.addItem("Pending");
            return box;
        }
    }
于 2014-10-06T07:41:52.083 回答