简体   繁体   中英

JComboBox on cell of JTable

I have a JTable object and i would add 5 different JComboBox on a single column.

I've so tried:

table.getColumnModel().getColumn(3).setCellEditor(new DefaultCellEditor(jcombo));

but this add the same JComboBox to all cells of that column. How can i do to add different ones on the same column?

Thank you!

Basically, you need to modify the model which the combobox is using depending on the row.

The following example allows you to specify a ComboBoxModel for a given row and provide a default ComboBoxModel to be used when one is not specified for the row.

Generally speaking though, each column should be of the same type...

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.util.HashMap;
import java.util.Map;
import javax.swing.ComboBoxModel;
import javax.swing.DefaultCellEditor;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableModel;

public class TestCombo {

    public static void main(String[] args) {
        new TestCombo();
    }

    public TestCombo() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                DefaultTableModel model = new DefaultTableModel(new Object[]{"Stuff"}, 5);
                JTable table = new JTable(model);
                table.setGridColor(Color.LIGHT_GRAY);

                MyComboBoxCellEditor editor = new MyComboBoxCellEditor();
                editor.setModelForRow(0, new DefaultComboBoxModel(new Object[]{"Banana", "Peach", "Pear"}));
                editor.setModelForRow(1, new DefaultComboBoxModel(new Object[]{"Dog", "Cat", "T-Rex"}));
                editor.setModelForRow(2, new DefaultComboBoxModel(new Object[]{"Car", "Truck", "Hovercraft"}));
                editor.setModelForRow(3, new DefaultComboBoxModel(new Object[]{"Helicopter", "Plane", "Rocket"}));
                editor.setModelForRow(4, new DefaultComboBoxModel(new Object[]{"PC", "Mac", "Linux"}));
                table.getColumnModel().getColumn(0).setCellEditor(editor);

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new JScrollPane(table));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class MyComboBoxCellEditor extends DefaultCellEditor {

        private ComboBoxModel defaultModel;
        private Map<Integer, ComboBoxModel> mapModels;

        public MyComboBoxCellEditor() {
            super(new JComboBox());
            mapModels = new HashMap<>(25);
            defaultModel = new DefaultComboBoxModel();
        }

        public void setDefaultModel(ComboBoxModel model) {
            defaultModel = model;
        }

        public void setModelForRow(int row, ComboBoxModel model) {
            mapModels.put(row, model);
        }

        public ComboBoxModel getDefaultModel() {
            return defaultModel;
        }

        public ComboBoxModel getModelForRow(int row) {
            return mapModels.get(row);
        }

        @Override
        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
            JComboBox comboBox = (JComboBox) getComponent();            
            ComboBoxModel model = getModelForRow(row);
            if (model == null) {
                model = getDefaultModel();
            }
            comboBox.setModel(model);
            return super.getTableCellEditorComponent(table, value, isSelected, row, column); //To change body of generated methods, choose Tools | Templates.
        }

    }

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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