Java 如何从DocumentFilter获取JTextfield的类型

Java 如何从DocumentFilter获取JTextfield的类型,java,swing,jtextfield,documentfilter,Java,Swing,Jtextfield,Documentfilter,问题: 我想知道是否可以从DocumentFilter获取JTextfield类型?? 我读过java文档,搜索了很多,但没有找到任何信息 需要: 我在2个JTextfields上设置了相同的DocumentFilter。当事件发生时,在DocumentFilter的replace方法中,我想知道哪个textfield的操作导致了事件 用例: 我未来可能会增加大约15个texfields,我希望对以下所有项目进行单独检查: -输入的最大文本长度 -只需输入某些字符。所有文本字段的字符都相同 例如

问题: 我想知道是否可以从DocumentFilter获取JTextfield类型?? 我读过java文档,搜索了很多,但没有找到任何信息

需要: 我在2个JTextfields上设置了相同的DocumentFilter。当事件发生时,在DocumentFilter的replace方法中,我想知道哪个textfield的操作导致了事件

用例: 我未来可能会增加大约15个texfields,我希望对以下所有项目进行单独检查: -输入的最大文本长度 -只需输入某些字符。所有文本字段的字符都相同 例如:textfield1最多可以占用10个字符,而textfield2最多可以占用5个字符

到目前为止我所做的: 我为每个文本字段创建了单独的过滤器,这会导致大量冗余代码,增加处理的复杂性,以备将来使用


期待任何帮助-

好的,现在您的需要更清楚了,但是,您不能也不应该从DocumentFilter中检查要输入的文本字段,以决定在替换方法中执行什么操作

可能的解决方案:创建您自己的DocumentFilter类,传递您需要的最大文本长度的所有参数,可能还有一个禁止字符数组,或者其他任何东西。 您的所有文本字段都将有一个独特的DocumentFilter实例,并设置参数以满足您的需要。这样,您将获得一个干净的解决方案,而无需冗余代码

例如:

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

不,您不能访问它。DocumentFilter是模型文档的一部分,JTextField是控制器。@SergiyMedvynskyy抱歉,没有收到您的邮件:-@Aman我认为他指的是DocumentFilter类中没有一个方法可以用来获取不是事件的替换事件的源,比如getSource或getComponent。例如,您可以在文本字段中添加一个CaretListener,但您最好澄清您想要实现的目标。@Ansharja我已经在问题中写下了需求。@Aman您说您想知道是哪个文本字段导致了该事件。我在问你:为什么?您是否需要文档过滤器在两个文本字段之间以不同的方式工作?然后,您可以有两个扩展文档过滤器的类,也许还有一个超类,您可以在其中保留它们之间的共同逻辑。键入字符时是否需要执行操作?同样,您可以在字段上注册侦听器。其他原因?因为你不能得到你想要的东西,所以从过滤器中检查来源,我们需要知道你真正想要的是什么,以找到一个不同的解决方案这是一个有效的解决方案。也许更多关于代码注释的说明也会对其他人有所帮助。谢谢:-@Aman我很高兴它能帮上忙。你认为我应该把更多的评论放在哪里来澄清呢?可能有一些关于MyDocumentFilter参数的解释。另一个是字符串全文行,因为在这一行中发生了很多事情:-P@Aman我认为通过检查文档中的DocumentFilter方法和用法就可以清楚地看到这一点