java swing jtable width jtableheader

Java JTable no puede establecer el ancho de la columna



swing width (2)

Intento establecer el ancho de las columnas, pero no funcionó en absoluto, he estado buscando respuestas durante horas, y aquí está mi código. ¿Alguien puede decirme cuál es el problema? Gracias por adelantado.

String [] columns = {"Day","StratTime","EndTime","Description"}; mtbl = new DefaultTableModel(); tbl = new JTable(mtbl); jsPane = new JScrollPane(tbl); tbl.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); for (int i = 0; i < Timedcolumns.length; i++) { mtbl.addColumn(columns[i]); tbl.getColumnModel().getColumn(i).setPreferredWidth(100); }


Como resultado de addColumn() , JTable puede terminar reconstruyendo todas las columnas. Aquí hay un fragmento de JTable.tableChanged() :

public void tableChanged(TableModelEvent e) { if (e == null || e.getFirstRow() == TableModelEvent.HEADER_ROW) { ... if (getAutoCreateColumnsFromModel()) { // This will effect invalidation of the JTable and JTableHeader. createDefaultColumnsFromModel(); return; } ...

TableModelEvent.HEADER_ROW se addColumn() como resultado de la addColumn() de addColumn() por DefaultTableModel . addColumn ejecuta fireTableStructureChanged :

public void fireTableStructureChanged() { fireTableChanged(new TableModelEvent(this, TableModelEvent.HEADER_ROW)); }

createDefaultColumnsFromModel() configurando el tamaño preferido solo en la última columna que se agregó, ya que el resto de las columnas fueron recreadas por createDefaultColumnsFromModel() .

Con todo, probablemente sea más sencillo establecer tamaños preferidos después de que todas las columnas se hayan creado en un bucle separado.


Descubrí que, además de establecer el Ancho preferido de una columna, también es útil establecer maxWidth. Dependiendo de lo que esté tratando de lograr, también puede establecer el minWidth.

for (int i = 0; i < Timedcolumns.length; i++) { mtbl.addColumn(columns[i]); tbl.getColumnModel().getColumn(i).setPreferredWidth(100); tbl.getColumnModel().getColumn(i).setMaxWidth(100); }