tamaño - jtable en java
Java JTable setting Ancho de columna (7)
¿Qué sucede si llama a setMinWidth(400)
en la última columna en lugar de setPreferredWidth(400)
?
En JavaDoc for JTable
, lea los documentos para doLayout()
mucho cuidado. Aquí hay algunos bits de elección:
Cuando se llama al método como resultado del cambio de tamaño de una ventana adjunta, la resizingColumn es nula. Esto significa que el cambio de tamaño se ha realizado "fuera" de JTable y el cambio, o "delta", debe distribuirse a todas las columnas independientemente del modo de cambio de tamaño automático de esta JTable.
Esta podría ser la razón por la cual AUTO_RESIZE_LAST_COLUMN
no te ayudó.
Nota: Cuando una JTable realiza ajustes en el ancho de las columnas, respeta absolutamente sus valores mínimo y máximo.
Esto indica que es posible que desee establecer Mín == Máx. Para todas las columnas excepto las últimas, luego configure Min = Preferred en la última columna y no establezca Max o establezca un valor muy grande para Max.
Tengo una JTable en la que establezco el tamaño de la columna de la siguiente manera:
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
table.getColumnModel().getColumn(0).setPreferredWidth(27);
table.getColumnModel().getColumn(1).setPreferredWidth(120);
table.getColumnModel().getColumn(2).setPreferredWidth(100);
table.getColumnModel().getColumn(3).setPreferredWidth(90);
table.getColumnModel().getColumn(4).setPreferredWidth(90);
table.getColumnModel().getColumn(6).setPreferredWidth(120);
table.getColumnModel().getColumn(7).setPreferredWidth(100);
table.getColumnModel().getColumn(8).setPreferredWidth(95);
table.getColumnModel().getColumn(9).setPreferredWidth(40);
table.getColumnModel().getColumn(10).setPreferredWidth(400);
Esto funciona bien, pero cuando la tabla está maximizada, obtengo un espacio vacío a la derecha de la última columna. ¿Es posible cambiar el tamaño de la última columna al final de la ventana cuando se cambia el tamaño?
AUTO_RESIZE_LAST_COLUMN
propiedad AUTO_RESIZE_LAST_COLUMN
en documentos pero no funciona.
Editar: JTable
está en un JScrollPane
su tamaño preferido.
Con JTable.AUTO_RESIZE_OFF
, la tabla no cambiará el tamaño de ninguna de las columnas, por lo que tomará su configuración preferida. Si su objetivo es tener las columnas predeterminadas para su tamaño preferido, excepto para que la última columna llene el resto del panel, tiene la opción de usar el JTable.AUTO_RESIZE_LAST_COLUMN
tamaño JTable.AUTO_RESIZE_LAST_COLUMN
JTable.AUTO_RESIZE_LAST_COLUMN, pero podría ser más efectivo cuando se utiliza con TableColumn.setMaxWidth()
lugar de TableColumn.setPreferredWidth () para todas menos la última columna.
Una vez que esté satisfecho de que AUTO_RESIZE_LAST_COLUMN
funciona, puede experimentar con una combinación de TableColumn.setMaxWidth()
y TableColumn.setMinWidth()
Leyendo el comentario de Kleopatra (su segunda vez que sugirió echarle un vistazo a javax.swing.JXTable , y ahora lo siento, no lo eché un vistazo la primera vez :)) Te sugiero que sigas el enlace
Tenía esta solución para el mismo problema: (pero sugiero que sigas el enlace anterior) Al cambiar el tamaño de la tabla, escala el ancho de la columna de la tabla al ancho total de la tabla actual. Para hacer esto, utilizo una matriz global de entradas para los anchos de columna (relativos):
private int[] columnWidths=null;
Utilizo esta función para establecer los anchos de columna de la tabla:
public void setColumnWidths(int[] widths){
int nrCols=table.getModel().getColumnCount();
if(nrCols==0||widths==null){
return;
}
this.columnWidths=widths.clone();
//current width of the table:
int totalWidth=table.getWidth();
int totalWidthRequested=0;
int nrRequestedWidths=columnWidths.length;
int defaultWidth=(int)Math.floor((double)totalWidth/(double)nrCols);
for(int col=0;col<nrCols;col++){
int width = 0;
if(columnWidths.length>col){
width=columnWidths[col];
}
totalWidthRequested+=width;
}
//Note: for the not defined columns: use the defaultWidth
if(nrRequestedWidths<nrCols){
log.fine("Setting column widths: nr of columns do not match column widths requested");
totalWidthRequested+=((nrCols-nrRequestedWidths)*defaultWidth);
}
//calculate the scale for the column width
double factor=(double)totalWidth/(double)totalWidthRequested;
for(int col=0;col<nrCols;col++){
int width = defaultWidth;
if(columnWidths.length>col){
//scale the requested width to the current table width
width=(int)Math.floor(factor*(double)columnWidths[col]);
}
table.getColumnModel().getColumn(col).setPreferredWidth(width);
table.getColumnModel().getColumn(col).setWidth(width);
}
}
Cuando configuro los datos, llamo:
setColumnWidths(this.columnWidths);
y al cambiar llamo el ComponentListener establecido al padre de la tabla (en mi caso el JScrollPane que es el contenedor de mi tabla):
public void componentResized(ComponentEvent componentEvent) {
this.setColumnWidths(this.columnWidths);
}
tenga en cuenta que la tabla JTable también es global:
private JTable table;
Y aquí configuro al oyente:
scrollPane=new JScrollPane(table);
scrollPane.addComponentListener(this);
Usa este código Funcionó para mí Consideré por 3 columnas. Cambia el valor del ciclo para tu código.
TableColumn column = null;
for (int i = 0; i < 3; i++) {
column = table.getColumnModel().getColumn(i);
if (i == 0)
column.setMaxWidth(10);
if (i == 2)
column.setMaxWidth(50);
}
Usa este método
public static void setColumnWidths(JTable table, int... widths) {
TableColumnModel columnModel = table.getColumnModel();
for (int i = 0; i < widths.length; i++) {
if (i < columnModel.getColumnCount()) {
columnModel.getColumn(i).setMaxWidth(widths[i]);
}
else break;
}
O extienda la clase JTable
:
public class Table extends JTable {
public void setColumnWidths(int... widths) {
for (int i = 0; i < widths.length; i++) {
if (i < columnModel.getColumnCount()) {
columnModel.getColumn(i).setMaxWidth(widths[i]);
}
else break;
}
}
}
Y entonces
table.setColumnWidths(30, 150, 100, 100);
JTable.AUTO_RESIZE_LAST_COLUMN se define como "Durante todas las operaciones de cambio de tamaño, aplique los ajustes a la última columna solamente", lo que significa que debe establecer el modo autoresize al final de su código ; de lo contrario, setPreferredWidth () no afectará a nada.
Entonces, en tu caso, esta sería la forma correcta:
table.getColumnModel().getColumn(0).setPreferredWidth(27);
table.getColumnModel().getColumn(1).setPreferredWidth(120);
table.getColumnModel().getColumn(2).setPreferredWidth(100);
table.getColumnModel().getColumn(3).setPreferredWidth(90);
table.getColumnModel().getColumn(4).setPreferredWidth(90);
table.getColumnModel().getColumn(6).setPreferredWidth(120);
table.getColumnModel().getColumn(7).setPreferredWidth(100);
table.getColumnModel().getColumn(8).setPreferredWidth(95);
table.getColumnModel().getColumn(9).setPreferredWidth(40);
table.getColumnModel().getColumn(10).setPreferredWidth(400);
table.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
fireTableStructureChanged();
por defecto el comportamiento de cambio de tamaño ! Si este método se llama en algún lugar de su código DESPUÉS de establecer las propiedades de cambio de tamaño de la columna, todas sus configuraciones se restablecerán. Este efecto secundario puede ocurrir indirectamente. Fe como consecuencia de que el modelo de datos vinculado se modifique de la manera en que se llama a este método, después de establecer las propiedades.