GridBagLayout中的JScrollPanes随机调整大小

时间:2012-03-09 11:01:00

标签: java swing resize jscrollpane gridbaglayout

对你们来说,这是一个艰难的问题:)

基本上我有一个包含2列的GridBagLayout:列表包含在每个列中的滚动窗口中。滚动窗格在 BOTH 方向拉伸。

如果我逐渐减小此面板的高度(通过拖动窗口的边缘),我会看到滚动窗格上发生“随机”调整大小:

  • 当第一个Hscroll栏出现时,第二个宽度会减少

  • 然后,第二个人的宽度无缘无故再次缩小......

如果我不包装我的组件,请不要这样做。


如果您使用替换右侧列表,它的行为将有所不同: 缩小窗口的高度380-ich px,树得到调整大小......

如果我不包装我的组件,如果你继续调整窗口的大小,那么树会被调整大小!

你们有什么想法发生了什么???

PS:我试图构建的实际布局比这个例子更复杂。与此同时,我使用SpringLayout来做我想要的事情,但它需要设置很多(不那么漂亮)的东西

protected static ListModel newListModel(int n) {
    DefaultListModel lm = new DefaultListModel();

    for (int i = 0; i < n; ++i)
        lm.addElement("AAA");

    return lm;
}

protected static JComponent createContentPane() {
    JPanel  pane = new JPanel(new GridBagLayout());

    GridBagConstraints  gbc = new GridBagConstraints();

    gbc.anchor = GridBagConstraints.CENTER;
    gbc.fill = GridBagConstraints.BOTH;
    gbc.weightx = 1;
    gbc.weighty = 1;
    gbc.gridy = 0;
    gbc.gridx = 0;

    pane.add(new JScrollPane(new JList(newListModel(12))), gbc);

    ++gbc.gridx;

    pane.add(new JScrollPane(new JList(newListModel(4))), gbc);

    return pane;
}

public static void main(String[] args) {
    JFrame f = new JFrame();

    f.getContentPane().add(createContentPane());
    f.setSize(800, 400);
    f.setLocationRelativeTo(null);
    f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    f.setVisible(true);
}

2 个答案:

答案 0 :(得分:9)

我在GridBagLayout中有一个带有多个ScrollPanes的应用程序,当我调整窗口大小时,它们也会突然显示调整大小。当ScrollPane的实际大小超过其“首选大小”时,似乎会发生跳转。我找到了一个解决方法:将首选大小设置为1x1像素。如果该组件具有正重量并且延伸两倍,它仍将占据整个细胞,但不会跳跃。如果需要多个单元格以不同的比例调整大小,可以将另一个单元格的首选大小设置为2x1像素。

答案 1 :(得分:2)

  • 这是GridBagLayout的基本原则,您忘记定义anchor,然后您就可以将已放置的JComponent修复为重新Poin t,我认为GridBagLayout使您的GUI复杂化,LayoutManager可以更好地将大量JComponents放置到一个容器中(不使用nested layout

例如

import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;

public class BorderPanels extends JFrame {

    private static final long serialVersionUID = 1L;

    public BorderPanels() {
        setLayout(new GridBagLayout());// set LayoutManager
        GridBagConstraints gbc = new GridBagConstraints();
        JPanel panel1 = new JPanel();
        Border eBorder = BorderFactory.createEtchedBorder();

        panel1.setBorder(BorderFactory.createTitledBorder(eBorder, "20pct"));
        gbc.gridx = gbc.gridy = 0;
        gbc.gridwidth = gbc.gridheight = 1;
        gbc.fill = GridBagConstraints.BOTH;
        gbc.anchor = GridBagConstraints.NORTHWEST;
        gbc.weightx = gbc.weighty = 20;
        add(panel1, gbc); // add compoenet to the COntentPane

        JPanel panel2 = new JPanel();
        panel2.setBorder(BorderFactory.createTitledBorder(eBorder, "60pct"));
        gbc.gridy = 1;
        gbc.weightx = gbc.weighty = 60;
        //gbc.insets = new Insets(2, 2, 2, 2);
        add(panel2, gbc); // add component to the COntentPane

        JPanel panel3 = new JPanel();
        panel3.setBorder(BorderFactory.createTitledBorder(eBorder, "20pct"));
        gbc.gridy = 2;
        gbc.weightx = gbc.weighty = 20;
        gbc.insets = new Insets(2, 2, 2, 2);
        add(panel3, gbc);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // important
        pack();
        setVisible(true); // important
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() { // important

            public void run() {
                BorderPanels borderPanels = new BorderPanels();
            }
        });
    }
}

避免使复杂的事情复杂化