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 に答える