首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从JTextfield中获取DocumentFilter类型

如何从JTextfield中获取DocumentFilter类型
EN

Stack Overflow用户
提问于 2017-11-02 10:02:41
回答 1查看 255关注 0票数 0

问题:我想知道我们是否可以从JTextfield中得到DocumentFilter类型??

我读过很多java文档并搜索了很多,但没有找到任何信息。

需要:我在2 DocumentFilter上设置了相同的JTextfields。当事件发生时,在DocumentFilter的“替换”方法中,我想知道在哪个textfield上发生了事件。

用例:我有大约15个文本字段(将来可能会增加),我希望对以下所有内容进行单独检查:

  • 输入的最大文本长度
  • 必须只输入某些字符(所有文本字段都是相同的)。 例如: textfield1最多可以使用10个字符,而textfield2最多可以使用5个字符。

我到目前为止所做的事:

我已经为每个文本字段创建了单独的过滤器,这会导致大量的冗余代码,并增加了处理的复杂性,以供将来使用。

期待任何帮助。:-)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-03 10:13:57

好的,现在您的需求更清楚了,但是,您不能(也不应该)检查您在DocumentFilter内部输入哪个textfield来决定在replace ()方法中要做什么。

可能的解决方案:创建您自己的DocumentFilter类,传递您需要的所有参数(最大文本长度,可能是一个禁止字符数组,或者其他什么)。所有的textfields都有一个不同的DocumentFilter实例,参数设置是为了满足您的需要。这样,您将有一个干净的解决方案,而不需要修改代码。

例如:

代码语言:javascript
复制
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.border.EmptyBorder;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.DocumentFilter;
public class FilterTextField
{
    public static void main (String [] a) {
        SwingUtilities.invokeLater (new Runnable () {
            @Override public void run () {
                createAndShowGUI ();
            }
        });
    }
    private static void createAndShowGUI () {
        JFrame frame = new JFrame ("Test");
        frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
        frame.setContentPane (new MainPanel ());
        frame.pack ();
        frame.setLocationRelativeTo (null);
        frame.setVisible (true);
    }
}
class MainPanel extends JPanel
{
    public MainPanel () {
        super (new GridLayout (3, 1, 0, 20));

        JTextField t1 = new JTextField (20);
        JTextField t2 = new JTextField (20);
        JTextField t3 = new JTextField (20);

        ((AbstractDocument) t1.getDocument ()).setDocumentFilter (new MyDocumentFilter (5));
        ((AbstractDocument) t2.getDocument ()).setDocumentFilter (new MyDocumentFilter (10, '!', '?'));
        ((AbstractDocument) t3.getDocument ()).setDocumentFilter (new MyDocumentFilter (15, new char [] {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}));

        add (t1);
        add (t2);
        add (t3);

        setBorder (new EmptyBorder (20, 20, 20, 20));
    }


}
class MyDocumentFilter extends DocumentFilter
{
    private char [] forbiddenCharacters;
    private int maximumLength;

    public MyDocumentFilter (int maximumLength, char ... forbiddenCharacters) {
        this.maximumLength = maximumLength;
        this.forbiddenCharacters = forbiddenCharacters;
    }
    @Override public void replace (FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
        // Get the full text you would have after replacement
        Document document = fb.getDocument ();
        String fullText = new StringBuilder (document.getText (0, document.getLength ())).replace (offset, offset + length, text).toString ();
        // Check your requirements ...
        if (fullText.length () <= maximumLength) {
            if (forbiddenCharacters != null) {
                for (char c : forbiddenCharacters) if (fullText.indexOf (c) > -1) return;
            }
            // Replace method is called only if your requirements are met.
            super.replace (fb, offset, length, text, attrs);
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47072442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档