在 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 组件偏离中心

Java GridBagLayout 不起作用

Java gridbaglayout 使用带有可拖动 jpanel 的滚动窗格

Java GridBagLayout组件不会到达指定位置

GridBagLayout Java 中的边距/填充

谁能解释一下Java中GridBagLayout的使用?