2015-01-29 7 views
2

버튼을 사용할 수없는 곳으로 만들었습니다. 활성화 할 수있는 유일한 방법은 필드에 텍스트를 입력하는 것입니다.텍스트 백 스페이스 확인 문제

여기 내 코드입니다 : 내가 백 스페이스 모든 텍스트를 지울 때마다

import java.awt.FlowLayout; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JTextField; 
import javax.swing.text.AbstractDocument; 
import javax.swing.text.AttributeSet; 
import javax.swing.text.BadLocationException; 
import javax.swing.text.DocumentFilter; 

class checkText extends DocumentFilter { 
public void replace(DocumentFilter.FilterBypass fb, int offset, int length,   String text, 
    AttributeSet attrs) throws BadLocationException { 
    super.replace(fb, offset, length, text, attrs); 
    main.enableButton(); 
    } 
    } 

public class main extends JFrame { 
static JFrame inputFrame = new JFrame(); 
static JTextField myTextfield = new JTextField(10); 
static JButton myButton = new JButton("Test"); 

public main() { 
inputGUI(); 
} 

private static void inputGUI() { 
inputFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
inputFrame.setTitle("The INPUT"); 
inputFrame.setLayout(new FlowLayout()); 
inputFrame.setSize(640, 480); 
inputFrame.setVisible(true); 
inputFrame.setLocationRelativeTo(null); 

inputFrame.add(myButton); 

DocumentFilter filter = new checkText(); 
((AbstractDocument) myTextfield.getDocument()).setDocumentFilter(filter); 
inputFrame.add(myTextfield); 
myButton.setEnabled(false); 
} 

public static void enableButton() { 
myButton.setEnabled(true); 
} 

public static void main(String args[]) { new main(); } 
} 

. 버튼은 계속 활성화되어 있습니다. 필드 안에 텍스트가 없을 때 다시 비활성화하려면 어떻게합니까?

+0

당신은 입력의 길이를받을 수 있습니까? 길이가 0 인 경우 0보다 작 으면 – PeerNet

+1

@PeerNet : 가능하지만 복잡합니다. 필터의 메서드에서 문서를 확인하는 것만으로는 충분하지 않습니다. 또한 수퍼 메소드가 문서에 대해 수행 할 작업을 확인해야합니다. DocumentListener를 사용하면 ** 많이 ** 간단 해집니다. –

+0

Kerperlo : 장래에 코드에 들여 쓰기를 사용해보십시오. 플랫 코드는 읽기 및 구문 분석이 매우 어렵습니다. –

답변

3

DocumentFilter는 문서를 검사하지 않으며 문서의 필터 메소드가 문서에 미칠 영향을받지 않으므로 문서 필터가 작동하지 않는다는 사실에 놀라지 않아야합니다. 세 가지 DocumentFilter 메서드 중 하나를 재정의합니다. 또한 주 수업에는 enableButton()이 있지만 외부 수업에서 버튼을 사용 중지 할 방법이 없습니다. ....

나는 후에 문서 을 확인하기 때문에 이전에는 DocumentFilter를 사용하지 않았으므로 DocumentFilter를 사용하면 혼란 스러울뿐입니다. 발행물. 문서의 텍스트 길이를 확인하면 필요한 모든 것입니다. Document를 취득하려면, 오버라이드 (override)되는 모든 Methods에 건네주는 DocumentEvent object로 getDocument()를 호출합니다. 그런 다음 getLength()으로 전화하십시오. 0보다 큰 경우 버튼을 사용하도록 설정하고 사용하지 않으려면 버튼을 사용 설정합니다. 예를 들어,

,

import javax.swing.*; 
import javax.swing.event.DocumentEvent; 
import javax.swing.event.DocumentListener; 
import javax.swing.text.Document; 


public class Main2 extends JPanel { 
    private JButton testButton = new JButton("Test"); 
    private JTextField textField = new JTextField(11); 

    public Main2() { 
     add(testButton); 
     add(textField); 

     testButton.setEnabled(false); 
     textField.getDocument().addDocumentListener(new DocumentListener() { 

     @Override 
     public void removeUpdate(DocumentEvent e) { 
      checkDoc(e); 
     } 

     @Override 
     public void insertUpdate(DocumentEvent e) { 
      checkDoc(e); 
     } 

     @Override 
     public void changedUpdate(DocumentEvent e) { 
      checkDoc(e); 
     } 

     private void checkDoc(DocumentEvent e) { 
      Document doc = e.getDocument(); 
      testButton.setEnabled(doc.getLength() > 0); 
     } 
     }); 
    } 

    private static void createAndShowGui() { 
     Main2 mainPanel = new Main2(); 

     JFrame frame = new JFrame("Main2"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 
+0

감사합니다. 더 많은 대표자가 있다면 나는 당신에게 필요한 담당자를 줄 것입니다. – kerperlo

+0

@kerperlo : 천만에. –