Foro sobre Java SE > jTables y model
Creando el modelo de esta manera, todas las celdas serán no editables:
DefaultTableModel tableModel = new DefaultTableModel() {
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
};
Si deseas eliminar una tabla, no veo la necesidad de borrar todas las filas una a una. Si son pocas, no tendrá mucha importancia; pero como sean muchas...
Siempre puedes crear un nuevo modelo, y asignarlo a la tabla, sin más.
En cuanto a adaptar el ancho de las columnas al contenido: se puede hacer, aunque hay que escribir el código que lo hace. Por defecto, JTable no tiene nada parecido.
Te copio, a continuación, dos métodos que uso en mis JTable.
public void packAllColumns() {
if (getAutoResizeMode() == JTable.AUTO_RESIZE_OFF) {
int[] colArray = null;
int colCount = 0;
// we need to know the total number of columns for the current datamodel
colCount = getModel().getColumnCount();
if (colCount > 0) {
// we build an array to hold the column numbers.
// this would be the same as if the user had selected all columns one by one
colArray = new int[colCount];
for (int insets = 0; insets < colCount; insets++) {
// we set each array element to the colum number
colArray[insets] = insets;
}
// we pack the columns selected: all of them in this case
packSelectedColumns(colArray);
}
}
}
public void packSelectedColumns(final int[] colArray) {
if (getAutoResizeMode() == JTable.AUTO_RESIZE_OFF) {
// this array keeps the packing status for each column
final TableColumnModel colModel = getColumnModel();
final TableCellRenderer headerRenderer = getTableHeader().getDefaultRenderer();
final TableModel model = getModel();
final int colCount = model.getColumnCount();
final int rowCount = model.getRowCount();
for (int col : colArray) {
final TableColumn column = colModel.getColumn(col);
final Object headerValue = column.getHeaderValue();
final int modelIndex = column.getModelIndex();
int cwidth = headerRenderer.getTableCellRendererComponent(JPTable.this, headerValue, false, false, -1, col).getPreferredSize().width;
for (int row = 0; row < rowCount; row++) {
cwidth = Math.max(cwidth, getCellRenderer(row, col).getTableCellRendererComponent(JPTable.this, model.getValueAt(row, modelIndex), false, false, row, col).getPreferredSize().width);
}
if (cwidth > headerValue.toString().length()) {
column.setPreferredWidth(cwidth + colModel.getColumnMargin());
}
}
}
}
He tenido que eliminar algunas líneas, puesto que no uso el modelo por defecto, y realizo el pack de columnas de manera automática, siempre que el header sea el mismo, aunque cambie el modelo; pero creo que tal y como está compilará bien.
Si se te presentan problemas, para ajustar los anchos al viewport, en caso de que cambies el tamaño de la JTable, dímelo, y te paso un adaptador de viewport.
Me acabo de dar cuenta de que esos métodos están en una clase que extiende JTable. Si los usas directamente, tendrás que añadir a cada método específico de JTable, tu propia instancia, o bien si los usas en otra clase como helpers, pasarles un parámetro adicional, con una instancia de JTable.
Hola a todos! les escribo porque tengo unas grandes dudas.
Tengo un jTable que dependiendo de una acción, utiliza un modelo que maneja unos datos.
tableModel = new DefaultTableModel();
jTable1.setModel(tableModel);
Luego en otras clases, dependiendo de la clase, borro todo el contenido (y las columnas)
public static void clearDefaultTableModel(DefaultTableModel tableModel) {
tableModel.setRowCount(0);
for (int i = 0; i < tableModel.getRowCount(); i++) {
tableModel.removeRow(i);
}
String[] vector = null;
tableModel.setColumnIdentifiers(vector);
}
Cuando me toca llenar la tabla, creo los identificadores o columnas segun sea el caso, y luego inserto fila por fila
Object[] columnNames = {"header 1","header 2","header 3"};
tableModel.setColumnIdentifiers(columnNames);
....
String[] vector = {string1,string2,string3};
tableModel.addRow(vector);
Lo que necesito es poner la tabla no editable (ya intente cambiandole la propiedad al jTable1) y ademas a la hora de recrear el modelo, colocarle el ancho de cada columna (no tiene ciencia que la columna ID sea tan grande como la columna NOMBRE por ejemplo)
Espero me puedan ayudar, ya que esto de las tablas y los modelos me ha confundido bastante.