【问题标题】:Setting the preferred size of a JTextFieldis not working设置 JTextField 的首选大小不起作用
【发布时间】:2014-05-06 20:17:12
【问题描述】:

我正在尝试设置JTextField 的大小,但由于某种原因它保持相同大小并填满整个JPanel,我使用的是setPreferredSize,但这没有区别:

JPanel loginJPanel = new JPanel(new BorderLayout());
JTextField usernameJTextField = new JTextField();
usernameJTextField.setPreferredSize(new Dimension(50, 100));
loginJPanel.add(usernameJTextField);

【问题讨论】:

    标签: java swing jtextfield preferredsize


    【解决方案1】:

    确实有所不同,但布局可能会选择忽略首选尺寸设置。 BorderLayout 的中心区域获得尽可能多的可用空间。有关详细信息,请参阅How to Use BorderLayout

    考虑这个打包框架的示例,因此文本字段的首选大小得到尊重。但是一旦调整了框架的大小,文本字段的大小也会随之调整。

    import javax.swing.*;
    import java.awt.*;
    
    class Demo {
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    JPanel loginJPanel = new JPanel(new BorderLayout());
                    JTextField usernameJTextField = new JTextField();
                    usernameJTextField.setPreferredSize(new Dimension(50, 100));
                    loginJPanel.add(usernameJTextField);
    
                    JFrame frame = new JFrame();
                    frame.add(loginJPanel);
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
                    frame.pack();
                    frame.setLocationByPlatform(true);
                    frame.setVisible(true);
                }
            });
        }
    }
    

    看看Visual Guide to Layout Managers,也许您会找到更适合您需求的布局。

    另外,请参阅Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?

    编辑:

    请注意,通常建议您在初始化文本字段时指定列数。此数字用于计算首选宽度。例如textField = new JTextField(20); 更多详情请参见How to Use Text Fields

    如果您不指定列数或首选大小,则 每当文本更改时,该字段的首选大小就会更改,这 可能会导致不必要的布局更新。

    【讨论】:

    • 我通过将其设为FlowLayout 来修复它。谢谢,
    • @HarryKitchener 不客气!我很高兴它有帮助:)
    • @HarryKitchener,你问了多个布局问题。每次您都获得了 Swing 教程的链接。有好几次你也得到了为什么不使用 setPreferredSize() 的链接。我希望您最终会阅读本教程,这样您就不必一直发布基本的布局问题。
    • 请 1.) .... new JTextField(15); , 2.) frame.setLocationByPlatform(true); (在这种情况下可能并不重要,但是...的任何位置)应该在代码行 pack() 之后
    • @mKorbel 我在编辑中包含了这些详细信息。虽然,JTextField 初始化 sn-p 实际上是基于 OP 发布的代码。示例的想法是表明在这种情况下,首选大小受到尊重(指定列数可能会覆盖指定的首选大小)。感谢您的意见!
    【解决方案2】:

    由于您将 jpanel 的布局管理器设置为 BorderLayout,因此默认情况下会将 jtextfield 添加到中心。请改用空布局。

    JPanel loginJPanel = new JPanel(null);
    

    【讨论】:

    • 我不想使用 Null 布局。
    • 如果您使用的是 netbeans,您可以使用 org.netbeans.lib.awtextra.AbsoluteLayout() 布局。
    • 使用边框布局,你应该设置jpanel首选大小。
    • 我在不同的班级@JDiver
    猜你喜欢
    • 1970-01-01
    • 2019-03-22
    • 2016-08-28
    • 1970-01-01
    • 2016-11-10
    • 2011-01-15
    • 2021-02-21
    • 2023-03-17
    • 2013-12-13
    相关资源
    最近更新 更多