设置TextField的宽度

时间:2012-01-27 09:55:23

标签: java swing jtextfield

我想设置TextField可以使用的最大条目数,我用过:

setMaximumSize
setPreferredWidth
SetColumns

但未能这样做。我怎么能完成它?

这是我的代码:

import java.awt.*;
import javax.swing.*;
public class ButtonDemo extends JFrame {

    public static void main(String args[]){
        JFrame jfrm = new JFrame("Sample program");
        Container Content =  jfrm.getContentPane(); 
        content.setBackground(Color.red);
        jfrm.setLayout(null);

        jfrm.setBounds(250, 150, 400, 400);
        JTextField text = new JTextField();
        Font font1 = new Font("Courier",Font.BOLD,12);
        text.setFont(font1); 
        text.setBounds(50, 15, 100, 30);

        JButton button1 = new JButton("PROGRAM"); 
        button1.setFont(font1);
        button1.setBounds(250, 15, 100, 40);
        button1.setBackground (Color.white);

        JButton button3 = new JButton("EXIT");
        button3.setBounds(250, 115, 100, 40);
        button3.setBackground (Color.cyan);
        button1.setForeground (Color.red);

        JButton button2 = new JButton("USER"); 
        button2.setBounds(250, 65, 100, 40);
        button2.setBackground (Color.WHITE);

        jfrm.add(button1);  
        jfrm.add(button2); 
        jfrm.add(button3); 
        jfrm.add(text); 

        jfrm.setVisible(true);  
        jfrm.setResizable(false);
    }
}

5 个答案:

答案 0 :(得分:5)

使用DocumentFilter,如本教程中所述Oracle doc filter tutorial

以下是我最近用来限制框中最大条目大小和字符类的内容:

class SizeAndRegexFilter extends DocumentFilter {
  private int maxSize;
  private String regex;

  SizeAndRegexFilter (int maxSize,String regex) {
    this.maxSize=maxSize;
    this.regex=regex;

  } 
  public void insertString(FilterBypass fb, int offs,String str, AttributeSet a) throws BadLocationException {
    if ((fb.getDocument().getLength() + str.length()) <= maxSize && str.matches(regex))
        super.insertString(fb, offs, str, a);
    else
        Toolkit.getDefaultToolkit().beep();
  }

  public void replace(FilterBypass fb, int offs,int length, String str, AttributeSet a) throws BadLocationException {
    if ((fb.getDocument().getLength() + str.length()
             - length) <= maxSize  && str.matches(regex))
            super.replace(fb, offs, length, str, a);
        else
            Toolkit.getDefaultToolkit().beep();
  }
}

您也可以在离开输入字段之前使用InputVerifier检查输入。 (提示:如何确保输入完全 n个字符?)

答案 1 :(得分:2)

文本字段本身不限制文本的长度。要获得您想要的内容,您必须通过调用setDocument()或将其传递给构造函数来为文本字段提供不同的文档。

您的文档将是javax.swing.text.Document的实例,例如javax.swing.text.PlainDocument的子类。然后覆盖public void insertString(int offs, String str, AttributeSet a) throws BadLocationException方法。

Swing似乎有FixedLengthDocument,但这是HTMLDocument的私有静态内部类。但是,为了帮助您入门,这是该类源代码的相关部分:

public void insertString(int offset, String str, AttributeSet a) throws BadLocationException {
  if (str != null && str.length() + getLength() <= maxLength) {
    super.insertString(offset, str, a);
  }
}

答案 2 :(得分:2)

除了使用托马斯建议的其他Document之外,您还可以使用FormattedTextField。可能会更容易。

答案 3 :(得分:1)

为了你的工作,我修改了你的程序,看看:

import java.awt.*;
import javax.swing.*;
import javax.swing.text.*;
public class ButtonDemo extends JFrame {    

    public static void main(String args[]){
        JFrame jfrm = new JFrame("Sample program");
        jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jfrm.setLocationByPlatform(true);
        Container content =  jfrm.getContentPane(); 
        content.setBackground(Color.red);
        jfrm.setLayout(null);

        jfrm.setBounds(250, 150, 400, 400);
        JTextField text = new JTextField();
        Font font1 = new Font("Courier",Font.BOLD,12);
        text.setFont(font1); 
        text.setBounds(50, 15, 100, 30);

        AbstractDocument abdoc;
        Document doc = text.getDocument();
        if (doc instanceof AbstractDocument)
        {
            abdoc = (AbstractDocument) doc;
            abdoc.setDocumentFilter(new DocumentSizeFilter(4));
        }

        JButton button1 = new JButton("PROGRAM"); 
        button1.setFont(font1);
        button1.setBounds(250, 15, 100, 40);
        button1.setBackground (Color.white);

        JButton button3 = new JButton("EXIT");
        button3.setBounds(250, 115, 100, 40);
        button3.setBackground (Color.cyan);
        button1.setForeground (Color.red);

        JButton button2 = new JButton("USER"); 
        button2.setBounds(250, 65, 100, 40);
        button2.setBackground (Color.WHITE);

        jfrm.add(button1);  
        jfrm.add(button2); 
        jfrm.add(button3); 
        jfrm.add(text); 

        jfrm.setVisible(true);  
        jfrm.setResizable(false);
    }
}

class DocumentSizeFilter extends DocumentFilter {

   private int max_Characters;
   private boolean DEBUG;

   public DocumentSizeFilter(int max_Chars) {

      max_Characters = max_Chars;
      DEBUG = false;
   }

   public void insertString(FilterBypass fb
                            , int offset
                              , String str
                                , AttributeSet a) 
   throws BadLocationException {

      if (DEBUG) {

         System.out.println("In DocumentSizeFilter's insertString method");
      }

      if ((fb.getDocument().getLength() + str.length()) <= max_Characters) 
         super.insertString(fb, offset, str, a);
      else 
         Toolkit.getDefaultToolkit().beep();
   }

   public void replace(FilterBypass fb
                       , int offset, int length
                       , String str, AttributeSet a)
   throws BadLocationException {

      if (DEBUG) {

         System.out.println("In DocumentSizeFilter's replace method");
      }
      if ((fb.getDocument().getLength() + str.length()
           - length) <= max_Characters) 
         super.replace(fb, offset, length, str, a);
      else
         Toolkit.getDefaultToolkit().beep();
   }
}

只需在此添加abdoc.setDocumentFilter(new DocumentSizeFilter(4)); JTextField所需的最大字符数。用您选择的任意数字替换4。

希望这可能会有所帮助。

此致

答案 4 :(得分:0)

问题是您的布局管理器仍在负责布局,因此,setMaximumSize setPreferredWidth不起作用。

要在开始时修复此问题,您需要将布局管理器设置为null。

jfrm.setLayout(null);

虽然通过这样做,您将需要使用组件的绝对定位。

另见 Java, Swing: how do I set the maximum width of a JTextField?