【问题标题】:Best Layout for Dynamically Sized Panel动态大小面板的最佳布局
【发布时间】:2014-04-06 22:18:28
【问题描述】:

我正在寻找的是针对我的场景使用的最佳布局的建议。我基本上有任意数量的子面板,它们可以在一个容器面板中,可以由用户动态调整大小。所有子面板的宽度均为 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,但我想知道是否有更好的方法这?如果这很重要,在实际程序中,子面板将是自定义面板,而不仅仅是按钮列表。

提前感谢您的帮助!

【问题讨论】:

    标签: java swing layout


    【解决方案1】:

    我能够做到这一点

    使用这个...

    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,并使用上述概念进行布局以布局您需要的列数,然后为每一行执行此操作...

    【讨论】:

    • 好的,所以如果最初存在 6 列,并且用户调整窗口大小以仅容纳 5 列,最好先调用 gridBagLayout.setConstraints(panel, newConstraints) 还是先调用 gridBagLayoutPanel.remove(panel) 然后再调用 @987654327 @,还是真的不重要?
    • 取决于您的布局方式(我可能会使用 GridBagLayout 将其全部放在一个容器中,而不是为每一行使用单独的面板),您可以使用 @ 987654329@ - 我认为它会更简单,但你需要玩弄它;)
    猜你喜欢
    • 1970-01-01
    • 2016-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-10
    • 1970-01-01
    • 2011-11-20
    • 2022-01-19
    相关资源
    最近更新 更多