在 java 中使用 GridBagLayout 时设置最大组件大小
Posted
技术标签:
【中文标题】在 java 中使用 GridBagLayout 时设置最大组件大小【英文标题】:Setting up a maximum component size when using GridBagLayout in java 【发布时间】:2013-02-16 04:00:01 【问题描述】:我的问题如下:我正在尝试让 JScrollPane 随窗口一起调整大小,水平到一定大小,它应该停止尝试随窗口增长。
我可以用 GridBagLayout 做到这一点吗?如果有,怎么做?
【问题讨论】:
我相信JComponents有一个方法setMaximumSize(),你试过用这个吗? 我不太使用 GridBagLayout,所以我不知道它是如何工作的。但是,我知道 BoxLayout 尊重最大尺寸。 GridBagLayout 不幸的是没有考虑到 setMaximumSize() 。我尝试的第一件事。 BoxLayout 并没有真正适合我想要实现的设计...... 如果我没记错的话,GridBagLayout
肯定不适合这种情况 :( 你试过添加一个HorizontalGlue 或HorizontalBox
吗?
您可以混合和匹配布局管理器以获得您希望实现的设计。
【参考方案1】:
一种方法是用BoxLayout
将您的滚动窗格包装在另一个JPanel
中,并在您的滚动窗格上设置一个BoxLayout 将强制执行的MaximumSize:
包装好的:
拉伸(最大宽度已设置为 700 像素):
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.net.MalformedURLException;
import java.util.Arrays;
import java.util.Vector;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
public class TestGridBagLayout2
protected void initUI() throws MalformedURLException
final JFrame frame = new JFrame();
frame.setTitle(TestGridBagLayout2.class.getSimpleName());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JPanel panel = new JPanel(new GridBagLayout());
Vector<Vector<String>> data = new Vector<Vector<String>>();
for (int i = 0; i < 20; i++)
Vector<String> v = new Vector<String>();
for (int j = 0; j < 1; j++)
v.add("Cell (" + (i + 1) + "," + (j + 1) + ")");
data.add(v);
DefaultTableModel model = new DefaultTableModel(data, new Vector<String>(
Arrays.asList("Col-1"/*, "Col-2", "Col-3", "Col-4", "Col-5"*/)));
JTable table = new JTable(model);
JScrollPane scroll = new JScrollPane(table);
scroll.setMaximumSize(new Dimension(700, Integer.MAX_VALUE));
JPanel wrappingPanel = new JPanel(null);
wrappingPanel.setLayout(new BoxLayout(wrappingPanel, BoxLayout.LINE_AXIS));
wrappingPanel.add(scroll);
GridBagConstraints gbc = new GridBagConstraints();
gbc.weightx = 1.0;
gbc.fill = GridBagConstraints.BOTH;
panel.add(wrappingPanel, gbc);
frame.add(panel);
frame.pack();
frame.setVisible(true);
public static void main(String[] args)
SwingUtilities.invokeLater(new Runnable()
@Override
public void run()
try
new TestGridBagLayout2().initUI();
catch (MalformedURLException e)
e.printStackTrace();
);
【讨论】:
这是一个好主意,但非常臃肿......我会等着看是否有更好的想法出现,然后再将您的想法标记为解决方案。还是谢谢你! @user2015634 让我知道是否有更好的结果。我很高兴能以更简单的方式学习如何做到这一点。以上是关于在 java 中使用 GridBagLayout 时设置最大组件大小的主要内容,如果未能解决你的问题,请参考以下文章
在 Java 中使用 GridBagLayout 时防止 Swing 组件偏离中心