4

I am trying to add unique JComboBoxes to a column in a JTable. I know it is possible to add a JComboBox to an entire column using

TableColumn col = table.getColumnModel().getColumn(columnNumber);
col.setCellEditor(new MyComboBoxEditor(values));

but I need each JComboBox to be different and have different Strings inside it. Any ideas?

Brian Tompsett - 汤莱恩
  • 5,753
  • 72
  • 57
  • 129
user446836
  • 733
  • 4
  • 16
  • 24
  • @hotveryspicy Please clarify your desired modification. What is meant by "shift to next cell"? Like move the value to the next column? Or move focus down one row? And what about "don't want to create combo box for each cell, only one ... for each cell"? Do you mean only one per *column*? – SeKa Mar 26 '13 at 08:01

2 Answers2

9

Override the getCellEditor(...) method. For example;

import java.awt.*;
import java.awt.event.*;
import java.util.List;
import java.util.ArrayList;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.table.*;

public class TableComboBoxByRow extends JFrame
{
    List<TableCellEditor> editors = new ArrayList<TableCellEditor>(3);

    public TableComboBoxByRow()
    {
        // Create the editors to be used for each row

        String[] items1 = { "Red", "Blue", "Green" };
        JComboBox comboBox1 = new JComboBox( items1 );
        DefaultCellEditor dce1 = new DefaultCellEditor( comboBox1 );
        editors.add( dce1 );

        String[] items2 = { "Circle", "Square", "Triangle" };
        JComboBox comboBox2 = new JComboBox( items2 );
        DefaultCellEditor dce2 = new DefaultCellEditor( comboBox2 );
        editors.add( dce2 );

        String[] items3 = { "Apple", "Orange", "Banana" };
        JComboBox comboBox3 = new JComboBox( items3 );
        DefaultCellEditor dce3 = new DefaultCellEditor( comboBox3 );
        editors.add( dce3 );

        //  Create the table with default data

        Object[][] data =
        {
            {"Color", "Red"},
            {"Shape", "Square"},
            {"Fruit", "Banana"},
            {"Plain", "Text"}
        };
        String[] columnNames = {"Type","Value"};
        DefaultTableModel model = new DefaultTableModel(data, columnNames);
        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 == 1 && row < 3)
                    return editors.get(row);
                else
                    return super.getCellEditor(row, column);
            }
        };

        JScrollPane scrollPane = new JScrollPane( table );
        getContentPane().add( scrollPane );
    }

    public static void main(String[] args)
    {
        TableComboBoxByRow frame = new TableComboBoxByRow();
        frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
        frame.pack();
        frame.setVisible(true);
    }
}
camickr
  • 321,443
  • 19
  • 166
  • 288
0

Try this:

...
final Object[] obj = {"test1", "test2", "test3"};
JTable jTable = new JTable();
TableColumn column = jTable.getColumnModel().getColumn(1);
column.setCellEditor(new AutoCompletionComboBoxEditor(obj));
...

public static class AutoCompletionComboBoxEditor extends AbstractCellEditor implements TableCellEditor {

        JComboBox cbx;

        public AutoCompletionComboBoxEditor(Object[] items) {
            cbx = new JComboBox(items);
        }

        public Component getTableCellEditorComponent(JTable table,
                Object value, boolean isSelected, int row, int column) {
            return cbx;
        }

        public Object getCellEditorValue() {
            return cbx.getSelectedItem();
        }
    }

try tell me the effect :)

-Saligh