2013-05-03 65 views
1

對於面板內部的JTable,如果面板變大,如何將額外空間分配給某些列(在我的情況中爲最後一列,儘管如此可能是不錯的,提供「列3,4和8將獲得額外的空間)。當容器大小發生變化時,JTable僅調整所選列的大小

我想允許用戶更改列大小爲手動的所有列。

我試過table.setAutoResizeMode( JTable.AUTO_RESIZE_LAST_COLUMN); 向JTable調整大小時可調整大小的所有列分配額外空間。對於doLayout(),JavaDoc for JTable中說:

當由於調整封閉窗口的大小而調用該方法時,resizingColumn爲null。這意味着調整大小已經發生在JTable的「外部」,並且變化(或「delta」)應該分配給所有列,而不管此JTable的自動調整大小模式。

可能有一種方法可以攔截「JTable正在調整大小」事件,並執行一些自定義操作,但我一直無法弄清楚。

另一種解決方案是在 How to exclude columns from auto-resizing in a JTable 介紹雖然它並沒有真正告訴我如何在擺動。

回答

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); 
      } 
     }); 
    } 
} 
+0

+1 ........... doLayout() – mKorbel 2013-05-04 07:41:50

+0

這是非常有用的,謝謝。使用這種解決方案,它爲最後一列提供了所有額外的「鬆弛」空間,忽略了每列的「首選」大小,特別是在列的初始顯示中。我還想包括mKo​​rbel的方法:如果可能,請遵守首選寬度(只在表格的初始顯示時需要),並在調整表格容器大小時將任何鬆散分佈到最後一列。我想出了一些(不完整的)黑客。有沒有簡單/優雅的解決方案? – Mary 2013-05-06 16:16:46

+0

還發現http://developer.classpath.org/doc/javax/swing/JTable-source.html這是有用的(請參閱doLayout()部分),但不想重新創建整個輪子,如果我不'不得不。 – Mary 2013-05-06 16:19:16

相關問題