Java JTable在容器大小更改时仅调整选定列的大小
对于位于面板内的JTable,如果面板变大,我如何将额外空间分配给特定列(在我的情况下,分配给最后一列,尽管提供“第3、4和8列将获得额外空间”可能会更好) 我想允许用户手动更改所有列的列大小 我尝试了table.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN); 当调整JTable的大小时,会将额外的空间分配给所有可调整大小的列。在JavaDoc for JTable,for doLayout()中,表示: 当由于调整封闭窗口的大小而调用该方法时,resizingColumn为null。这意味着调整大小已在JTable的“外部”进行,并且无论该JTable的自动调整大小模式如何,更改或“增量”都应分布到所有列 也许有一种方法可以拦截“JTable正在调整大小”事件,并执行一些自定义操作,尽管我还没有弄清楚 另一种解决方案如所示 虽然它并没有真正告诉我如何在swing中使用它。Java JTable在容器大小更改时仅调整选定列的大小,java,swing,resize,jtable,Java,Swing,Resize,Jtable,对于位于面板内的JTable,如果面板变大,我如何将额外空间分配给特定列(在我的情况下,分配给最后一列,尽管提供“第3、4和8列将获得额外空间”可能会更好) 我想允许用户手动更改所有列的列大小 我尝试了table.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN); 当调整JTable的大小时,会将额外的空间分配给所有可调整大小的列。在JavaDoc for JTable,for doLayout()中,表示: 当由于调整封闭窗口的大小而调用该方法
- 请参阅常数
表。setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
- 默认宽度为80px
- 可以准备初始大小,更多信息请参见Oracle教程
- 请参阅常数
表。setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
- 默认宽度为80px
- 可以准备初始大小,更多信息请参见Oracle教程
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);
}
});
}
}
覆盖
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);
}
});
}
}
这是非常有用的,谢谢。使用此解决方案,它为最后一列提供了所有额外的“空闲”空间,忽略了每列的“首选”大小,特别是在列的初始显示上。我也想包括mKorbel的方法:如果可能,遵循首选宽度(仅在表的初始显示上需要?),并在调整表容器的大小时将所有空闲时间分配到最后一列。我提出了一些(不完整的)技巧。有没有简单/优雅的解决方案?也发现了哪些有用(请参阅doLayout()部分),但如果不需要的话,我不想重新设计整个轮子。
如果可能的话,我想使用首选宽度(仅在表格的初始显示时需要?)
-这就是代码的工作方式。将上面的示例更改为使用setSize(400200),而不是使用pack()。前两列以其首选宽度75显示,剩余空间将显示到第三列。这非常有用,谢谢。使用此解决方案,它将所有额外的“空闲”空间显示到最后一列,而忽略“首选”列“每个列的大小,特别是在列的初始显示上。我还想介绍一下mKorbel的方法:如果可能的话,遵循首选宽度(仅在表格的初始显示时需要),并在调整表格容器的大小时将所有松弛部分分配到最后一列。我想出了一些(不完整的)技巧。有没有简单/优雅的解决方案?也找到了有用的解决方案(请参阅doLayout()一节),但如果没有必要的话,我不想重新设计整个轮子。如果可能的话,我想尊重首选的宽度(仅在表格的初始显示时需要)
-这就是代码的工作方式。将上述示例更改为使用setSize(400200),而不是使用pack()。前两列以其首选宽度75显示,剩余空间用于第三列。