java - tabla - Poniendo JComboBox en JTable
pasar datos de un combobox a un jtable (9)
Quiero poner JComboBoxes individuales en cada celda de una JTable. es decir. El contenido de JComboBox no es idéntico para cada celda.
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));
dónde
public class MyComboBoxEditor extends DefaultCellEditor {
public MyComboBoxEditor(String[] items) {
super(new JComboBox(items));
}
}
Debe 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 un Objeto que realmente represente a otros muchos objetos.
La forma más fácil es implementar su propio modelo de tabla
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);
}
}
Cargue esto en usted 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 ().
Esta página podría ayudarlo, aunque parece que tiene restricciones para tener el mismo cuadro combinado en todas las celdas de una columna.
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 establecer renderizadores de celda individuales anulando getCellRenderer).
Extienda 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 único editor de celda JComboBox para cada cuadro combinado para el que se obtiene un valor.
@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 luego, anule el método toString
de JComboBox
.
Estoy seguro de que esto resolverá tu problema. Mencione en qué columna necesita configurar el cuadro combinado en .getColumn (columna int)
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));
}
El contenido de JComboBox es idéntico para cada selección de filas 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 de filas.
Este artículo lo explica muy bien: http://www.javaworld.com/javaworld/javatips/jw-javatip102.html
Además de cellEditor, es necesario hacer el cellRenderer para pintar el combobox 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;
}
}