2012-02-03 13 views
5

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

È possibile replicare il problema con 'JTable'? –

+3

@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

+0

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

risposta

1

Per risolvere questi problemi assicurarsi che tu non condividono la stessa istanza del DefaultComboxBoxModel per l'editor e il renderer .. Così, invece di questo:

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

fare questo:

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

[meglio sarebbe guardare qui] (http://stackoverflow.com/a/9709633/714968) – mKorbel