如何防止 Java Swing BoxLayout 中的 JTextFields 扩展?

Posted

技术标签:

【中文标题】如何防止 Java Swing BoxLayout 中的 JTextFields 扩展?【英文标题】:How do I keep JTextFields in a Java Swing BoxLayout from expanding? 【发布时间】:2011-02-12 03:30:30 【问题描述】:

我有一个JPanel,看起来像这样:

JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));

...

panel.add(jTextField1);
panel.add(Box.createVerticalStrut(10));
panel.add(jButton1);

panel.add(Box.createVerticalStrut(30));

panel.add(jTextField2);
panel.add(Box.createVerticalStrut(10));
panel.add(jButton2);

... //etc.

我的问题是JTextFields 在垂直方向上变得很大。我希望它们只够高到一行,因为这是用户可以输入的全部内容。按钮很好(它们不会垂直扩展)。

有什么方法可以阻止JTextFields 扩展?我对 Swing 很陌生,所以如果我做的一切都非常错误,请告诉我。

【问题讨论】:

【参考方案1】:
textField = new JTextField( ... );
textField.setMaximumSize( textField.getPreferredSize() );

【讨论】:

这使我的文本字段在水平方向上很小(同时垂直排序问题)。我现在已经整理好了(实际上我重新创建了 cbrown's solution 却没有意识到他们已经发布了它) @RichardTingle This made my textfield tiny horisontally - 可能是因为您在创建文本字段时没有指定文本或列数。这就是“...”在参数中的用途 通常对于空文本字段,您将使用像 "new JTextField(10)" 这样的代码。现在您将拥有合理的宽度和高度。【参考方案2】:

如果您希望宽度不断变化,只需将其设置为 MAX INT。所以...

textField.setMaximumSize( 新维度(Integer.MAX_VALUE, textField.getPreferredSize().height));

【讨论】:

【参考方案3】:

就我而言,我需要将所有答案组合起来才能正常工作。如果我不使用胶水,它不会垂直居中;如果我不限制最大尺寸,它会垂直延伸;如果我同时限制宽度和高度,它就太小了,只有足够宽来包含初始化文本。

textField = new JTextField("Hello, world!");
textField.setMaximumSize(
    new Dimension(Integer.MAX_VALUE,
    textField.getPreferredSize().height));
Box box = Box.createVerticalBox();
box.add(Box.createVerticalGlue());
box.add(textField);
box.add(Box.createVerticalGlue());

【讨论】:

【参考方案4】:

设置最大高度。 或将它们放在滚动区域中

【讨论】:

谢谢,兰迪——这真的是最好的方法吗?似乎高度应该根据用户的字体大小而有所不同。还是 Swing 不尊重系统字体?此外,我似乎无法找到一种方法来设置最大高度而不设置宽度(我想保持自动)。我能找到的最接近的是setMaximumSize,它以Dimension(宽度和高度)作为其参数。似乎必须有更好的方法。 关于布局管理器的内容很多。 boxlayout vs gridlayout vs 我最喜欢的borderlayout。你应该玩弄这些文件在所有这些中的表现 - 你可能会找到一个你喜欢的。【参考方案5】:
JPanel panel = new JPanel();

Box box = Box.createVerticalBox();

JTextField tf = new JTextField(8);

box.add(tf);
panel.add(box);

frame.getContentPane().add(panel, BorderLayout.CENTER);

【讨论】:

以上是关于如何防止 Java Swing BoxLayout 中的 JTextFields 扩展?的主要内容,如果未能解决你的问题,请参考以下文章

BoxLayout 的 Java Swing 对齐问题

运用 BoxLayout 进行 Swing 控件布局

在 Swing 中的垂直 BoxLayout 中将按钮粘贴到屏幕的最左侧

java Swing组件和事件处理

Java AWT 图形界面编程LayoutManager 布局管理器 ⑥ ( BoxLayout 布局 )

Java AWT 图形界面编程LayoutManager 布局管理器 ⑥ ( BoxLayout 布局 )