【问题标题】:How do I keep JTextFields in a Java Swing BoxLayout from expanding?如何防止 Java Swing BoxLayout 中的 JTextFields 扩展?
【发布时间】: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 很陌生,所以如果我做的一切都非常错误,请告诉我。

【问题讨论】:

    标签: java swing layout layout-manager


    【解决方案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);
        

        【讨论】:

          猜你喜欢
          • 2012-12-10
          • 1970-01-01
          • 1970-01-01
          • 2013-11-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-20
          相关资源
          最近更新 更多