Sto cercando di fare in modo che una colonna in un JXTable sia una casella combinata. È difficile spiegare il problema che sto affrontando. Quando fai clic sul menu a discesa, a volte il menu a discesa non rimane aperto abbastanza a lungo da consentire la scelta del valore. Si chiude e viene scelto un valore. A volte rimane aperto per voi per scegliere un valore. Ecco lo SSCCE:Problema con un JComboBox in un JXTable
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());
}
}
È possibile replicare il problema con 'JTable'? –
@AndrewThompson sì, lo stesso problema. Non una soluzione, solo una (non correlata) attenzione: non usare la stessa istanza di comboBoxModel sia nel renderer che nell'editor - l'editor ascolta permanentemente il modello che può portare a effetti bizzarri, forse anche a corrompere i dati – kleopatra
Hmm ... sembra una variante di uno dei più vecchi bug di Swing (non ho l'id, troppo pigro per cercare nella notoria bug bug parade) che pensavo fosse risolto: succede con il core JTable, core default (etichetta) renderer e core default comboEditor - al primo click nella cella, il popup a volte viene mostrato e talvolta non mostrato (sebbene la tabella sia sempre in stato di modifica, afaics) – kleopatra