2011-05-05 96 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