簡體   English   中英

為JTable中的每個JComboBox觸發不同的項目偵聽器

[英]Trigger Different Item Listener for each JComboBox inside JTable

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內的項目選擇時觸發,並且針對該列的每個單元格單獨觸發,因此我可以正確更新標簽。

那僅僅是因為它可能沒有為Combobox獲得正確的值,而使用此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;
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM