2011-05-05 72 views
3

我遇到一個問題,我有一個JTable佈局使用的GridBagLayout管理器和表中的行是不固定的數量。我打算填充指定給表格的空間及其所有單元格,但表格的最後一行與容器中的下一個組件之間存在大的空白(和白色)空間。動態改變JTable中單元格的高度與GridBagLayout的

作爲潛在的解決方案,我不知道是否可以調整單元格的高度,以填補分配給該表的空間。例如,如果有三排,那麼空間的高度應該平均分爲三排。如果只有一行,那麼這行應占用整個可用空間。

任何建議,歡迎,如果有更好的方式來達到預期的效果,請賜教。謝謝。

P.S.我在JPanel中使用JTable而不是JScrollPane,如果這有什麼區別的話。

編輯:所以我嘗試下面的代碼,這當然調整根據目前的行數行的高度,但最後一行之後,下一個組件之前,它仍然留下一個空白空間。想知道爲什麼?

// re-size the header and row height to fill the whole tPanel 
int panelHeight = tPanel.getHeight(); 
int desiredRowHeight = panelHeight/(numOfRows + 1); 
friendsInfo.getTableHeader().setPreferredSize(new Dimension(table.getColumnModel().getTotalColumnWidth(), desiredRowHeight)); 
table.setRowHeight(desiredRowHeight); 

回答

2

是的,你可以。只需設置行高。你將不得不使用類似here。很顯然,我在這裏假設你的面板有一個'不變'的大小。否則,佈局將確保將其調整到適當的大小,即表格大小。

如果是的話,那麼你可以使用你的高度每一行應採取的計算面板的高度。

EDIT1: 下面是一個例子,顯示瞭如何使用GridBagLayout來實現。我儘量讓它看起來儘可能好,但是當你將框架縮小時,它仍然有一個奇怪的行爲(很短的時間它的尺寸會變得很小)。但是,這又可能是我不知道的佈局的默認行爲。

注意:我不是使用這個佈局管理器(我個人討厭它)的專家。因此,如果有一些參數應該/不應該設置,請讓我知道(並隨時編輯答案)。

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.event.ComponentAdapter; 
import java.awt.event.ComponentEvent; 
import java.awt.event.ComponentListener; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTable; 
import javax.swing.SwingUtilities; 
import javax.swing.table.JTableHeader; 

public class TableRowResizeTest 
{ 
    public static void main(String[] args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       final JTable table = new JTable(3,3); 
       final JTableHeader tHeader = table.getTableHeader(); 
       final JPanel tPanel = new JPanel(new GridBagLayout()); 
       tPanel.setBackground(Color.CYAN); 
       ComponentListener cL = new ComponentAdapter() 
       { 
        @Override 
        public void componentResized(ComponentEvent e) 
        { 
         super.componentResized(e); 
         // re-size the header and row height to fill the whole tPanel 
         int panelHeight = tPanel.getHeight(); 
         int numOfRows = table.getRowCount(); 
         int desiredRowHeight = panelHeight/(numOfRows + 1); 
         int gap = panelHeight - desiredRowHeight * (numOfRows + 1); 
         tHeader.setPreferredSize(new Dimension(tHeader.getPreferredSize().width, 
           desiredRowHeight+gap)); 
         tHeader.revalidate(); 
         tHeader.repaint(); 
         if(desiredRowHeight <1) 
          desiredRowHeight = 1; 
         table.setRowHeight(desiredRowHeight); 
         table.revalidate(); 
         table.repaint(); 
         System.out.println("tPanel componentResized p.h="+tPanel.getHeight() 
          +"; desiredRowHeight="+desiredRowHeight+"; gap="+gap); 
        }     
       }; 
       tPanel.addComponentListener(cL); 
       GridBagConstraints c = new GridBagConstraints(); 
       c.fill = GridBagConstraints.VERTICAL; 
       c.gridx = 0; 
       c.gridy = 0; 
       c.weighty = 1.0; 
       tPanel.add(tHeader, c); 
       c.gridy = 1; 
       c.weighty = 0.0; 
       tPanel.add(table,c); 
       JPanel contentPane = new JPanel(new BorderLayout()); 
       contentPane.setBackground(Color.RED); 
       contentPane.add(tPanel); 
       JFrame f = new JFrame(); 
       f.setContentPane(contentPane); 
       f.setSize(800, 600); 
       f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       System.out.println("before f.setVisible p.h="+tPanel.getHeight()); 
       f.setVisible(true); 
       System.out.println("after f.setVisible p.h="+tPanel.getHeight()); 
      } 
     }); 
    } 
} 
+0

謝謝博羅,所以我試着打電話jPanel.getHeight(),但它返回0,所以我不能進行下一個步驟......有什麼理由? – skyork 2011-05-05 20:47:15

+0

@skyork它可能會返回零,但在開始,因爲它沒有放在父組件。但您可以在開始時調用[panel.getPreferredSize().getHeight()](http://download.oracle.com/javase/1.5.0/docs/api/javax/swing/JComponent.html#getPreferredSize()) 。之後,您應該使用[getHeight()](http://download.oracle.com/javase/1.5.0/docs/api/javax/swing/JComponent.html#getHeight()),因爲您在當前大小之後。如果它仍然模糊,請在Java文檔中檢查這些方法的描述。 – Boro 2011-05-05 20:58:40

+0

@skyork(http://stackoverflow.com/questions/5840075/java-jscrollpane-multiple-components/5842383#5842383)使用了setPreferredSize()的示例]你可能需要在開始強迫你的面板要更大一些,然後其子女的首選大小。我在哪裏使用它來使滾動窗格有意地變小,以便顯示滾動條。 – Boro 2011-05-05 21:03:16