Как запретить специальные символы в JTextField - PullRequest
0 голосов
/ 10 января 2020

Я пытаюсь запретить специальные символы в JTextField. Это для проекта, где мне нужно сделать проверку формы. На данный момент я могу разрешить только цифры, но не могу запретить специальные символы, такие как @ или # или / или \. Вот что я сделал до сих пор.

private void jTextField2ActionPerformed(java.awt.event.ActionEvent evt) {                                            
    try {
        int i= Integer.parseInt(jTextField2.getText());
    } catch (NumberFormatException e) {
        JOptionPane.showMessageDialog(null, "Please enter Int Value", "Invail Input", JOptionPane.ERROR_MESSAGE);
    }
} 

Ответы [ 4 ]

2 голосов
/ 10 января 2020

Я думаю, вместо добавления слушателей и использования простого JTextField, вы можете использовать JFormattedTextField. Как сказано в Oracle документах:

JFormattedTextField - подкласс JTextField, позволяющий указать допустимый набор символов, которые может вводить пользователь.

Проверка ссылки ниже:

1 голос
/ 10 января 2020

Вот пример, который использует InputVerifier. Это минимальный пример , поэтому вы можете скопировать код и запустить его. Обратите внимание, что класс InputVerifier был изменен в JDK 9. Тем не менее приведенный ниже код должен работать с любой версией JDK.

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import javax.swing.InputVerifier;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.WindowConstants;
import javax.swing.text.JTextComponent;

public class InpVerif implements Runnable {
    private JFrame frame;

    @Override // java.lang.Runnable
    public void run() {
        createAndDisplayGui();
    }

    private void createAndDisplayGui() {
        frame = new JFrame("Input Verifier");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.add(createMainPanel(), BorderLayout.CENTER);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private JPanel createMainPanel() {
        JPanel mainPanel = new JPanel(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.insets.bottom = 5;
        gbc.insets.left = 5;
        gbc.insets.right = 5;
        gbc.insets.top = 5;
        JLabel label = new JLabel("Enter Text");
        mainPanel.add(label, gbc);
        JTextField textField = new JTextField(10);
        textField.setInputVerifier(new SpecialCharactersVerifier());
        gbc.gridx = 1;
        mainPanel.add(textField, gbc);
        JLabel label2 = new JLabel("Disallowed Characters");
        gbc.gridx = 0;
        gbc.gridy = 1;
        mainPanel.add(label2, gbc);
        JTextField textField2 = new JTextField("@ # / \\");
        gbc.gridx = 1;
        mainPanel.add(textField2, gbc);
        return mainPanel;
    }

    private class SpecialCharactersVerifier extends InputVerifier {
        private String regex = "^.*[@#/\\\\].*$";

        @Override
        public boolean shouldYieldFocus(JComponent input) {
            boolean verified = verify(input);
            if (!verified) {
                JOptionPane.showMessageDialog(frame,
                                              "These characters not allowed: @ # / \\",
                                              "ERROR: Illegal Character[s]",
                                              JOptionPane.ERROR_MESSAGE);
            }
            return verified;
        }

        @Override
        public boolean verify(JComponent input) {
            boolean verified = true;
            if (input instanceof JTextComponent) {
                JTextComponent textComponent = (JTextComponent) input;
                String text = textComponent.getText();
                if (text != null) {
                    verified = !text.matches(regex);
                }
            }
            return verified;
        }
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new InpVerif());
    }
}

Обратите внимание, что JavaFX является [предположительно] преемником Swing , поэтому, если вы рассматриваете новую разработку GUI в java, возможно, вам следует рассмотреть возможность использования JavaFX . Если вам необходимо использовать Swing , я настоятельно рекомендую Создание GUI с JFC / Swing .

1 голос
/ 10 января 2020

Ввод чисел c значений JTextField:

Вы можете использовать addKeyListener: keyPressed

jTextField2.addKeyListener(new KeyAdapter() {
     public void keyPressed(KeyEvent k) {
        String value = jTextField2.getText();
        int len = value.length();
        if (k.getKeyChar() >= '0' && k.getKeyChar() <= '9') {
           jTextField2.setEditable(true);
        } else {
           jTextField2.setEditable(false);
        }
     }
  });
0 голосов
/ 10 января 2020

Может быть, что-то вроде этого:

public void keyPressed(KeyEvent ke) {
 String value = tf.getText();
 if (ke.getKeyChar() != '@' && ke.getKeyChar() != '#' && ke.getKeyChar() != '/' 
 && ke.getKeyChar() != '\') {
     tf.setEditable(true);
 } else {
     tf.setEditable(false);
     label.setText("Please enter Int Value, Invail Input");
 }
}
...