简体   繁体   English

选择值时无法更新JTable中的JComboBox

[英]Can't update JComboBox in JTable when value is selected

I would like to have a JTable with JComboBox es that is always visible. 我想有一个JTableJComboBox始终可见。 My problem is when I click on a JComboBox and select a value, my JComboBox is not updated. 我的问题是,当我单击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;
        }
    }
}

You've kinda got in backwards and twisted around. 您有点倒退了。 Instead of trying to have a number of combobox editors, you should have one, which is then configured based on the row. 您应该拥有一个,然后根据行进行配置,而不是尝试使用多个组合框编辑器。

Based on this idea, you could have a single class act as both the renderer and the editor, for example 基于此想法,例如,您可以让一个类同时充当渲染器和编辑器

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;
        }
    }
}

adding this piece of code solved everything. 添加这段代码可以解决所有问题。

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;
                }
            });

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM