2010-10-04 77 views
2

我遵循本指南中的一些提示:JTable with horizontal scrollbar但仍有问题。Java Swing;嵌入在JScrolledPane中的JTable的水平滚动问题

我有两个列标题:名称和说明(我们在这前用途)

我希望能够水平滚动每当增加了一个入口(即:名称/说明仅有1线) 。但是,Swing似乎并没有默认这种行为!

我有一个JTable嵌入ScrollPane。 JScrollPane中有下列参数:JScrollPane.VERTICAL_SCROLLBAR_​​AS_NEEDED和JScrollPane.HORIZONTAL_SCROLLBAR_​​AS_NEEDED

如果我禁用与:myTable.AutoResizeMode(AUTO_RESIZE_OFF)列标题不填满整个表(也许只是表的1/2)。我必须手动调整“说明”列来查看整个事情。

如何进行自动调整,但水平滚动仍然有效?

回答

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

自动调整大小意味着自动调整大小以避免滚动。

因此,答案是没有标准JTable

退房JXTable,看看它是否你想要做什么(我没有用它自己)。

2

一种方法可能是在创建表格时使用setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS),然后使用setPreferredScrollableViewportSize()指定所需的尺寸。在你的窗口pack()之后,使用setAutoResizeMode(JTable.AUTO_RESIZE_OFF)来允许水平滚动。

1

如果我禁用与: myTable.AutoResizeMode(AUTO_RESIZE_OFF) 列标题不填满整个 表(也许只是1/2的 表)。

默认每列只有75象素宽。您可以将说明列的宽度更改为任何您想要的值。阅读JTable API,您将在“如何使用表格”中找到Swing教程的链接,该教程解释了如何执行此操作。

但是,即使使用此方法,如果用户调整帧大小,列大小也不会改变。你想要处理这种情况,那么你需要添加一个ComponentListener到表(或者滚动窗格)。然后,无论何时激发componentResized()方法,您可以总计两列的宽度,然后根据需要调整说明列的宽度,以确保列总宽度不小于表格的宽度。

我必须手动调整 “说明”列以查看整个 的事情。

如果你知道你的描述列将永远是大到足以填满滚动窗格的视口,那么你可以使用Table Column Adjuster自动计算

+0

1这是一个比较基因ral解决方案比接受的答案。 – trashgod 2010-10-08 01:02:47