在java中使用GridBagLayout时设置最大组件大小

在java中使用GridBagLayout时设置最大组件大小,java,swing,user-interface,gridbaglayout,Java,Swing,User Interface,Gridbaglayout,我的问题是:我试图让一个JScrollPane随窗口调整大小,水平调整到一定的大小,这样它就不会再随窗口增长了 我可以用GridBagLayout来做吗?如果是这样,怎么做?一种方法是用一个BoxLayout将滚动窗格包装在另一个JPanel中,并在滚动窗格上设置BoxLayout将强制执行的最大大小: 包装: 拉伸(最大宽度已设置为700像素): 导入java.awt.Dimension; 导入java.awt.GridBagConstraints; 导入java.awt.GridBagL

我的问题是:我试图让一个JScrollPane随窗口调整大小,水平调整到一定的大小,这样它就不会再随窗口增长了


我可以用GridBagLayout来做吗?如果是这样,怎么做?

一种方法是用一个
BoxLayout
将滚动窗格包装在另一个
JPanel
中,并在滚动窗格上设置BoxLayout将强制执行的最大大小:

包装:

拉伸(最大宽度已设置为700像素):

导入java.awt.Dimension;
导入java.awt.GridBagConstraints;
导入java.awt.GridBagLayout;
导入java.net.MalformedURLException;
导入java.util.array;
导入java.util.Vector;
导入javax.swing.BoxLayout;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.JTable;
导入javax.swing.SwingUtilities;
导入javax.swing.table.DefaultTableModel;
公共类TestGridBagLayout2{
受保护的void initUI()引发错误的FormedUrlexception{
最终JFrame=新JFrame();
setTitle(TestGridBagLayout2.class.getSimpleName());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
最终JPanel面板=新JPanel(新GridBagLayout());
向量数据=新向量();
对于(int i=0;i<20;i++){
向量v=新向量();
对于(int j=0;j<1;j++){
v、 加上(“单元格”(“+(i+1)+”,“+(j+1)+”);
}
数据.添加(v);
}
DefaultTableModel=new DefaultTableModel(数据,新向量(
数组.asList(“Col-1”/*、“Col-2”、“Col-3”、“Col-4”、“Col-5”*/);
JTable table=新的JTable(模型);
JScrollPane scroll=新的JScrollPane(表);
scroll.setMaximumSize(新维度(700,整数.MAX_值));
JPanel wrappingPanel=新的JPanel(空);
wrappingPanel.setLayout(新的BoxLayout(wrappingPanel,BoxLayout.LINE_轴));
wrappingPanel.add(滚动);
GridBagConstraints gbc=新的GridBagConstraints();
gbc.weightx=1.0;
gbc.fill=GridBagConstraints.BOTH;
面板添加(包装面板,gbc);
框架。添加(面板);
frame.pack();
frame.setVisible(true);
}
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
新的TestGridBagLayout2().initUI();
}捕获(格式错误){
e、 printStackTrace();
}
}
});
}
}

我相信JComponents有一个方法setMaximumSize(),你试过使用它吗?我不太使用GridBagLayout,所以我不知道它是如何工作的。但是,我知道BoxLayout尊重最大大小。很遗憾,GridBagLayout没有考虑setMaximumSize()。我试过的第一件事。BoxLayout并没有真正符合我想要实现的设计……如果我没有弄错的话,那么
GridBagLayout
肯定不适合这种情况:(您是否尝试添加一个或
HorizontalBox
。您可以混合和匹配布局管理器,以获得您希望实现的设计。这是一个好主意,但非常臃肿……在将您的想法标记为解决方案之前,我将等待是否出现更好的想法。无论如何,谢谢!@user2015634如果有更好的想法,请告诉我。我会的乐于学习如何用更简单的方式来做。
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();
                }
            }
        });
    }

}