对于面板内部的JTable,如果面板变大,我怎样才能将额外的空间分配给某些列(在我的情况下,到最后一列,尽管可能很好提供“第3列, 4和8将获得额外的空间。)
我想允许用户手动更改所有列的列大小。
我试过table.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN); 这会将额外空间分配给调整JTable大小时可调整大小的所有列。在JavaDoc for JTable中,对于doLayout(),说:
当调整封闭窗口大小调整方法时,resizingColumn为null。这意味着调整大小发生在JTable“外部”,并且无论JTable的自动调整大小模式如何,都应该将更改 - 或“delta” - 分发到所有列。
可能有办法拦截“JTable正在调整大小”事件,并做一些自定义的事情,虽然我还没弄清楚。
提出了另一种解决方案 How to exclude columns from auto-resizing in a JTable 虽然它并没有真正告诉我如何在摇摆中做到这一点。
答案 0 :(得分:3)
请参阅常量table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
默认widht为80px
可以在Oracle教程Setting and Changing Column Widths
答案 1 :(得分:3)
覆盖doLayout()
方法以拦截布局。这给出了基础知识。当最后一列宽度即将消极时,您需要确定要执行的操作。
import javax.swing.*;
import javax.swing.table.*;
public class Test2Table
{
private static Object[][] data = new Object[][]
{
{ "a", "b", "c" },
{ "d", "e", "f" }
};
private static Object[] colNames = new Object[] { "1", "2", "3" };
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run() {
JTable table = new JTable(data, colNames)
{
@Override
public void doLayout()
{
// Viewport size changed. Change last column width
if (tableHeader != null
&& tableHeader.getResizingColumn() == null)
{
TableColumnModel tcm = getColumnModel();
int delta = getParent().getWidth() - tcm.getTotalColumnWidth();
TableColumn last = tcm.getColumn(tcm.getColumnCount() - 1);
last.setPreferredWidth(last.getPreferredWidth() + delta);
last.setWidth(last.getPreferredWidth());
}
else
{
super.doLayout();
}
}
};
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new JScrollPane(table));
frame.pack();
frame.setVisible(true);
}
});
}
}