2010-10-04 75 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