簡體   English   中英

使用GridBagLayout動態更改JTable中的單元格高度

[英]Dynamically change the cell height in JTable with a GridBagLayout

我遇到了一個問題,我使用GridBagLayout管理器布局JTable並且表中的行數不固定。 我打算用它的所有單元格填充分配給表的空間,但是在表的最后一行和容器中的下一個組件之間有一個大的空白(和白色)空間。

作為一個潛在的解決方案,我想知道我是否可以調整單元格的高度來填充分配給表格的空間。 因此,例如,如果有三行,則空間的高度應平均分為三行。 如果只有一行,則該行應占用整個可用空間。

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

PS我在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);

是的你可以。 只需設置行高。 你必須使用像這里的東西。 顯然我在這里假設您的面板具有“恆定”尺寸。 否則布局將確保將其調整為適當的大小,即表大小。

如果是,那么您可以使用面板高度來計算每行應該采用的高度。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM