【问题标题】:JTextField Fixed HeightJTextField 固定高度
【发布时间】:2011-07-27 23:37:24
【问题描述】:

当 Frame 最大化时,如何使 JTextField 具有固定高度?我希望它看起来有点类似于 Ubuntu 上的 Skype 应用程序。

private JTextField username;
private JPasswordField password;
private JLabel usernamelabel;
private JLabel passwordlabel;
public LoginPanel(){


    setSize(200,200);
    setLayout(new GridLayout(4,4));
    setBackground(new Color(85,153,187));
    setBorder(BorderFactory.createEmptyBorder(70, 70, 70, 70));
    username = new JTextField();
    password = new JPasswordField();
    usernamelabel= new JLabel("Username");
    passwordlabel= new JLabel("Password");
    username.setBounds(5, 5, 100, 100);
    username.setPreferredSize(new Dimension(80,20));
    password.setPreferredSize(new Dimension(80,20));
    add(usernamelabel);
    add(username);
    add(passwordlabel);
    add(password);

【问题讨论】:

  • 对不起,我的意思是固定高度的 JTextField 和 JPasswordField。
  • setMinimum/Maximum/Preferred/Size?

标签: java swing size jtextfield


【解决方案1】:

不要使用GridLayout 以外的布局,或者将文本字段放在另一个面板中,该面板的FlowLayout 位于您的GridLayout 内部。

【讨论】:

  • 所以你说创建具有 FlowLayout 的 JPanel 并将 TextFields 添加到它们然后将它们添加到包含网格布局的面板中?我可以看到它是如何工作的,但是没有更简洁的方法吗?我完全反对 Netbeans GUI 生成器。 :)
  • 是的,分层不同的布局是生成所需布局效果的一种简单而常用的方法。
  • +1 用于嵌套布局。为方便起见,JPanel 默认为 FlowLayout
  • -1 用于嵌套布局 ;-) 如果 3rd 方 LayoutManagers 不是一个选项,那只是紧急黑客攻击。如果是,请进行一些研究并选择最适合的一种,可能会落入“三巨头”之一(FormLayout、MigLayout、DesignLayout):它们都功能强大且易于处理。
【解决方案2】:

我认为这可以解决您的问题。

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Main { 

/**
 * @param args
 */
public static void main(String[] args) {
    JFrame failFrame = new JFrame();
    JPanel mainPanel = new JPanel();
    mainPanel.setLayout(new GridLayout(0, 4));

    JPanel leftTextFieldPanel = new JPanel();
    leftTextFieldPanel.setLayout(new FlowLayout());        
    JPanel rightTextFieldPanel = new JPanel();
    rightTextFieldPanel.setLayout(new FlowLayout());

    JTextField leftTextField = new JTextField();
    leftTextField.setPreferredSize(new Dimension(150,20));              
    JTextField rightTextField = new JTextField();
    rightTextField.setPreferredSize(new Dimension(150,20));

    leftTextFieldPanel.add(leftTextField);
    mainPanel.add(leftTextFieldPanel);

    rightTextFieldPanel.add(rightTextField);
    mainPanel.add(rightTextFieldPanel);

    mainPanel.add(new JPanel());
    mainPanel.add(rightTextFieldPanel);
    mainPanel.add(new JPanel());

    failFrame.add(mainPanel);
    failFrame.setSize(600, 400);
    failFrame.setLocationRelativeTo(null);
    failFrame.setVisible(true);
}
}

我使用了嵌套布局。顶部是您的 GridLayout,文本字段位于 FlowLayout 中,它们被添加到 gridLayout 面板上。所以文本字段不再被拉伸。

【讨论】:

    【解决方案3】:

    您可以参考here

    setMaximumSize 方法可以在 JComponent 中找到,JTextField 可以从 JComponent 中使用此方法。

    编辑:但是,硬编码 JTextField 的大小似乎不是一个好习惯,尤其是当您在多个平台上运行它时,因为您可能会遇到字体大小问题。

    【讨论】:

    • 在专业的 Java GUI 应用程序中,从不明确设置首选大小 - 您假设组件的字体大小将始终适合 20 像素的高度。如果用户在他们的桌面上设置了大字体,那将是不正确的。使用支持 JTextField 首选大小的布局管理器 - 默认为运行应用程序的桌面的正确高度。硬编码在某些时候肯定是错误的(特别是 Mac OS,其默认字体高度比 Windows 大)。这种事情是布局管理器存在的原因之一。
    • 哦。我不知道那件事。似乎是一个有效的观点。将编辑我的帖子。
    【解决方案4】:

    感谢所有帮助的人,希望这对未来的其他人有所帮助。我得到了我想要的视觉效果。

    private JTextField username;
    private JPasswordField password;
    private JPanel [] login = {new JPanel(), new JPanel()};
    private JLabel usernamelabel;
    private JLabel passwordlabel;
    
    public LoginPanel(){
    
        setSize(200,200);
        setBackground(new Color(85,153,187));
        setBorder(BorderFactory.createEmptyBorder(70, 70, 70, 70));
        username = new JTextField();
        password = new JPasswordField();
        usernamelabel= new JLabel("Username");
        passwordlabel= new JLabel("Password");
        login[0].add(usernamelabel);
        login[0].add(username);
        login[1].add(passwordlabel);
        login[1].add(password);
        for(JPanel p : login){
            p.setBackground(new Color(85,153,187));
            this.add(p);
        }
        username.setBounds(5, 5, 100, 100);
        username.setPreferredSize(new Dimension(120,20));
        password.setPreferredSize(new Dimension(120,20));
    
    } 
    

    【讨论】:

      【解决方案5】:

      在紧要关头,做

      tf.setMaximumSize(tf.getMinimumSize())
      

      将保持它不变的大小和平台中立。

      【讨论】:

      • 这是正确的,所以如果 LayoutManager 尊重这些提示,它将起作用,如果不是,则不会。适用于 Flow 和 Box 布局并保持字段大小不变,包括高度和宽度。
      • 也不完全正确:a) max 对 Flow 没有任何影响 b) true: box 尊重 max - 但很可能(虽然没有尝试 ;-) 如果 min 错误:stackoverflow.com/questions/7229226/… - 相反,请使用满足您需要的 LayoutManager
      猜你喜欢
      • 2011-09-13
      • 2012-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-01
      • 2014-05-02
      • 2012-05-17
      • 1970-01-01
      相关资源
      最近更新 更多