这可能已在这里得到解答,但我的搜索结果是空白,也许我正在寻找错误的东西。
如何阻止JTextArea
和JTextField
伸展? swing是否提供了某种我可以添加的面板垫片,它将在任何其他元素之前被拉伸?
我有一个JPanel
,用设定的大小填充JFrame
。它使用BoxLayout
设置为PAGE_AXIS
。如果我添加大小为3,100的JTextArea
,则会忽略这些行/列大小并填充所有可用空间。
同样,我有JPanel
GridLayout
。如果我添加JTextField
,而不是我指定的列中的大小,它将填充网格中的整个空间。
答案 0 :(得分:1)
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)
您无法使用GridLayout
或BoxLayout
进行严肃的布局。忘记
关于他们。
第一个问题是:您确定不希望JTextArea
和JTextField
增长吗? UI中的标准是这些组件正在增长和缩小;第一个是双向的,第二个是水平的。
无论如何,我发布了GroupLayout
和MigLayout
的解决方案
我强烈推荐的经理。
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
中,我们使用各种控制组件的大小调整
约束,例如fill
,grow
或push
。通过不使用它们,
组件不会增长。
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);
});
}
}
以下是截图: