wake-up-neo.com

Wie kann ich zulassen, dass in jTextField nur Ziffern eingegeben werden?

Ich habe versucht, das gezeigte Beispiel hier zu verwenden, aber Java zeigt die Fehlermeldung von

"AttributeSet kann nicht in einen Typ aufgelöst werden"

Aus diesem Grund versuche ich, eine andere Methode zu verwenden, um nur Ziffern zuzulassen:

txtUsername.addKeyListener(new MyKeyListener());

public class MyKeyListener extends KeyAdapter{
  public void keyPressed(KeyEvent ke){
      System.out.println("Key pressed code = "+ke.getKeyCode());
      if (ke.getKeyCode()>=48 && ke.getKeyCode()<=57)
              return true;
      else
              return false;
  }
} 

Aber natürlich funktioniert es nicht, weil die Methode keyPressedvoid ist. Was ist also zu tun, um nur Ziffern im Textfeld zu drucken?

11
Bakhtiyor

Überprüfen Sie hier diesen Codeausschnitt. So lassen Sie nur Ziffern in JTextField zu, indem Sie DocumentFilter als effektivste Methode verwenden:

import Java.awt.*;
import javax.swing.*;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
import javax.swing.text.DocumentFilter.FilterBypass;

public class InputInteger
{
    private JTextField tField;
    private MyDocumentFilter documentFilter;

    private void displayGUI()
    {
        JFrame frame = new JFrame("Input Integer Example");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        JPanel contentPane = new JPanel();
        contentPane.setBorder(
            BorderFactory.createEmptyBorder(5, 5, 5, 5));
        tField = new JTextField(10);
        ((AbstractDocument)tField.getDocument()).setDocumentFilter(
                new MyDocumentFilter());        
        contentPane.add(tField); 

        frame.setContentPane(contentPane);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args)
    {
        Runnable runnable = new Runnable()
        {
            @Override
            public void run()
            {
                new InputInteger().displayGUI();
            }
        };
        EventQueue.invokeLater(runnable);
    }
}

class MyDocumentFilter extends DocumentFilter
{   
    @Override
    public void insertString(DocumentFilter.FilterBypass fp
            , int offset, String string, AttributeSet aset)
                                throws BadLocationException
    {
        int len = string.length();
        boolean isValidInteger = true;

        for (int i = 0; i < len; i++)
        {
            if (!Character.isDigit(string.charAt(i)))
            {
                isValidInteger = false;
                break;
            }
        }
        if (isValidInteger)
            super.insertString(fp, offset, string, aset);
        else
            Toolkit.getDefaultToolkit().beep();
    }

    @Override
    public void replace(DocumentFilter.FilterBypass fp, int offset
                    , int length, String string, AttributeSet aset)
                                        throws BadLocationException
    {
        int len = string.length();
        boolean isValidInteger = true;

        for (int i = 0; i < len; i++)
        {
            if (!Character.isDigit(string.charAt(i)))
            {
                isValidInteger = false;
                break;
            }
        }
        if (isValidInteger)
            super.replace(fp, offset, length, string, aset);
        else
            Toolkit.getDefaultToolkit().beep();
    }
}

Oder man kann einfach diesen Ansatz verwenden, wie von @Carlos Heuberger

@Override
public void insertString(FilterBypass fb, int off
                    , String str, AttributeSet attr) 
                            throws BadLocationException 
{
    // remove non-digits
    fb.insertString(off, str.replaceAll("\\D++", ""), attr);
} 
@Override
public void replace(FilterBypass fb, int off
        , int len, String str, AttributeSet attr) 
                        throws BadLocationException 
{
    // remove non-digits
    fb.replace(off, len, str.replaceAll("\\D++", ""), attr);
}
25
nIcE cOw

Ich würde vorschlagen, ein JFormattedTextField zu verwenden. Hier ist, wie: Wie man formatierte Textfelder verwendet

9
COD3BOY

Dies ist, was ich verwende, um Nicht-Zahlen zu konsumieren

textField.addKeyListener(new KeyAdapter() {
        public void keyTyped(KeyEvent e) {
            char c = e.getKeyChar();
            if (((c < '0') || (c > '9')) && (c != KeyEvent.VK_BACK_SPACE)) {
                e.consume(); // consume non-numbers
            }
        }
    });
0
Alde

Versuche dies:

public void replace(DocumentFilter.FilterBypass fb, int offset,
     int length, String text, AttributeSet attrs)throws BadLocationException { 

    if(fb.getDocument().getLength() + text.length() > 10) {
        return;
    }
    fb.insertString(offset, text, attrs);
}

anstatt:

public void replace(DocumentFilter.FilterBypass fp, int offset
                , int length, String string, AttributeSet aset)
                                    throws BadLocationException
{
    int len = string.length();
    boolean isValidInteger = true;

    for (int i = 0; i < len; i++)
    {
        if (!Character.isDigit(string.charAt(i)))
        {
            isValidInteger = false;
            break;
        }
    }
    if (isValidInteger)
        super.replace(fp, offset, length, string, aset);
    else
        Toolkit.getDefaultToolkit().beep();
}
0
Khan Usama