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
属性,但不起作用。
编辑: JTable
在JScrollPane
中设置了它的首选大小。
如果在最后一列而不是 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); }