2017-11-02 4 views
0

문제점 : DocumentFilter에서 JTextfield 형식을 가져올 수 있는지 여부를 알고 싶습니다. ??
java 문서를 읽고 많이 검색했지만 정보를 찾지 못했습니다.DocumentFilter에서 JTextfield 형식을 가져 오는 방법

필요 : 2 개의 JTextfield에 대해 동일한 DocumentFilter를 설정했습니다. 이벤트가 발생하면 DocumentFilter의 "replace"메서드에서 어떤 텍스트 필드에서 이벤트가 발생했는지에 대한 작업을 알고 싶습니다.

사용 케이스 : 나는 약 15 texfields 근처에있다 (미래에 증가 할 수있다)와 나는 모두에 별도의 확인하려면 :
- 입력
최대 텍스트 길이 - 특정 문자를 입력해야합니다 (이 뜻을
예 : textfield1은 최대 10자를 사용할 수 있지만 textfield2는 최대 5자를 사용할 수 있습니다.

내가 한 것 :
나는 모든 텍스트 필드에 대해 별도의 필터를 만들어 많은 중복 코드가 발생하고 나중에 사용하기 위해 처리하기 위해 복잡성이 증가합니다.

도움을 기대하고 있습니다. :-)

+1

아니, 당신이 그것을 액세스 할 수 없습니다. DocumentFilter는 모델 ('Document')의 일부이며, JTextField는 컨트롤러입니다. –

+0

@SergiyMedvynskyy 죄송합니다. :-( – Aman

+0

@Aman 나는 'DocumentFilter' 클래스에 "이벤트 대체"소스를 얻기 위해 사용할 수있는 메소드가 없다는 사실을 언급하고 있다고 생각합니다. getSource와()'또는'getComponent은()'. 당신은 당신의 텍스트 필드에 예를 들어'CaretListener'을 추가 할 수 있지만, 당신은 더 나은 당신이 달성하고 싶은 명확히 것이다. 나는 이미 문제의 필요성을 작성한 – Ansharja

답변

1

이제는 사용자의 필요성이 더 큽니다. 메소드에서 수행 할 작업을 결정하기 위해 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); 
     } 
    } 
} 
+0

코드 해설을 통해 좀 더 명확히 해보면 다른 사람들에게도 도움이 될 것입니다. 감사합니다 :-) – Aman

+0

@Aman 도움이 되었기 때문에 기쁩니다. 설명을 위해 더 많은 설명을 넣어야 할 곳은 어디입니까? – Ansharja

+0

MyDocumentFilter 매개 변수에 대한 설명이있을 수 있습니다. 그 외에도 많은 것이 있기 때문에 String fullText 줄이 있습니다. 1 행 :-P – Aman

관련 문제