Java 网格布局->;如何阻止组件随窗口一起调整大小?

Java 网格布局->;如何阻止组件随窗口一起调整大小?,java,swing,resize,layout-manager,gridbaglayout,Java,Swing,Resize,Layout Manager,Gridbaglayout,我在netbeans8/java7中有一个JFframe表单 它有一堆标签、文本框、下拉列表等。 这些是左边的一列,所有的柱子都在上面 以下是一个屏幕截图: 如何防止所有组件贴在右边,并随着窗口大小的调整,同时最右边的预览框沿 我是Java新手,gridbaglayout是我发现的唯一一个能够正确对齐所有内容的工具。我只想让左侧的组件对齐,不要四处移动。我只需要右边的面板,根据窗口大小调整大小 谢谢,您需要将填充约束设置为“无” 教程:: 将每个构件添加到配电盘时,其外观如下所示(来自教程):

我在netbeans8/java7中有一个JFframe表单

它有一堆标签、文本框、下拉列表等。 这些是左边的一列,所有的柱子都在上面

以下是一个屏幕截图:

如何防止所有组件贴在右边,并随着窗口大小的调整,同时最右边的预览框沿

我是Java新手,gridbaglayout是我发现的唯一一个能够正确对齐所有内容的工具。我只想让左侧的组件对齐,不要四处移动。我只需要右边的面板,根据窗口大小调整大小


谢谢,

您需要将填充约束设置为“无”

教程::

将每个构件添加到配电盘时,其外观如下所示(来自教程):

您需要确保拨打以下电话:

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);
  }
}
我只想右边,面板,根据窗口大小调整大小

默认情况下,所有列在每行中按相等的百分比划分

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

别忘了用铅笔完全填满水平空间


如果希望固定第一列的宽度,请通过重写
getPreferredSize()
方法设置左侧面板的首选尺寸,并为右侧面板指定100%的宽度

JPanel leftSidePanel = new JPanel() {

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

看看我的另一篇文章,它能更好地解释这一点

它;关于Swing的教程值得一读

gridbaglayout是我发现的唯一一个能够正确对齐所有内容的布局

MigLayout管理器可以很容易地做到这一点。它还提供了更好的可移植性。 请注意相关间隙(r)、对话框插入(dialog)和逻辑像素(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);
            }
        });
    }
}
我复制了你的部分截图,并保留了缩进。 水平分离器不能完全伸展,因为我相信这是不可能的 优化设计。通过消除巨大的空间,设计也得到了改进 在标签和文本字段之间


这也将停止该列中的组件进行调整,使其具有相同的大小。更可能的是,为了避免获得额外的空间,填充值不是零而是权重x。@Holger你可能是对的(因为这也是我要做的;-),但是因为OP没有提到这个要求(让它们填充到右边,但只填充到最宽组件的宽度),我没有做任何假设。你好,谢谢你的回答。我不知道如何在NetBeans中实现这一点。有什么想法吗?IDE的选择(在您的例子中是Netbeans)与您使用的LayoutManager的选择无关。或者您正在使用某种GUI构建器?如果你是的话,你应该在你的问题中提到这一点。对不起,我的意思是,在NetBeans中initComponents方法总是灰色的,所以不可能在那里更改代码。我尝试了前初始化和后初始化,但我的位置不对。似乎NetBeans正在使初始化组件代码变灰。我可能必须切换到eclipse?
gc.fill = GridBagConstraints.HORIZONTAL;
JPanel leftSidePanel = new JPanel() {

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(..., ...);
    }
}
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);
            }
        });
    }
}