动态尺寸面板的最佳布局

时间:2014-03-05 03:28:09

标签: java swing layout

我正在寻找的是建议用于我的场景的最佳布局。我基本上有任意数量的子面板,可以放在容器面板中,可以由用户动态调整大小。所有子面板的宽度均为300像素,并且可以具有可变高度。我希望面板从左到右,从上到下放置在面板中,就像FlowLayout一样。但是,我尝试使用FlowLayout的任何内容都会使面板垂直居中,高度较低。我希望将面板固定在屏幕顶部。

我使用FlowLayout创建了以下示例,以显示我的意思。

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class DynamicPanel extends JPanel {

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame("Test");
                frame.add(new DynamicPanel());
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.pack();
                frame.setVisible(true);
            }
        });
    }

    public DynamicPanel() {
        setupGUI();
    }

    private void setupGUI() {
        this.setLayout(new FlowLayout(FlowLayout.LEFT));
        this.add(getPanel(1, 4));
        this.add(getPanel(2, 2));
    }

    private JPanel getPanel(int panelNum, int numButtons) {
        JPanel panel = new JPanel(new GridBagLayout()) {
            @Override
            public Dimension getPreferredSize() {
                Dimension ret = super.getPreferredSize();
                ret.width = 300;
                return ret;
            }
        };
        panel.add(new JLabel("Panel "+panelNum), getGrid(0, 0, 1.0, 0));
        for(int i = 0; i < numButtons; i++) {
            panel.add(new JButton("Button"), getGrid(0, i+1, 1.0, 0));
        }
        return panel;
    }

    /*
     * Returns the GridBagConstraints for the given x, y grid location
     */
    private GridBagConstraints getGrid(int x, int y, double xweight, double yweight) {
        GridBagConstraints c = new GridBagConstraints();
        c.fill = GridBagConstraints.BOTH;
        c.gridx = x;
        c.gridy = y;
        c.weightx = xweight;
        c.weighty = yweight;

        return c;
    }
}

在这个例子中,我希望标签Panel1和Panel2彼此笔直,而不是将Panel2设置得更低,因为关联的面板是居中的。

我想我可以使用GridBagLayout,并在容器面板中添加一个组件监听器,并在调整容器面板大小时为每个子面板相应地编辑GridBagContraints,但我想知道是否有更好的方法去做这个?如果这很重要,在实际程序中,子面板将是自定义面板,而不仅仅是按钮列表。

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

我能够实现这个目标

Columns

使用此...

private void setupGUI() {
    this.setLayout(new GridBagLayout());
    GridBagConstraints gbc = new GridBagConstraints();
    gbc.anchor = GridBagConstraints.NORTH;
    gbc.weighty = 1;
    this.add(getPanel(1, 4), gbc);
    this.add(getPanel(2, 2), gbc);
}

问题是,你需要让你的手有点脏,因为没有布局管理器会完全按照你想要的那样做(可能除了MigLayout,但我从来没用过它)

我要做的是,每行创建一个JPanel,将其布局设置为GridBagLayout并使用上述概念进行布局以布置所需的列数,然后对每行执行此操作...