我遇到了一个问题,我使用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);
答案 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());
}
});
}
}