【问题标题】:JTextField expands vertically in BoxLayoutJTextField 在 BoxLayout 中垂直扩展
【发布时间】:2020-05-27 03:21:42
【问题描述】:

如果在 BoxLayout 和 FlowLayout 中每个组件都有其首选大小,为什么在使用 BoxLayout 将 JTextField 添加到 JPanel 时,如果它只是一个“单线”,则让它垂直拉伸?

public void go() {
    JFrame frame = new JFrame();
    JPanel panel = new JPanel();
    JTextField field = new JTextField();

    panel.setLayout(new BoxLayout(panel,BoxLayout.Y_AXIS));
    panel.add(field);
    frame.getContentPane().add(BorderLayout.EAST,panel);
    frame.setSize(300,300);
    frame.setVisible(true);
}

文本字段的宽度还可以,但如果它绝对不是首选高度,为什么它会垂直拉伸? JButton 的行为不是这样的。

【问题讨论】:

    标签: java swing jpanel jbutton boxlayout


    【解决方案1】:

    您是否设置了首选尺寸?您也可以尝试将最大尺寸设置为该首选尺寸。来自文档:

    BoxLayout 关注组件请求的最小、首选和最大尺寸。

    您可以将 .setMaximumSize() 与 BoxLayout 一起使用,以防止其拉伸以适应。或者,您可以使用GridBagLayout,这可能有点棘手,但可以提供更多功能。

    // Setting sizes
    comp.setPreferredSize(new Dimension(width, height));
    comp.setMaximumSize(new Dimension(width, height));
    

    【讨论】:

    • 我没有设置首选尺寸。这是否意味着BoxLayout默认使用组件的maximumSize作为preferredSize?
    • @vader 不一定。例如,如果您在某个面板中有两个组件,则两个组件 together 将填充整个面板 - 但它们不会 both 与面板的大小相同(它们不适合)-它们的大小大约是一半。
    • 如果不是在上面的示例中添加一个 JTextField,而是添加两个 JButton,它们不会填满整个面板。 JTextField 是怎么来的?
    • 我没有设置首选尺寸。 - 所有 Swing 组件都确定自己的“首选尺寸”和“最大尺寸”,这两种尺寸可以不同。 我添加了两个 JButton,它们不会填满整个面板。 - JButton 的“maximumSize”与其“preferredSize”相同,因此按钮不会增长。文本字段的最大大小设置为 Integer.MAX,因此文本字段会增大以占用额外的空间。
    • 如果你不希望组件增长,那么不要使用随机数。相反,您将使用component.setMaximumSize( component.getPreferredSize() )。这假设组件的首选大小永远不会改变。如果大小确实发生了变化,那么您应该覆盖组件的 getMaximumSize() 方法以返回 getPreferredSize()
    猜你喜欢
    • 1970-01-01
    • 2012-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    • 2020-06-10
    • 2012-12-28
    • 2015-09-27
    相关资源
    最近更新 更多