【问题标题】:Trigger Different Item Listener for each JComboBox inside JTable为 JTable 中的每个 JComboBox 触发不同的项目侦听器
【发布时间】: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


【解决方案1】:

这只是因为它可能没有为组合框获得正确的值,使用这个 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;
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2013-02-22
    相关资源
    最近更新 更多