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)中,您可以添加间隔符或空面板,并设置这些组件的“拉伸因子”,这样就不会(在本例中)可拉伸以填充可用空间的文本视图/区域。