Установка ширины TextField - PullRequest
       4

Установка ширины TextField

1 голос
/ 27 января 2012

Я хочу установить максимальное количество записей, которое может принять 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 ]

5 голосов
/ 27 января 2012

Используйте DocumentFilter, как описано в этом уроке Урок Oracle Doc Filter

Вот, например, то, что я недавно использовал, чтобы ограничить максимальный размер записи и класс char в поле:

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 символов?)

2 голосов
/ 27 января 2012

Помимо использования другого Document, как предложено Томасом, вы также можете использовать FormattedTextField . Может быть проще.

2 голосов
/ 27 января 2012

Само текстовое поле не ограничивает длину текста.Чтобы получить то, что вы хотите, вам нужно будет предоставить другой документ в текстовое поле, вызвав setDocument() или передав его конструктору.

Ваш документ будет экземпляром javax.swing.text.Document, напримерподкласс javax.swing.text.PlainDocument.Затем переопределите метод public void insertString(int offs, String str, AttributeSet a) throws BadLocationException.

Кажется, что Swing имеет FixedLengthDocument, однако это частный статический внутренний класс HTMLDocument.Однако, чтобы начать, вот соответствующая часть этого класса 'source:

public void insertString(int offset, String str, AttributeSet a) throws BadLocationException {
  if (str != null && str.length() + getLength() <= maxLength) {
    super.insertString(offset, str, a);
  }
}
1 голос
/ 27 января 2012

Я немного изменил вашу программу для вашей работы, посмотрите:

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 на любое число по вашему выбору.

Надеюсь, это может как-то помочь.

С уважением

0 голосов
/ 27 января 2012

Проблема в том, что ваш менеджер макета по-прежнему отвечает за макет, поэтому setMaximumSize setPreferredWidth не работают.

Чтобы исправить это при запуске, необходимо установить менеджер макета на ноль.

jfrm.setLayout(null);

Хотя при этом вам необходимо использовать абсолютное позиционирование компонентов.

Также см. Java, Swing: как мне установить максимальную ширину JTextField?

...