Java 网格布局->;如何阻止组件随窗口一起调整大小?
我在netbeans8/java7中有一个JFframe表单 它有一堆标签、文本框、下拉列表等。 这些是左边的一列,所有的柱子都在上面 以下是一个屏幕截图: 如何防止所有组件贴在右边,并随着窗口大小的调整,同时最右边的预览框沿 我是Java新手,gridbaglayout是我发现的唯一一个能够正确对齐所有内容的工具。我只想让左侧的组件对齐,不要四处移动。我只需要右边的面板,根据窗口大小调整大小Java 网格布局->;如何阻止组件随窗口一起调整大小?,java,swing,resize,layout-manager,gridbaglayout,Java,Swing,Resize,Layout Manager,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);
}
});
}
}