[英]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.