如何阻止JTextArea和JTextField拉伸?

时间:2016-04-15 08:30:00

标签: java swing layout-manager grid-layout boxlayout

这可能已在这里得到解答,但我的搜索结果是空白,也许我正在寻找错误的东西。

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

我有一个JPanel,用设定的大小填充JFrame。它使用BoxLayout设置为PAGE_AXIS。如果我添加大小为3,100的JTextArea,则会忽略这些行/列大小并填充所有可用空间。

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

编辑:下面的图显示了我想要的(在顶部)以及我得到的内容。 enter image description here

3 个答案:

答案 0 :(得分:1)

直接来自How to Use GridLayout

上的文档的几句话
  

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

GridLayout并未考虑组件的大小。它尝试将组件放在行和列的可用空间中。

尽量避免明确设置大小。关于Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?的帖子非常好,可以帮助您更好地设计它。

有许多布局管理器可以根据您的要求进行调整。请查看How to Use Various Layout Managers

您可以使用GridBagLayout代替GridLayout来划分行和列中的组件,就像表格布局一样,可以更好地控制网格宽度,高度,边距,填充,列,行等。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

您无法使用GridLayoutBoxLayout进行严肃的布局。忘记 关于他们。

第一个问题是:您确定不希望JTextAreaJTextField增长吗? UI中的标准是这些组件正在增长和缩小;第一个是双向的,第二个是水平的。

无论如何,我发布了GroupLayoutMigLayout的解决方案 我强烈推荐的经理。

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)解决方案 MigLayout

MigLayout中,我们使用各种控制组件的大小调整 约束,例如fillgrowpush。通过不使用它们, 组件不会增长。

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);
        });
    }
}

以下是截图:

Screenshot from the MigLayout example