使用GridBagLayout动态更改JTable中的单元格高度

时间:2011-05-05 16:05:02

标签: java swing jtable

我遇到了一个问题,我使用GridBagLayout管理器布局了一个JTable,并且表中的行数没有修复。我打算用它的所有单元格填充分配给表格的空间,但是在表格的最后一行和容器中的下一个组件之间有一个大的空白(和白色)空间。

作为一种潜在的解决方案,我想知道是否可以调整单元格的高度来填充分配给表格的空间。因此,例如,如果有三行,则空间的高度应平均分为三行。如果只有一行,则该行应占用整个可用空间。

欢迎任何建议,如果有更好的方法达到预期的效果,请赐教。感谢。

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);

1 个答案:

答案 0 :(得分: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());
            }
        });
    }
}