2012-02-03 8 views
5

Estoy intentando hacer una columna en una tabla JX para ser un cuadro combinado. Es difícil explicar el problema que estoy enfrentando. Cuando hace clic en el menú desplegable, a veces el menú desplegable no permanece abierto el tiempo suficiente para que elija el valor. Simplemente se cierra y se elige un valor. A veces permanece abierto para que usted elija un valor. Aquí está la SSCCE:Problema con JComboBox en una 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()); 
    } 
} 
+0

¿Puedes replicar el problema con 'JTable'? –

+3

@AndrewThompson, sí, el mismo problema. No es una solución, solo un cuidado (no relacionado): no use la misma instancia de comboBoxModel tanto en el renderizador como en el editor: el editor escucha permanentemente el modelo, lo que puede ocasionar efectos extraños, incluso corromper los datos – kleopatra

+0

Hmm ... parece una variante de uno de los errores más antiguos de Swing (no tengo la identificación, demasiado floja para buscar en el notoriamente flojo desfile de errores) que pensé que estaba arreglado: sucede con el core JTable, core default (etiqueta) renderizador y núcleo predeterminado comboEditor: al hacer clic primero en la celda, a veces se muestra la ventana emergente y, a veces, no se muestra (aunque la tabla siempre está en estado de edición, afaics) – kleopatra

Respuesta

1

Para resolver estas cuestiones asegurarse de que usted no comparten la misma instancia de la DefaultComboxBoxModel para el editor y procesador .. Así que en lugar de esto:

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)); 

hacer esto:

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"}))); 
+0

[mejor sería mirar aquí] (http://stackoverflow.com/a/9709633/714968) – mKorbel