Как я могу печатать только символы в jTextField?

1

Мне нужно вводить только символы в области текстового поля в java. Я попробовал коды ниже, перейдя на различные типы.

char a= evt.getKeyChar();
    if(!(a>='0'&&a<='9')){
    evt.consume();
    }
Теги:
swing

3 ответа

4
Лучший ответ

Попробуйте использовать DocumentFilter и присоедините его к Document JTextField.

Вот небольшой пример для этого: для справки:

FilterCharacters.java

package to.uk.gagandeepbali.examples;

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

/**
 * Created by Gagandeep Bali on 7/12/2014.
 */
public class FilterCharacters {

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

        JPanel contentPane = new JPanel();
        JTextField 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 FilterCharacters().displayGUI();
            }
        };
        EventQueue.invokeLater(runnable);
    }
}

MyDocumentFilter.java

package to.uk.gagandeepbali.examples;

import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
import java.awt.*;

/**
 * Created by Gagandeep Bali on 7/12/2014.
 */
public class MyDocumentFilter extends DocumentFilter {
    @Override
    public void insertString(DocumentFilter.FilterBypass fp, int offset,
                                String stringToFilter, AttributeSet aset)
                                    throws BadLocationException {
        int len = stringToFilter.length();
        if (Character.isLetter(stringToFilter.charAt(len - 1)))
            super.insertString(fp, offset, stringToFilter, aset);
        else
            Toolkit.getDefaultToolkit().beep();
    }

    @Override
    public void replace(DocumentFilter.FilterBypass fp, int offset, int length,
                                        String stringToFilter, AttributeSet aset)
                                                    throws BadLocationException {
        int len = stringToFilter.length();
        if (Character.isLetter(stringToFilter.charAt(len - 1)))
            super.replace(fp, offset, length, stringToFilter, aset);
        else
            Toolkit.getDefaultToolkit().beep();
    }
}
  • 1
    Именно так! 1+ за голосование
3

Похоже, вы используете KeyListener в JTextField, и если да, не делайте этого, потому что вы испортите функцию JTextField. Вместо этого используйте либо JFormattedTextField, либо укажите текстовое поле Document the DocumentListener.


редактировать
Например:

import java.text.Format;
import java.text.NumberFormat;

import javax.swing.*;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
import javax.swing.text.PlainDocument;

public class DigitOnlyFieldTest {

   private static void createAndShowGui() {
      Format digitFormat = NumberFormat.getIntegerInstance();
      JFormattedTextField digitField = new JFormattedTextField(digitFormat);
      digitField.setColumns(10);

      JTextField textField = new JTextField(10);
      ((PlainDocument) textField.getDocument()).setDocumentFilter(new DocumentFilter() {
         @Override
         public void insertString(FilterBypass fb, int offset, String text,
               AttributeSet attr) throws BadLocationException {
            text = text.replaceAll("\\D", "");
            super.insertString(fb, offset, text, attr);
         }

         @Override
         public void replace(FilterBypass fb, int offset, int length,
               String text, AttributeSet attrs) throws BadLocationException {
            text = text.replaceAll("\\D", "");
            super.replace(fb, offset, length, text, attrs);
         }
      });


      JPanel mainPanel = new JPanel();
      mainPanel.add(new JLabel("Formatted Text Field: "));
      mainPanel.add(digitField);
      mainPanel.add(new JLabel("Text Field with Doc Filter: "));
      mainPanel.add(textField);

      JFrame frame = new JFrame("DigitOnlyFieldTest");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

Теперь это будет работать с текстовой записью пользователя, с копией и вставкой, а также с текстовой записью на основе программного обеспечения.

0

Попробуйте этот пример, это может помочь вам

import java.awt.FlowLayout;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class SwingDemo extends JFrame {

    private JTextField textField;

    public SwingDemo() {
        super("TextField Filter Example By SuRu");
        setBounds(100, 100, 500, 200);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        setLayout(new FlowLayout());
        getContentPane().add(new JLabel("Accepts Only Digits: "));

        textField = new JTextField(40);
        getContentPane().add(textField);

        textField.addKeyListener(new KeyAdapter() {

            @Override
            public void keyTyped(KeyEvent e) {
                if (!Character.isDigit(e.getKeyChar())) {
                    e.consume();
                }
            }
        });

    }

    public static void main(String[] args) {
        new SwingDemo().setVisible(true);
    }

}
  • 1
    А если он использует copy-paste для добавления текста в JTextField? Опять же, не используйте KeyListener в этой ситуации, так как есть гораздо более надежные ответы. -1 отрицательный голос.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню