Gridbaglayout - >如何阻止组件与窗口一起调整大小?

时间:2014-08-07 16:59:22

标签: java swing resize layout-manager gridbaglayout

我在NetBeans 8 / Java 7中有一个JFframe表单。

它有一堆标签,文本框,下拉列表等。 这些是左侧大小的列,都是相互叠加的。

这是一个截图:

enter image description here

如何防止所有这些组件粘在右边并随窗口一起调整大小,同时让最右边的预览框架调整大小?

我是Java的新手,而gridbaglayout是我发现的唯一正确对齐的东西。我只是希望左侧的组件良好对齐而不会移动。我只是希望右侧面板根据窗口大小调整大小。

谢谢,

3 个答案:

答案 0 :(得分:1)

您需要将填充约束设置为NONE。

教程:How to Use GridBagLayout

当您将每个组件添加到面板时,它看起来像这样(来自教程):

JPanel pane = new JPanel(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();

//For each component to be added to this container:
//...Create the component...
//...Set instance variables in the GridBagConstraints instance...
pane.add(theComponent, c);

您需要确保致电:

c.fill = GridBagConstraints.NONE;

为您添加到不希望水平拉伸的面板的每个组件的每个约束对象。

如果你为每个组件重复使用相同的约束对象,只要你想要得到所有结果就可以设置一次。

修改

正如其他人所指出的那样,OP 可能希望字段延伸,但只能达到某个限制(此时仍然不清楚)。在这种情况下,您将使用

的组合
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 0;

正如已经指出的那样。例如:

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

public class GridBagDemo implements Runnable
{
  public static void main(String[] args)
  {
    SwingUtilities.invokeLater(new GridBagDemo());
  }

  public void run()
  {
    // 4 components that all have different widths
    JButton btnBrowse = new JButton("Browse");
    JTextField txfHeight = new JTextField(4);
    JTextField txfWidth = new JTextField(10);
    JButton btnMore = new JButton("More PDF Attributes");

    // the preview pane?
    JTextArea txaPreview = new JTextArea(8, 20);
    JScrollPane scrPreview = new JScrollPane(txaPreview);
    scrPreview.setVerticalScrollBarPolicy(
        JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

    GridBagConstraints gbc = new GridBagConstraints();
    // we'll use these constraints for all components
    gbc.anchor = GridBagConstraints.NORTHWEST;
    gbc.insets = new Insets(2,4,2,4);

    JPanel panel = new JPanel(new GridBagLayout());

    gbc.gridx = 0;
    gbc.gridy = 0;
    gbc.gridwidth = 1;
    gbc.fill = GridBagConstraints.NONE;
    gbc.weightx = 0;
    panel.add(new JLabel("Source PDF size..."), gbc);

    gbc.gridx = 0;
    gbc.gridy = 1;
    gbc.gridwidth = 2;
    gbc.gridheight = 1;
    gbc.fill = GridBagConstraints.HORIZONTAL;
    panel.add(btnBrowse, gbc);

    gbc.gridx = 0;
    gbc.gridy = 2;
    gbc.gridwidth = 1;
    gbc.fill = GridBagConstraints.NONE;
    gbc.weightx = 0;
    panel.add(new JLabel("Height (in inches):"), gbc);

    gbc.gridx = 1;
    gbc.gridy = 2;
    gbc.gridwidth = 1;
    gbc.fill = GridBagConstraints.HORIZONTAL;
    panel.add(txfHeight, gbc);

    gbc.gridx = 0;
    gbc.gridy = 3;
    gbc.gridwidth = 1;
    gbc.fill = GridBagConstraints.NONE;
    gbc.weightx = 0;
    panel.add(new JLabel("Width (in inches):"), gbc);

    gbc.gridx = 1;
    gbc.gridy = 3;
    gbc.gridwidth = 1;
    gbc.fill = GridBagConstraints.HORIZONTAL;
    panel.add(txfWidth, gbc);

    gbc.gridx = 0;
    gbc.gridy = 4;
    gbc.gridwidth = 2;
    gbc.fill = GridBagConstraints.HORIZONTAL;
    panel.add(btnMore, gbc);

    gbc.gridx = 0;
    gbc.gridy = 5;
    gbc.gridwidth = 2;
    gbc.fill = GridBagConstraints.VERTICAL;
    gbc.weighty = 1;
    panel.add(Box.createVerticalGlue(), gbc);

    gbc.gridx = 2;
    gbc.gridy = 0;
    gbc.gridwidth = 1;
    gbc.fill = GridBagConstraints.NONE;
    gbc.weightx = 0;
    gbc.weighty = 0;
    panel.add(new JLabel("Preview"), gbc);

    gbc.gridx = 2;
    gbc.gridy = 1;
    gbc.gridwidth = 1;
    gbc.gridheight = 8; // some number that's > the number of entry rows
    gbc.fill = GridBagConstraints.BOTH;
    gbc.weightx = 1;
    gbc.weighty = 1;
    panel.add(scrPreview, gbc);

    JFrame frame = new JFrame("GrigBag Demo");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().add(new JScrollPane(panel), BorderLayout.CENTER);
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
  }
}

答案 1 :(得分:1)

  

我只是希望右侧面板根据窗口大小调整大小。

默认情况下,每行中的所有列都以相等的百分比划分。

要强制第二个(右侧)列占用更多空间,请使用GridBagConstraints#weightx

为其指定更高的百分比
gc.weightx = 0.75; // 75%

不要忘记使用GridBagConstraints#fill

完全填充水平空间
gc.fill = GridBagConstraints.HORIZONTAL;

如果您想要第一列的固定宽度,请通过覆盖getPreferredSize()方法为左侧面板设置首选大小,并为右侧面板指定100%宽度。

JPanel leftSidePanel = new JPanel() {

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(..., ...);
    }
}

查看我的其他帖子GridBagLayout: How to set fixed column width?,以便更好地解释它。

值得在Solving Common Layout Problems

上阅读 Swing Tutorial

答案 2 :(得分:0)

  

gridbaglayout是我发现的唯一正确对齐的东西。

MigLayout经理可以轻松完成。它还提供了更好的可移植性。 注意相关间隙(r),对话框插入(对话框)和逻辑像素(lp)的使用。 这些单位相应地转换为像素。另一方面,GridbagLayout 直接以像素为单位设置空间是不合适的,例如改变字体或分辨率 会影响布局。

参见以下代码示例:

package com.zetcode;

import java.awt.EventQueue;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSeparator;
import javax.swing.JTextField;
import net.miginfocom.swing.MigLayout;


public class MigLayoutPreview2 extends JFrame {

    public MigLayoutPreview2() {

        initUI();

        setTitle("Design preview");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
    }

    private void initUI() {

        JPanel pnl = new JPanel(new MigLayout("ins dialog, wrap"));

        pnl.add(new JLabel("Source PDF file..."), "pad 0 -5lp 0 0");
        pnl.add(new JButton("Browse"), "growx");
        pnl.add(new JLabel("Height (inches):"), "sgx, split 2");
        pnl.add(new JTextField(10), "growx");
        pnl.add(new JLabel("Width (inches):"), "sgx, split 2");
        pnl.add(new JTextField(10), "growx"); 
        pnl.add(new JButton("More PDF attributes"), "growx");
        pnl.add(new JSeparator(), "pad 0 -5lp 0 0, gaptop r, growx");
        pnl.add(new JLabel("Set bounding box..."), "pad 0 -5lp 0 0");
        pnl.add(new JComboBox(), "growx");
        pnl.add(new JSeparator(), "pad 0 -5lp 0 0, gaptop r, growx");
        pnl.add(new JLabel("Sheet size..."), "pad 0 -5lp 0 0");
        pnl.add(new JComboBox(), "growx");
        pnl.add(new JLabel("Height (inches):"), "sgx, split 2");
        pnl.add(new JTextField(10), "growx");
        pnl.add(new JLabel("Width (inches):"), "sgx, split 2");
        pnl.add(new JTextField(10), "growx"); 
        pnl.add(new JSeparator(), "pad 0 -5lp 0 0, gaptop r, growx");

        JPanel rpnl = new JPanel();
        rpnl.setBorder(BorderFactory.createEtchedBorder());

        pnl.add(rpnl, "cell 2 0, w 90, spany, pushx, grow");

        add(pnl);
        pack();
    }

    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                MigLayoutPreview2 ex = new MigLayoutPreview2();
                ex.setVisible(true);
            }
        });
    }
}

我已经复制了部分截图,并且还保留了缩进。 水平分隔符不能完全伸展,因为我认为不是 优化设计。通过消除巨大的空间也改善了设计 标签和文本字段之间。

Design preview