Problem with JComboBox in JXTable

I am trying to make a column in JXTable as a combo box. Its hard to explain the problem that I am facing. When you click on a dropdown menu, sometimes the dropdown menu does not stay open long enough for you to select a value. It just closes and some value is selected. From time to time, it remains open for you to select a value. Here is SSCCE:

import java.awt.Color;

import javax.swing.ComboBoxModel;
import javax.swing.DefaultCellEditor;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.table.DefaultTableModel;

import org.jdesktop.swingx.JXFrame;
import org.jdesktop.swingx.JXTable;
import org.jdesktop.swingx.renderer.CellContext;
import org.jdesktop.swingx.renderer.ComponentProvider;
import org.jdesktop.swingx.renderer.DefaultTableRenderer;

public class Test {

    public static void main(String[] args) {
        JXFrame frame=new JXFrame();
        Object[][] rows = new Object[10][];

        for (int i = 0; i < rows.length; i++) {
        rows[i] = new Object[]{
        "Test data ","Yes"};
        }

        DefaultTableModel model = new DefaultTableModel(rows,
        new String[]{
        "Title 1", "Title 2"
        });

        final JXTable table = new JXTable(model);
        DefaultComboBoxModel cmodel = new DefaultComboBoxModel(new String[] {"Yes","No","Maybe"});
        table.getColumnExt(1).setCellRenderer(new DefaultTableRenderer(new ComboBoxProvider(cmodel)));
        table.getColumnExt(1).setCellEditor(new ComboBoxEditor(cmodel));
        table.setVisibleRowCount(10);
    frame.setContentPane(table);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
        frame.setVisible(true);
    }
}

class ComboBoxEditor extends DefaultCellEditor {
    public ComboBoxEditor(ComboBoxModel model) {
        super(new JComboBox(model));
    }
}

class ComboBoxProvider extends ComponentProvider<JComboBox> {
    private static final long serialVersionUID = 1L;
    private JComboBox box;
    public ComboBoxProvider(ComboBoxModel model){
        box.setModel(model);
    }
    @Override
    protected void configureState(CellContext context) {
        box.setForeground(Color.black);
    }
    @Override
    protected JComboBox createRendererComponent() {
        box = new JComboBox();
        box.setForeground(Color.black);
        return box;
    }
    @Override
    protected void format(CellContext context) {
        box.setForeground(Color.black);
        rendererComponent.setSelectedItem(context.getValue());
    }
}
+5
source share
1 answer

To solve these problems, make sure that you are not using the same instance of DefaultComboxBoxModel for the editor and the renderer. Therefore instead:

DefaultComboBoxModel cmodel = new DefaultComboBoxModel(new String[] {"Yes","No","Maybe"});
    table.getColumnExt(1).setCellRenderer(new DefaultTableRenderer(new ComboBoxProvider(cmodel)));
    table.getColumnExt(1).setCellEditor(new ComboBoxEditor(cmodel));

Do it:

    table.getColumnExt(1).setCellRenderer(new DefaultTableRenderer(new ComboBoxProvider(
             new DefaultComboBoxModel(new String[] {"Yes","No","Maybe"}))));
    table.getColumnExt(1).setCellEditor(new ComboBoxEditor(
            new DefaultComboBoxModel(new String[] {"Yes","No","Maybe"})));
+1
source

All Articles