3

这对你们来说是一个艰难的过程:)

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

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

  • 当第一个的 Hscroll 条出现时,第二个的宽度会减小

  • 然后,第二个的宽度又无缘无故地缩小了……

如果我不包装我的组件,请不要出现这种行为。


如果你用树 替换右手列表,它的行为会有所不同:将窗口的高度缩小到 380-ich 像素以下,树的大小会被调整......

如果我不包装我的组件,那么如果您继续调整窗口大小,树就会重新调整大小!

你们知道发生了什么吗???

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);
}
4

2 回答 2

9

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

于 2012-03-09T16:21:21.070 回答
2
  • 这是GridBagLayout的基本原理,你忘了定义anchor,然后你可以修复放置JComponent到相关的Point,我认为这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();
            }
        });
    }
}

避免将简单的事情复杂化

于 2012-03-09T11:17:22.500 回答