我遵循了本指南中的一些提示:JTable with horizontal scrollbar但仍有问题。
我有两个列标题:名称和描述(出于我们在此例中的目的)
我想能够在添加条目时水平滚动(即:名称/描述只有1行)。但是,Swing似乎没有默认这种行为!
我在ScrollPane中嵌入了一个JTable。 JScrollPane具有以下参数:JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED和JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED
如果我禁用:myTable.AutoResizeMode(AUTO_RESIZE_OFF)
,则列标题不会填满整个表格(可能只是表格的1/2)。我必须手动调整“描述”列的大小以查看整个事情。
如何进行自动调整,但水平滚动仍然有效?
答案 0 :(得分:2)
一种方法可能是在创建表格时使用setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS)
,然后使用setPreferredScrollableViewportSize()
指定所需的大小。在pack()
窗口后,使用setAutoResizeMode(JTable.AUTO_RESIZE_OFF)
允许水平滚动。
答案 1 :(得分:2)
您可以按如下方式扩展JTable:
public class JHorizontalFriendlyTable extends JTable {
@Override
public Dimension getPreferredSize() {
if (getParent () instanceof JViewport) {
if (
((JViewport) getParent()).getWidth() > super.getPreferredSize().width)
) {
return getMinimumSize();
}
}
return super.getPreferredSize();
}
@Override
public boolean getScrollableTracksViewportWidth () {
if (autoResizeMode != AUTO_RESIZE_OFF) {
if (getParent() instanceof JViewport) {
return (((JViewport) getParent()).getWidth() > getPreferredSize().width);
}
return true;
}
return false;
}
}
样本用法:
jScrollPane1 = new JScrollPane();
TableModel jTable1Model = new DefaultTableModel(...);
JTable jTable1 = new JHorizontalFriendlyTable();
jScrollPane1.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
jScrollPane1.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
jScrollPane1.setViewPortView(jTable1);
jTable1.setModel(jTable1Model);
jTable1.setPreferredSize(new java.awt.Dimension(1051,518));
jTable1.setPreferredScrollableViewPortSize(new java.awt.Dimension(1000,528));
jTable1.getSize(new java.awt.Dimension(1051, 528));
if (jTable1.getPreferredScrollableViewPortSize().getWidth() >
((JViewPort) jTable1.getParent()).getPreferredSize().getWidth())
{
jTable1.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
jTable1.doLayout();
}
jTable1.setDragEnabled(false);
jTable1.setColumnSelectionAllowed(false);
jTable1.getTableHeader().setReorderingAllowed(false);
答案 2 :(得分:1)
答案 3 :(得分:1)
如果我禁用: myTable.AutoResizeMode(AUTO_RESIZE_OFF) 列标题没有填满 整张桌子(也许只是其中的一半) 表)。
默认情况下,每列只有75像素宽。您可以将描述列的宽度更改为您想要的任何内容。阅读JTable
API,您将找到关于“如何使用表格”的Swing教程的链接,该教程解释了如何执行此操作。
但是,即使使用此方法,如果用户调整帧大小,列大小也不会改变。您想要处理这种情况,然后需要向表中添加ComponentListener
(或者可能是滚动窗格)。然后,每当触发componentResized()
方法时,您可以总计两列的宽度,然后根据需要调整描述列的宽度,以确保列总宽度不小于表的宽度。
我必须手动调整大小 “描述”栏目看整体 的事情。
如果您知道您的描述列总是足够大以填充滚动窗格的视口,那么您可以使用Table Column Adjuster自动计算描述列的最大宽度