2014-04-21 335 views
1


我得到了一個JTable,我應用了AUTO_RESIZE_LAST_COLUMN。當我向左或向右拖動列時,它會自動調整最後一列的大小。
但是,JTable通過BorderLayout管理器連接到JPanel。當我調整JFrame的大小時,JPanel調整大小,並且由於JTable填充JPanel,JTable也調整大小。但是當我調整JFrame的大小時,AUTO_RESIZE_LAST_COLUMN不起作用,而是調整所有列的大小。JTable列可能在JFrame調整大小時不調整大小

我希望它只有 auto_resize最後一列,當JFrame更改大小時,而不是調整所有列的大小。

代碼:

import java.awt.*; 
import javax.swing.*; 
import javax.swing.table.*; 

public class JTableResize extends JFrame { 

    private JTable table; 
    private JPanel panel; 
    private JScrollPane pane; 

    DefaultTableModel model = new DefaultTableModel(); 

    public JTableResize() { 
     super("JTable - Resize Problem"); 

     setLayout(new BorderLayout()); 

     panel = new JPanel(); 
     panel.setLayout(new BorderLayout()); 
     panel.setBackground(Color.red); 
     add(panel, BorderLayout.CENTER); 

     table = new JTable(model); 
     //panel.add(table); 
     model.addColumn("Resize"); 
     model.addColumn("Problem"); 
     model.addColumn("........"); 
     model.addColumn("This should resize"); 

     pane = new JScrollPane(table); 
     panel.add(pane); 

     //this is supposed to resize last column.. It works when you drag in the columns, but not when frame are resized 
     table.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN); 
     table.getTableHeader().setReorderingAllowed(false); 
     table.setShowVerticalLines(false); 

     for (int i = 0; i <= 50; i++) { 
      model.addRow(new Object[] {i, i, i, i}); 
     } 
    } 

    public static void main(String[] args) { 
     JTableResize jtr = new JTableResize(); 
     jtr.setSize(500, 500); 
     jtr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     jtr.setVisible(true); 
    } 
} 
+0

我沒有看到任何你的代碼錯誤.. !! !它工作得很好。 – Mac

+0

@Mac嘗試運行它,並調整窗口的大小(使窗口變大)。您應該看到,JTable中的所有列正在調整大小。但我想要它,只調整最後一列(最右側)。所以當我把窗口放大時,只有最後一列會變大(擴展)。因此,第一列應重新調整大小,當窗口變大時:) –

+0

下一次,請改善原始問題,而不是創建一個新問題。 –

回答

4

退房從JTabledoLayout()方法的API文檔。

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

所以這種行爲默認情況下不支持。

重寫的doLayout JTable中的()方法,並設置「調整列」到最後一列,似乎這樣的伎倆:

@Override 
public void doLayout() 
{ 
    if (tableHeader != null) 
    { 
     TableColumn resizingColumn = tableHeader.getResizingColumn(); 
     // Viewport size changed. Increase last columns width 

     if (resizingColumn == null) 
     { 
      TableColumnModel tcm = getColumnModel(); 
      int lastColumn = tcm.getColumnCount() - 1; 
      tableHeader.setResizingColumn(tcm.getColumn(lastColumn)) ; 
     } 
    } 

    super.doLayout(); 
} 
+0

它的工作原理,謝謝! :-) –

相關問題