이제는 사용자의 필요성이 더 큽니다. 메소드에서 수행 할 작업을 결정하기 위해 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는 모델 ('Document')의 일부이며, JTextField는 컨트롤러입니다. –
@SergiyMedvynskyy 죄송합니다. :-( – Aman
@Aman 나는 'DocumentFilter' 클래스에 "이벤트 대체"소스를 얻기 위해 사용할 수있는 메소드가 없다는 사실을 언급하고 있다고 생각합니다. getSource와()'또는'getComponent은()'. 당신은 당신의 텍스트 필드에 예를 들어'CaretListener'을 추가 할 수 있지만, 당신은 더 나은 당신이 달성하고 싶은 명확히 것이다. 나는 이미 문제의 필요성을 작성한 – Ansharja