【问题标题】:Alphabets validation of jtextfieldjtextfield的字母验证
【发布时间】:2014-10-28 05:11:55
【问题描述】:

我一直在尝试只在 jtextfield 中显示字母。即使按下其他键,jtextfield 也不应该显示它们,只显示字母。你能帮我解决这个问题吗..

【问题讨论】:

标签: java swing


【解决方案1】:

先看看Implementing a Document Filter

import java.awt.EventQueue;
import javax.swing.JFrame;
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 TestFilter {

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

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

                JTextField field = new JTextField(10);
                ((AbstractDocument)field.getDocument()).setDocumentFilter(new CharFilter());

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

    public class CharFilter extends DocumentFilter {

        @Override
        public void insertString(DocumentFilter.FilterBypass fb, int offset,
                        String string, AttributeSet attr)
                        throws BadLocationException {

            StringBuilder buffer = new StringBuilder(string);
            for (int i = buffer.length() - 1; i >= 0; i--) {
                char ch = buffer.charAt(i);
                if (!Character.isAlphabetic(ch)) {
                    buffer.deleteCharAt(i);
                }
            }
            super.insertString(fb, offset, buffer.toString(), attr);
        }

        @Override
        public void replace(DocumentFilter.FilterBypass fb,
                        int offset, int length, String string, AttributeSet attr) throws BadLocationException {
            if (length > 0) {
                fb.remove(offset, length);
            }
            insertString(fb, offset, string, attr);
        }
    }
}

你也会觉得DocumentFilter Examples很有帮助

【讨论】:

  • 对我来说很好用,给你换一个runnable example 来证明你的问题
  • 获取CharFilter,将其复制到它自己的类中。修改您的代码以按照演示使用它,((AbstractDocument)field.getDocument()).setDocumentFilter(new CharFilter());...
  • 这是一个您必须将其集成到您的代码中的概念的示例,我们不会为您这样做...您负担不起我们的费率... . ;)
  • 记住,努力会得到回报;)
【解决方案2】:

如果您只想将字母输入到 jtextfield,并且不应该输入其他键,即使它们被按下,这里是一个解决方案。在您的 jframe 中只需选择您的 jtextfield 右键单击​​ jtextfield,您将找到事件然后转到事件单击 keyTyped 事件,然后编写以下代码以仅在 jtextfield 中输入字母。

private void tfempidKeyTyped(java.awt.event.KeyEvent evt) {
// TODO 在此处添加您的处理代码:

    char key = evt.getKeyChar();
    if (key > '0' && key < '9') {
        evt.consume();
    }

【讨论】:

  • KeyListener 是过滤文本组件中内容的糟糕选择,这就是创建 DocumentFilter API 的原因。无法保证通知KeyListeners 的顺序,这意味着击键可能已经传递到文本组件的Document,并且在某些情况下会导致生成文档突变异常。
猜你喜欢
  • 2018-09-08
  • 2020-11-19
  • 2012-01-25
  • 2012-12-31
  • 1970-01-01
  • 1970-01-01
  • 2012-12-11
  • 1970-01-01
  • 2017-07-20
相关资源
最近更新 更多