webentwicklung-frage-antwort-db.com.de

Begrenzen der Anzahl der Zeichen in einem JTextField

Ich möchte die maximale Länge eines JTextField festlegen, damit Sie nicht mehr Zeichen als das Limit eingeben können. Dies ist der Code, den ich bisher habe ...

    textField = new JTextField();
    textField.setBounds(40, 39, 105, 20);
    contentPane.add(textField);
    textField.setColumns(10);

Gibt es eine einfache Möglichkeit, die Anzahl der Zeichen zu begrenzen?

28
user1326088

Sie können so etwas tun (entnommen aus hier ):

import Java.awt.FlowLayout;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;

class JTextFieldLimit extends PlainDocument {
  private int limit;
  JTextFieldLimit(int limit) {
    super();
    this.limit = limit;
  }

  JTextFieldLimit(int limit, boolean upper) {
    super();
    this.limit = limit;
  }

  public void insertString(int offset, String str, AttributeSet attr) throws BadLocationException {
    if (str == null)
      return;

    if ((getLength() + str.length()) <= limit) {
      super.insertString(offset, str, attr);
    }
  }
}

public class Main extends JFrame {
  JTextField textfield1;

  JLabel label1;

  public void init() {
    setLayout(new FlowLayout());
    label1 = new JLabel("max 10 chars");
    textfield1 = new JTextField(15);
    add(label1);
    add(textfield1);
    textfield1.setDocument(new JTextFieldLimit(10));

    setSize(300,300);
    setVisible(true);
  }
}

Bearbeiten: Schauen Sie sich this previous SO post. Sie können Tastendruckereignisse abfangen und sie entsprechend der aktuellen Anzahl von Zeichen im Textfeld hinzufügen/ignorieren.

30
npinti

Seit der Einführung von DocumentFilter in Java 1.4) hat sich die Notwendigkeit, Document zu überschreiben, verringert.

DocumentFilter bietet die Möglichkeit, Inhalte zu filtern, die an Document übergeben wurden, bevor sie tatsächlich ankommen.

Auf diese Weise kann das Feld weiterhin die benötigten Dokumente verwalten und die Eingaben des Benutzers filtern.

import Java.awt.EventQueue;
import Java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;

public class LimitTextField {

    public static void main(String[] args) {
        new LimitTextField();
    }

    public LimitTextField() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JTextField pfPassword = new JTextField(20);
                ((AbstractDocument)pfPassword.getDocument()).setDocumentFilter(new LimitDocumentFilter(15));

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new GridBagLayout());
                frame.add(pfPassword);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class LimitDocumentFilter extends DocumentFilter {

        private int limit;

        public LimitDocumentFilter(int limit) {
            if (limit <= 0) {
                throw new IllegalArgumentException("Limit can not be <= 0");
            }
            this.limit = limit;
        }

        @Override
        public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
            int currentLength = fb.getDocument().getLength();
            int overLimit = (currentLength + text.length()) - limit - length;
            if (overLimit > 0) {
                text = text.substring(0, text.length() - overLimit);
            }
            if (text.length() > 0) {
                super.replace(fb, offset, length, text, attrs); 
            }
        }

    }

}
20
MadProgrammer

Es ist seltsam, dass das Swing-Toolkit diese Funktionalität nicht enthält, aber hier ist die beste Antwort auf Ihre Frage:

    textField = new JTextField();
    textField.addKeyListener(new KeyAdapter() {
        @Override
        public void keyTyped(KeyEvent e) {
            if (txtGuess.getText().length() >= 3 ) // limit to 3 characters
                e.consume();
        }
    });

Ich benutze dieses Beispiel in einem unterhaltsamen Ratespiel in meinem Udemy.com-Kurs "Learn Java Like a Kid". Cheers - Bryson

3
private void jTextField1KeyPressed(Java.awt.event.KeyEvent evt)
{
    if(jTextField1.getText().length()>=5)
    {
        jTextField1.setText(jTextField1.getText().substring(0, 4));
    }
}

Ich habe ein jtextfield genommen, dessen Name jTextField1 ist, der Code ist in seinem gedrückten Ereignis. Ich habe es getestet und es funktioniert. Und ich benutze die NetBeans IDE.

0
Suman Adhikary