Java 如何阻止JTextArea和JTextField拉伸?

Java 如何阻止JTextArea和JTextField拉伸?,java,swing,layout-manager,grid-layout,boxlayout,Java,Swing,Layout Manager,Grid Layout,Boxlayout,这可能已经在这里得到了回答,但我的搜索结果是一片空白,也许我在寻找错误的东西 如何阻止JTextArea和JTextField拉伸?swing是否提供了某种类型的面板垫片,我可以添加这种垫片,它将在任何其他元素拉伸之前拉伸 我有一个JPanel,它用设置的大小填充JFrame。它使用box布局设置为PAGE\u轴。如果我添加一个大小为3100的JTextArea,它将忽略这些行/列大小,并填充所有可用空间 类似地,我有一个JPanel和一个GridLayout。如果我添加一个JTextField

这可能已经在这里得到了回答,但我的搜索结果是一片空白,也许我在寻找错误的东西

如何阻止
JTextArea
JTextField
拉伸?swing是否提供了某种类型的面板垫片,我可以添加这种垫片,它将在任何其他元素拉伸之前拉伸

我有一个
JPanel
,它用设置的大小填充
JFrame
。它使用
box布局
设置为
PAGE\u轴
。如果我添加一个大小为3100的
JTextArea
,它将忽略这些行/列大小,并填充所有可用空间

类似地,我有一个
JPanel
和一个
GridLayout
。如果我添加一个
JTextField
,而不是我指定的列大小,它将填充网格中的整个空间

编辑:下面的图形显示了我想要的(在顶部)和我得到的。

直接从

GridLayout对象将组件放置在单元格网格中。每个组件占用其单元内的所有可用空间,并且每个单元的大小完全相同。如果调整了GridLayoutDemo窗口的大小,GridLayout对象将更改单元格大小,以便在给定容器可用空间的情况下使单元格尽可能大

<代码> GridLayout <代码>不考虑组件的大小。它尝试在行和列中的可用空间中容纳组件


尽量避免显式设置大小。有一个非常好的帖子可以帮助你更好地设计它


有许多布局管理器可以根据您的要求进行调整。请看一看



您可以使用而不是
GridLayout
将组件按行和列进行划分,就像表格布局一样,表格布局使您可以更好地控制网格宽度、高度、边距、填充、列、行等。

在我的代码中,我只设置了列数

JTextField data = new JTextField();
data.setColumns(30);

使用e
GridLayout
BoxLayout
无法进行严肃的布局。忘记 关于他们

第一个问题是:您确定不希望
JTextArea
JTextField
增长吗?这些组件的增长和收缩是UI中的一个标准;第一个在两个方向上,第二个在水平方向上

总之,我发布了
GroupLayout
migloayout
的解决方案,它们是 我极力推荐的经理

a) 解决方案带有
GroupLayout

每个组件有三种尺寸:最小、首选和最大。这些 为每个组件设置一些合理的默认值。这就是为什么
JTextField
倾向于水平增长;其最大值设置为a 非常多

package com.zetcode;

import java.awt.Container;
import java.awt.EventQueue;
import javax.swing.BorderFactory;
import javax.swing.GroupLayout;
import javax.swing.JComponent;
import javax.swing.JFrame;
import static javax.swing.JFrame.EXIT_ON_CLOSE;
import javax.swing.JLabel;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class GroupLayoutStretchingEx extends JFrame {

    public GroupLayoutStretchingEx() {

        initUI();
    }

    private void initUI() {

        JTextArea area = new JTextArea(12, 20);
        area.setBorder(BorderFactory.createEtchedBorder());
        JLabel input = new JLabel("Input");
        JTextField textField = new JTextField(15);

        createLayout(area, input, textField);

        setTitle("Stretching");
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    private void createLayout(JComponent... arg) {

        Container pane = getContentPane();
        GroupLayout gl = new GroupLayout(pane);
        pane.setLayout(gl);

        gl.setAutoCreateContainerGaps(true);
        gl.setAutoCreateGaps(true);

        gl.setHorizontalGroup(gl.createParallelGroup(GroupLayout.Alignment.TRAILING)
                .addComponent(arg[0], GroupLayout.DEFAULT_SIZE,
                        GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                .addGroup(gl.createSequentialGroup()
                        .addComponent(arg[1])
                        .addComponent(arg[2], GroupLayout.DEFAULT_SIZE,
                                GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
        );

        gl.setVerticalGroup(gl.createSequentialGroup()
                .addComponent(arg[0], GroupLayout.DEFAULT_SIZE,
                        GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                .addGroup(gl.createParallelGroup()
                        .addComponent(arg[1])
                        .addComponent(arg[2], GroupLayout.DEFAULT_SIZE,
                                GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))
        );

        pack();
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(() -> {
            GroupLayoutStretchingEx ex = new GroupLayoutStretchingEx();
            ex.setVisible(true);
        });
    }
}
GroupLayout
中,需要为最大值设置正确的值
addComponent()
方法中的组件大小

JTextArea area = new JTextArea(12, 20);
通过设置
JTextArea
的行数和列数,我们可以 设置此组件的首选大小。此值稍后使用 由布局管理器在其计算中执行

b) 解决方案带有
migloayout

在MigLayout中,我们通过各种方式控制组件的树脂 约束,例如
填充
增长
,或
推送
。如果不使用它们,则 组件不会增长

package com.zetcode;

import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import net.miginfocom.swing.MigLayout;

public class MigLayoutStretchingEx extends JFrame {

    public MigLayoutStretchingEx() {

        initUI();
    }

    private void initUI() {

        JTextArea area = new JTextArea(12, 20);
        area.setBorder(BorderFactory.createEtchedBorder());
        JLabel input = new JLabel("Input");
        JTextField textField = new JTextField(15);

        createLayout(area, input, textField);

        setTitle("MigLayout example");
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    private void createLayout(JComponent... arg) {

        setLayout(new MigLayout());

        add(arg[0], "wrap");
        add(arg[1], "split 2");
        add(arg[2], "growx");
        pack();
    }

    public static void main(String[] args) {

        SwingUtilities.invokeLater(() -> {
            MigLayoutStretchingEx ex = new MigLayoutStretchingEx();
            ex.setVisible(true);
        });
    }
}
下面是截图:


请发布一些代码来调查该问题。首先查看有关不同布局管理器的更多详细信息,如
FlowLayout
GridBagLayout
可以提供ASCII艺术或GUI预期布局的简单绘图,如果可以调整大小,增加宽度和高度。“我只是设置了列数”问题已经提到了对文本区域和字段都这样做。这里的问题是布局正在拉伸组件以适应可用空间。我还为那些有用的链接设置了MaxSizeThanks。我想指定大小的原因是因为我有输入限制(即我希望JTextView中最多有8个字符,这就是为什么我将其创建为
新JTextView(8)
)在我使用过的其他UI库(Android/Qt)中,您可以添加间隔符或空面板,并设置这些组件的“拉伸因子”,这样就不会(在本例中)可拉伸以填充可用空间的文本视图/区域。