2009-01-19 18 views
14

Quiero poner JComboBoxes individuales en cada celda de una JTable. es decir. El contenido de JComboBox no es idéntico para cada celda.Poner JComboBox en JTable

Básicamente me gustaría poder llamar al siguiente código para agregar una fila de JComboBox en JTable. Alguien tiene alguna idea? Gracias

JComboBox cb1 = new JComboBox(...); 
JComboBox cb2 = new JComboBox(...); 
model.addRow(new Object[] {"Row name", cb1, cb2}); 

JComboBox cb3 = new JComboBox(...); 
JComboBox cb4 = new JComboBox(...); 
model.addRow(new Object[] {"Row name 2", cb3, cb4}); 

El código de ejemplo más cercano que puedo encontrar es el siguiente. Pero es para donde el contenido de JComboBox es idéntico para la columna individual. No es la solución que necesito.

TableColumn col = table.getColumnModel().getColumn(vColIndex); 
col.setCellEditor(new MyComboBoxEditor(values)); 

donde

public class MyComboBoxEditor extends DefaultCellEditor { 
    public MyComboBoxEditor(String[] items) { 
     super(new JComboBox(items)); 
    } 
} 
+0

Muy fácil: mesa .getColumnModel(). getColumn (2) .setCellEditor (nuevo DefaultCellEditor (myComboBox)); donde obvioulsy carga myComboBox con sus valores. ¡No necesitas ninguna clase extra! – Elmue

Respuesta

-8

La forma más fácil es poner en práctica su propio TableModel

public class MyModel extends AbstractTableModel { 
    List rows; 

    public int getRowCount() { 
     return rows.size(); 
    } 

    public int getColumnCount() { 
     return 4; 
    } 

    public Object getValueAt(int row, int column) { 
     return rows.get(row).getCol(col); //assuming your row "Object" has a getCol() 
    } 

    public Class<?> getColumnClass(int col) { 
     return Boolean.class; 
    } 

    public void setValueAt(Object aValue, int rowIndex, int columnIndex) { 
     rows.get(rowIndex).getCol(columnIndex).setValue(aValue); 
    } 

} 

carga que esto en JTable. Si no ha reemplazado el procesador de celdas predeterminado por booleano, todas las celdas se mostrarán como casillas de verificación gracias a la implementación de getColumnClass(). Toda la entrada del usuario a estas casillas de verificación se recopila con nuestro setValueAt().

+20

Err, preguntó acerca de un JComboBox, no JCheckBox. ¿Cómo esta respuesta fue aceptada? –

+0

@SarelBotha Porque OP fue visto por última vez el 31 de enero de 2009 y la respuesta correcta es del 3 de junio de 2009. Aparentemente, nadie piensa que esto sea un problema. Ver [meta] (http://meta.stackexchange.com/questions/161946/rethinking-sort-order-of-answers). – PiTheNumber

0

This page que podría ayudar, aunque parece que se limitan a tener el mismo cuadro combinado en todas las celdas de una columna.

2

Necesita anular:

Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) 

... en TableCellEditor. El valor transferido a este método es lo que puede poner en su JComboBox. Eso significa que el 'valor' para esa celda en particular debe ser algo que pueda traducirse en una colección. Podría ser simplemente una Lista de objetos o podría ser un POJO con campos que podrían convertirse en un JComboBox.

Así que simplemente edite MyComboBoxEditor para anular ese método y cambie su modelo para permitir que un objeto realmente represente a otros objetos.

0

Necesita crear una subclase de JTable para anular el método TableCellEditor getCellEditor (int row, int column).

Esto le permite configurar editores de celda arbitrarios para cualquier combinación de fila y columna. La forma predeterminada es configurar el editor de celda para una columna completa.

(También puede configurar procesadores de celdas individuales reemplazando getCellRenderer.)

9

Extender JTable con este código:

@Override 
public TableCellEditor getCellEditor(int row, int column) { 
    Object value = super.getValueAt(row, column); 
    if(value != null) { 
     if(value instanceof JComboBox) { 
      return new DefaultCellEditor((JComboBox)value); 
     } 
      return getDefaultEditor(value.getClass()); 
    } 
    return super.getCellEditor(row, column); 
} 

Esto creará un editor única célula JComboBox para cada cuadro combinado se obtiene la una valor por.

+3

+1 - uno también debería establecer un 'TableCellRenderer' personalizado en' TableColumnModel' de la columna correspondiente para asegurarse de que se dibuja el valor seleccionado en lugar de una cadena 'javax.swing.JCombobox [...]' mientras que la celda no está siendo editada. Este 'TableCellRenderer' debería implementar' getTableCellRendererComponent (..) 'y podría devolver un' JLabel' con el valor de 'JComboBox.getSelectedItem(). ToString()' (después de buscar null punteros). –

1
@Override 
public TableCellEditor getCellEditor(int row, int column) { 
    Object value = super.getValueAt(row, column); 
    if(value != null) { 
     if(value instanceof JComboBox) { 
      return new DefaultCellEditor((JComboBox)value); 
     } 
      return getDefaultEditor(value.getClass()); 
    } 
    return super.getCellEditor(row, column); 
} 

Y entonces, reemplazar el método de toStringJComboBox.

+1

Esto realmente se repite [otra respuesta] (http://stackoverflow.com/a/946949/572834), pero agrega un punto: use un 'JComboBox' personalizado para que su método' toString() 'devuelva el valor seleccionado. En este caso, podría usar la implementación 'TableCellRenderer' predeterminada. –

2

Estoy seguro de que esto resolverá su problema. Mencione en qué columna necesita configurar el cuadro combinado.GetColumn (int columna)

private void addComboToTable(JComboBox combo) { 
    TableColumn gradeColumn = YourTable.getColumnModel().getColumn(0); 
    JComboBox comboBox = combo; 
    comboBox.removeAllItems(); 
    try { 
     comboBox.addItem("Item 1"); 
     comboBox.addItem("Item 2"); 
     comboBox.addItem("Item 3"); 
    } catch (NullPointerException e) { 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    gradeColumn.setCellEditor(new DefaultCellEditor(comboBox)); 
} 
2

El contenido JComboBox es render idéntica para cada selección de fila porque JTable no ofrece la capacidad de tener más de un editor por columna. Debe extender la clase JTable para admitir una selección adicional para las filas.

En este artículo se explica muy bien: http://www.javaworld.com/javaworld/javatips/jw-javatip102.html

2

Además de cellEditor es necesario para hacer el cellRenderer para pintar el cuadro combinado en la celda, mira esto:

public void example(){ 

     TableColumn tmpColum =table.getColumnModel().getColumn(1); 
     String[] DATA = { "Data 1", "Data 2", "Data 3", "Data 4" }; 
     JComboBox comboBox = new JComboBox(DATA); 

     DefaultCellEditor defaultCellEditor=new DefaultCellEditor(comboBox); 
     tmpColum.setCellEditor(defaultCellEditor); 
     tmpColum.setCellRenderer(new CheckBoxCellRenderer(comboBox)); 
     table.repaint(); 
    } 


/** 
    Custom class for adding elements in the JComboBox. 
*/ 
class CheckBoxCellRenderer implements TableCellRenderer { 
     JComboBox combo; 
     public CheckBoxCellRenderer(JComboBox comboBox) { 
      this.combo = new JComboBox(); 
      for (int i=0; i<comboBox.getItemCount(); i++){ 
       combo.addItem(comboBox.getItemAt(i)); 
      } 
     } 
     public Component getTableCellRendererComponent(JTable jtable, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
      combo.setSelectedItem(value); 
      return combo; 
     } 
    }