【问题标题】:How to disallow special characters in JTextField如何在 JTextField 中禁止特殊字符
【发布时间】:2020-04-27 21:14:05
【问题描述】:

我正在尝试禁止 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);
    }
} 

【问题讨论】:

标签: java swing validation awt


【解决方案1】:

这是一个使用InputVerifier 的示例。它是minimal example,因此您可以按原样复制代码并运行它。请注意,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 [supposedly] 是 Swing 的继任者,所以如果您正在考虑用 java 开发新的 GUI,也许您应该考虑使用 JavaFX。如果你必须使用Swing,我强烈推荐Creating a GUI With JFC/Swing

【讨论】:

    【解决方案2】:

    我认为,您可以使用JFormattedTextField,而不是添加侦听器并仅使用简单的JTextField。正如 Oracle 文档中所说:

    JFormattedTextField - 一个 JTextField 子类,允许您指定用户可以输入的合法字符集。

    查看以下链接:

    【讨论】:

    • 如果可以的话,我认为您可以在答案中包含一个与 JFormattedTextField 的 AbstractFormatter 一起使用的正则表达式。无论如何+1。 :)
    【解决方案3】:

    可能是这样的:

    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");
     }
    }
    

    【讨论】:

    • ke.意思是???没见过这个,我还在学java
    • @KevinMedjiako 我错过了复制功能。我的错。检查编辑。
    • @Kevin Medjiako ke 是 KeyEvent 类型的对象。一旦按下某个键,组件就会生成 KeyEvent。
    • KeyListener 是这项工作的错误工具。这是一个非常低级的监听器。在Abra's answer 中看到的InputVerifier 或在Armine's answer 中看到的JFormattedTextField 都是这里的方法。
    【解决方案4】:

    输入数值 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);
            }
         }
      });
    

    【讨论】:

    • 如何使用 @*# 之类的字符来做到这一点
    • 对不起,我写的内容不清楚我正在寻找一种格式预期,它不包含所有特殊字符
    • 如果我将文本粘贴到 JTextField 中,KeyListener 会起作用吗?
    • KeyListener 是这个工作的错误工具。这是一个非常低级的监听器。在@Abra's answer 中看到的InputVerifier 或在Armine's answer 中看到的JFormattedTextField 都是这里的方法。
    猜你喜欢
    • 1970-01-01
    • 2021-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-10
    相关资源
    最近更新 更多