选择值时,无法在JTable中更新JComboBox

时间:2017-05-16 09:08:54

标签: java swing

我希望JTable JComboBox始终可见JComboBox。我的问题是当我点击JComboBox并选择一个值时,我的import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.util.ArrayList; import java.util.List; import javax.swing.DefaultCellEditor; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableCellEditor; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; public class trial extends JFrame { private ArrayList<JComboBox> comboslist= new ArrayList <JComboBox>();/*list of my comboboxes*/ public static void main(String[] args) { trial tr= new trial(); } public trial(){ this.setSize(new Dimension(600,100)); String[] ColData={"Index","Field Name","Value","Range"}; Object[][] TrowData={ }; DefaultTableModel model = new DefaultTableModel(TrowData, ColData); final List<TableCellEditor> editors = new ArrayList<TableCellEditor>(); JComboBox combo1= new JComboBox(); combo1.addItem("don"); combo1.addItem("mump"); combo1.setEditable(true); combo1.setBackground(Color.WHITE); Object[] rowdata = {"cars","books","chicken","soup"}; model.addRow(rowdata); DefaultCellEditor dce1 = new DefaultCellEditor(combo1); editors.add(dce1); JComboBox combo2= new JComboBox(); combo2.addItem("sop"); combo2.addItem("act"); combo2.setEditable(true); combo2.setBackground(Color.WHITE); Object[] rowdata2 = {"goats","cats","salads","dogs"}; model.addRow(rowdata2); DefaultCellEditor dce2= new DefaultCellEditor(combo2); editors.add(dce2); comboslist.add(combo1); comboslist.add(combo2); JTable table = new JTable(model) { // Determine editor to be used by row public TableCellEditor getCellEditor(int row, int column) { int modelColumn = convertColumnIndexToModel( column ); if (modelColumn == 2) return editors.get(row); else return super.getCellEditor(row, column); } }; table.setRowHeight(0, 30); table.setRowHeight(1, 30); table.setPreferredScrollableViewportSize(new Dimension(800, 150)); table.setFillsViewportHeight(true); TableColumn valCol= table.getColumnModel().getColumn(2); int x=0; for(JComboBox cb: comboslist ){ valCol.setCellRenderer(new ComboBoxCellRenderer(cb,x++)); } this.add(table); this.setVisible(true); } private class ComboBoxCellRenderer extends JComboBox implements TableCellRenderer { private JComboBox combo; private int idx=0; private ComboBoxCellRenderer comboRenderer; public ComboBoxCellRenderer(JComboBox com,int ind) { for (int i = 0; i < com.getItemCount(); i++) { addItem(com.getItemAt(i)); } comboRenderer=this; } public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if(comboslist.get(row).getSelectedItem()!=null) { if(isSelected && row==idx) { setSelectedItem(comboslist.get(row).getSelectedItem().toString()); comboRenderer.setSelectedItem(comboslist.get(row).getSelectedItem().toString()); } }else { setSelectedItem(value); } return this; } } } 未更新。

Access-Control-Allow-Origin

2 个答案:

答案 0 :(得分:1)

你有点倒退并且扭曲了。您应该拥有一个,而不是尝试使用多个组合框编辑器,然后根据该行进行配置。

基于这个想法,你可以让一个类充当渲染器和编辑器,例如

import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.swing.AbstractCellEditor;
import javax.swing.ComboBoxModel;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;

public class Trial extends JFrame {

    public static void main(String[] args) {
        Trial tr = new Trial();
    }

    public Trial() {
        this.setSize(new Dimension(600, 100));

        String[] ColData = {"Index", "Field Name", "Value", "Range"};
        Object[][] TrowData = {};
        DefaultTableModel model = new DefaultTableModel(TrowData, ColData);
        final List<TableCellEditor> editors = new ArrayList<TableCellEditor>();

        model.addRow(new String[] {"cars", "books", "chicken", "soup"});
        model.addRow(new String[] {"goats", "cats", "salads", "dogs"});

        DefaultComboBoxModel model1 = new DefaultComboBoxModel();
        model1.addElement("don");
        model1.addElement("mump");

        DefaultComboBoxModel model2 = new DefaultComboBoxModel();
        model2.addElement("sop");
        model2.addElement("act");

        Map<Integer, ComboBoxModel<String>> models = new HashMap<>(2);
        models.put(0, model1);
        models.put(1, model2);

        JTable table = new JTable(model);
        table.setRowHeight(0, 30);
        table.setRowHeight(1, 30);
        table.setPreferredScrollableViewportSize(new Dimension(800, 150));
        table.setFillsViewportHeight(true);

        ComboBoxCellRendererEditor rendererEditor = new ComboBoxCellRendererEditor(models);
        table.getColumnModel().getColumn(1).setCellRenderer(rendererEditor);
        table.getColumnModel().getColumn(1).setCellEditor(rendererEditor);

        this.add(table);
        this.setVisible(true);

    }

    private static class ComboBoxCellRendererEditor extends AbstractCellEditor implements TableCellRenderer, TableCellEditor {

        private JComboBox<String> comboBox;
        private Map<Integer, ComboBoxModel<String>> models;

        public ComboBoxCellRendererEditor(Map<Integer, ComboBoxModel<String>> models) {
            comboBox = new JComboBox<>();
            comboBox.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    stopCellEditing();
                }
            });
            this.models = models;
        }

        protected void configure(Object value, int row) {
            ComboBoxModel<String> model = models.get(row);
            if (model == null) {
                model = new DefaultComboBoxModel<>();
            }
            comboBox.setModel(model);
            comboBox.setSelectedItem(value);
        }

        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            configure(value, row);
            return comboBox;
        }

        @Override
        public Object getCellEditorValue() {
            return comboBox.getSelectedItem();
        }

        @Override
        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
            configure(value, row);
            return comboBox;
        }
    }
}

答案 1 :(得分:0)

添加这段代码解决了所有问题。

column.setCellRenderer(new TableCellRenderer() {
                JComboBox box = new JComboBox();

                @Override
                public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
                        int row, int column) {
                    box.removeAllItems();
                    box.addItem(value.toString());
                    return box;
                }
            });