簡體   English   中英

如何從DocumentFilter獲取JTextfield的類型

[英]How to get type of JTextfield from DocumentFilter

問題:我想知道是否可以從DocumentFilter中獲取JTextfield類型?
我已閱讀Java文檔並進行了大量搜索,但未找到任何信息。

需要:我在2個JTextfields上設置了相同的DocumentFilter。 事件發生時,在DocumentFilter的“替換”方法中,我想知道導致該事件發生在哪個文本字段上的操作。

用例:我大約有15個texfield(將來可能會增加),並且我想對所有以下內容進行單獨檢查:
-輸入的最大文本長度
-只需輸入某些字符(所有文本字段都相同)
例如:textfield1最多可以容納10個字符,而textfield2最多可以容納5個字符。

到目前為止,我所做的是:
我為每個文本字段創建了單獨的過濾器,這導致大量冗余代碼並增加了處理的復雜性,以備將來使用。

期待任何幫助。 :-)

好的,現在您的需求更加明確了,但是,再次,您不能(也不應)從DocumentFilter檢查要鍵入哪個文本字段來決定在replace ()方法中要做什么。

可能的解決方案:創建您自己的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);
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM