如何在Java中设置文本框的高度和宽度?

12

我试图让JTextField填充整个宽度并设置高度,但仍然失败。我尝试添加了代码setPreferredSize(new Dimension(320,200));,但仍然失败。是否有任何方法可以让我的JTextField填充整个宽度并将高度设置为200或其他值?


4
需要问的问题是“为什么”。“通常最好让布局管理器决定使用的最佳大小。您可以通过文本字段的Fontcolumns方法向布局管理器提供提示。这样,它在不同操作系统上的工作机会就更大了。” - MadProgrammer
一个次优的问题会引出次优的答案,即使十年后再问也是如此 ;) 正如@MadProgrammer所评论的那样:关键是为什么,需要详细的回答 - 没有上下文,这个问题无法回答,所有尝试只能是近似。 - kleopatra
一个次优的问题引出了次优的答案,即使在十年后被提出;) 正如@MadProgrammer已经评论的那样:为什么很重要,并且需要一个详细的答案 - 没有上下文,这是无法回答的,所有的尝试只能是近似的。 - undefined
@kleopatra和MadProgrammer,不知道为什么有人对真实问题给出如此愚蠢的回答。他不知道如何调整大小以适应自己的需求。告诉他“哦,神奇的布局管理器会处理这个问题”只是在嘲笑他。为什么你们不在下面给出一个答案,告诉他如何告诉布局管理器正确地调整项目的大小呢?嗯?因为:你们不知道如何帮助他。你们自己也不知道如何根据他的需求调整组件的大小。所以:为什么要发表混乱的评论,对任何人都没有帮助呢? - Angel O'Sphere
9个回答

28

不应该调整高度,应该让文本字段根据字体自行确定高度。

如果想要控制文本字段的宽度,可以使用

textField.setColumns(...);

让文本字段确定首选宽度。

或者,如果您希望宽度为父面板的整个宽度,则需要使用适当的布局。也许是边框布局的NORTH。

有关更多信息,请参见布局管理器上的Swing教程。


2
我需要保持浮动宽度但固定高度。我该怎么做? - Tomáš Zato
@TomášZato 所有布局问题的答案总是一个合适的 LayoutManager - 如果 Swing 中的那些不够好,考虑使用第三方库,比如 MigLayout(免费且偶尔更新)或 JGoodies Formlayout(免费版本虽然没有维护但仍然不错,付费版本则有维护)。无论我们使用什么,我们的主要思维转换是将布局的完整责任放在管理器中(组件本身只是助手:它们的责任是根据自己的状态计算/调整自己的大小提示)。 - kleopatra

6

将高度设置为200

Font设置为大号变体(150+ px)。如前所述,使用列来控制宽度,并使用布局管理器(或约束)来遵守首选宽度和高度。

Big Text Fields

import java.awt.*;
import javax.swing.*;
import javax.swing.border.EmptyBorder;

public class BigTextField {

    public static void main(String[] args) {
        Runnable r = new Runnable() {

            @Override
            public void run() {
                // the GUI as seen by the user (without frame)
                JPanel gui = new JPanel(new FlowLayout(5));
                gui.setBorder(new EmptyBorder(2, 3, 2, 3));

                // Create big text fields & add them to the GUI
                String s = "Hello!";
                JTextField tf1 = new JTextField(s, 1);
                Font bigFont = tf1.getFont().deriveFont(Font.PLAIN, 150f);
                tf1.setFont(bigFont);
                gui.add(tf1);

                JTextField tf2 = new JTextField(s, 2);
                tf2.setFont(bigFont);
                gui.add(tf2);

                JTextField tf3 = new JTextField(s, 3);
                tf3.setFont(bigFont);
                gui.add(tf3);

                gui.setBackground(Color.WHITE);

                JFrame f = new JFrame("Big Text Fields");
                f.add(gui);
                // Ensures JVM closes after frame(s) closed and
                // all non-daemon threads are finished
                f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                // See https://dev59.com/7Ww05IYBdhLWcg3wmC6_#7143398 for demo.
                f.setLocationByPlatform(true);

                // ensures the frame is the minimum size it needs to be
                // in order display the components within it
                f.pack();
                // should be done last, to avoid flickering, moving,
                // resizing artifacts.
                f.setVisible(true);
            }
        };
        // Swing GUIs should be created and updated on the EDT
        // http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html
        SwingUtilities.invokeLater(r);
    }
}

3

有一种方法可能不完美,但可以满足您的要求。这里的主要点是使用特殊尺寸来限制高度。但与此同时,宽度实际上是自由的,因为最大宽度足够大。

package test;
import java.awt.*;
import javax.swing.*;

public final class TestFrame extends Frame{
    public TestFrame(){
        JPanel p = new JPanel();
        p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS));
        p.setPreferredSize(new Dimension(500, 200));
        p.setMaximumSize(new Dimension(10000, 200));
        p.add(new JLabel("TEST: "));

        JPanel p1 = new JPanel();
        p1.setLayout(new BoxLayout(p1, BoxLayout.X_AXIS));
        p1.setMaximumSize(new Dimension(10000, 200));
        p1.add(new JTextField(50));

        p.add(p1);

        this.setLayout(new BorderLayout());
        this.add(p, BorderLayout.CENTER);
    }
    //TODO: GUI CREATE
}

1

xyz.setColumns() 方法控制 TextField 的宽度。

import java.awt.*;
import javax.swing.*;



class miniproj extends JFrame {

  public static void main(String[] args)
  {
    JFrame frame=new JFrame();
    JPanel panel=new JPanel();
    frame.setSize(400,400);
    frame.setTitle("Registration");


    JLabel lablename=new JLabel("Enter your name");
    TextField tname=new TextField(30);
    tname.setColumns(45);

    JLabel lableemail=new JLabel("Enter your Email");
    TextField email=new TextField(30);
    email.setColumns(45);
    JLabel lableaddress=new JLabel("Enter your address");
    TextField address=new TextField(30);
    address.setColumns(45);
    address.setFont(Font.getFont(Font.SERIF));
    JLabel lablepass=new JLabel("Enter your password");
    TextField pass=new TextField(30);
    pass.setColumns(45);

    JButton login=new JButton();
    JButton create=new JButton();
    login.setPreferredSize(new Dimension(90,30));
    login.setText("Login");
    create.setPreferredSize(new Dimension(90,30));
    create.setText("Create");



    panel.add(lablename);
    panel.add(tname);
    panel.add(lableemail);
    panel.add(email);
    panel.add(lableaddress);
    panel.add(address);
    panel.add(lablepass);
    panel.add(pass);
    panel.add(create);
    panel.add(login);



    frame.add(panel);
    frame.setVisible(true);
  }
}

enter image description here


0

或许在你的JTextField上应用一个EmptyBorder会是模拟高度最简单的解决方案,而对于宽度则可以使用setColumns()方法。

JTextField input=new JTextField();
input.setColumns(10);
input.setBorder(new EmptyBorder(15,0,15,0);

EmptyBorder 构造函数的 4 个参数分别是:上、左、下和右。

或者,如果您想要更多技术性的内容,可以重写 getPreferredSize、getMinimumSize 和 getMaximumSize 方法,以便返回您想要应用为宽度和高度的值。

JTexField input=new JTextField(){
    @Override
    public Dimension getPreferredSize(){
        return new Dimension(200,40);
    };
    public Dimension getMinimumSize(){
        return new Dimension(200,40);
    };
    public Dimension getMaximumSize(){
        return new Dimension(200,40);
    };
};

请注意:硬编码大小提示,即使通过重写getter方法也是错误的! - kleopatra

0

1
请参阅setLayout(null)是永远不必要的。永远不需要!,了解我为什么会对以该建议为起点并以“但是…”开头的建议进行投票反对,并转而使用大小提示和布局管理器作为明智的策略。 - Andrew Thompson
你认为JFrame的默认布局是什么?@AndrewThompson - Abhishek Bhandari
@AndrewThompson 试着在一个简单的继承JFrame的类中添加一个JTextField,给JTextField设置一些大小。从主方法中调用构造函数。你会看到setLayout(null)的使用,并且你也可以为上述讨论做出贡献 :) - Abhishek Bhandari
@AndrewThompson 的 "继承JFrame的类" 是一个例子。我有一个习惯,就是通过例子来学习。 - Abhishek Bhandari
我有一个习惯,就是通过例子来学习。希望你能从BigTextField中学到一些东西。 :) - Andrew Thompson
显示剩余2条评论

0
你正在使用什么类型的LayoutManager来添加JTextField到面板上?
不同的布局管理器以不同的方式处理它们上面的元素大小,有些会尊重SetPreferredSize(),而其他一些则会缩放组件以适应其容器。
请参见:http://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html 附注:这与Eclipse无关,而是Java。

3
尊重地说,那是一条评论 - 依我之见。 - MadProgrammer

-1
package myguo;
import javax.swing.*;

public class MyGuo {

    JFrame f;
    JButton bt1 , bt2 ;
    JTextField t1,t2;
    JLabel l1,l2;

    MyGuo(){

        f=new JFrame("LOG IN FORM");
        f.setLocation(500,300);
        f.setSize(600,500);
        f.setLayout(null);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        l1=new JLabel("NAME");
        l1.setBounds(50,70,80,30);

        l2=new JLabel("PASSWORD");
        l2.setBounds(50,100,80,30);

        t1=new JTextField();
        t1.setBounds(140, 70, 200,30);

         t2=new JTextField();
        t2.setBounds(140, 110, 200,30);

        bt1 =new JButton("LOG IN");
        bt1.setBounds(150,150,80,30);

        bt2 =new JButton("CLEAR");
        bt2.setBounds(235,150,80,30);

         f.add(l1);
        f.add(l2);
         f.add(t1);
         f.add(t2);
         f.add(bt1);
         f.add(bt2);

    f.setVisible(true);

    }
    public static void main(String[] args) {
        MyGuo myGuo = new MyGuo();
}
}

1
我相信原帖作者会很感激一些代码解释。 - Brent Worden
空布局总是__错误的__! - kleopatra

-2

setBounds 只在 BorderLayout 中起作用,请在框架、容器或面板中使用 BorderLayout,并使用 setBounds 设置文本字段的宽度和高度。 请参考以下简单代码:

 import java.awt.*;
 import javax.swing.*;

   class uni1
   {
     public static void main(String[] args)
{
    JFrame frm = new JFrame();
    TextField txt = new TextField();
    txt.setBounds(0, 0, 1200, 400);
    frm.add(txt,BorderLayout.NORTH);
    frm.setLayout(new BorderLayout());
    frm.setVisible(true);
    frm.setDefaultCloseOperation(frm.EXIT_ON_CLOSE);
}

}


setBounds仅在BorderLayout中有效 - 在每个布局中都这样做是错误的,甚至不要考虑这样做,而是学习如何使用layoutManagers,例如从https://docs.oracle.com/javase/tutorial/uiswing/layout/index.html。无关:在公开显示Java代码时遵循Java命名约定..并尝试更加努力地格式化代码(无制表符,最少4个前导空格)。 - kleopatra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接