Java JTable设置列宽

我有一个JTable,其中我设置列大小如下:

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); 

这工作正常,但是当表最大化时,我得到最后一列右侧的空白空间。 resize后,是否可以将最后一列调整到窗口的末尾?

我在文档中find了AUTO_RESIZE_LAST_COLUMN属性,但不起作用。

编辑: JTableJScrollPane中设置了它的首选大小。

如果在最后一列而不是 setPreferredWidth(400)上调用setMinWidth(400) ,会发生什么情况?

JTable的JavaDoc中,请仔细阅读doLayout()的文档。 以下是一些select位:

当由于封闭窗口的大小而调用该方法时,resizingColumn为null。 这意味着resize已经发生在JTable的“外部”,并且变化(或“delta”)应该分配给所有的列,而不pipe这个JTable的自动resize模式。

这可能是为什么AUTO_RESIZE_LAST_COLUMN没有帮助你。

注意:当一个JTable对列的宽度进行调整时,它绝对地遵守它们的最小值和最大值。

这就是说,除了最后一列以外,你可能需要设置Min == Max,然后在最后一列设置Min = Preferred,或者不设置Max或者为Max设置一个非常大的值。

使用JTable.AUTO_RESIZE_OFF ,表格不会为您更改任何列的大小,因此将采用您的首选设置。 如果您的目标是将列默认设置为您的首选大小,除了让最后一列填充窗格的其余部分,您可以select使用JTable.AUTO_RESIZE_LAST_COLUMN autoResizeMode,但与TableColumn.setMaxWidth()使用时可能最有效TableColumn.setMaxWidth()代替TableColumn.setPreferredWidth(),而不是最后一列。

一旦您满意AUTO_RESIZE_LAST_COLUMN实际上可以工作,您可以尝试组合TableColumn.setMaxWidth()TableColumn.setMinWidth()

JTable.AUTO_RESIZE_LAST_COLUMN定义为“在所有resize操作期间,只对最后一列应用调整” ,这意味着您必须在代码的末尾设置autoresizemode ,否则setPreferredWidth()将不会影响任何内容!

所以在你的情况下,这将是正确的方法:

 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); 

阅读Kleopatra的评论(她第二次,她build议看看javax.swing.JXTable ,现在我很抱歉,我没有看看第一次:))我build议你按照链接

我有这个解决scheme的同样的问题:(但我build议你按照上面的链接)在调整表的大小,表的列宽度缩放到当前表的总宽度。 要做到这一点我使用(相对)列宽度的全局数组int):

 private int[] columnWidths=null; 

我使用这个函数来设置表格列的宽度:

 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); } } 

设定我拨打的数据时:

  setColumnWidths(this.columnWidths); 

在改变我调用ComponentListener设置为表的父(在我的情况下,JScrollPane是我的表的容器):

 public void componentResized(ComponentEvent componentEvent) { this.setColumnWidths(this.columnWidths); } 

请注意,JTable表也是全局的:

 private JTable table; 

在这里,我设置了听众:

  scrollPane=new JScrollPane(table); scrollPane.addComponentListener(this); 

使用这种方法

 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; } 

或者扩展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; } } } 

接着

 table.setColumnWidths(30, 150, 100, 100); 
 fireTableStructureChanged(); 

将默认调整行为 ! 如果在您的代码中某处调用了此方法,则设置了列大小调整属性后,所有设置都将被重置。 这种副作用可以间接发生。 Fe作为链接数据模型的结果,在设置属性之后,以调用此方法的方式进行更改。

使用这个代码。 它为我工作。 我考虑了3列。 更改您的代码的循环值。

 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); }