I am trying to make a column in a JXTable to be a combo box. Its difficult to explain the problem I am facing. When you click on the drop down, at times the drop down does not stay open long enough for you to choose the value. It just closes and some value is chosen. At times it stays open for you to choose a value. Here's the 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());
}
}
To solve this issues make sure you dont share the same instance of the DefaultComboxBoxModel for the editor and renderer.. So instead of this:
Do this: