2013-05-28 4 views
0

사용자가 빈 문자열을 입력하지 않도록합니다. 현재 사용자는 숫자 만 입력 할 수 있습니다. 그러나 아무 것도 텍스트 필드를 비워 두지 않습니다. 비어있을 때 프로그램을 시작하기 위해 버튼을 누르지 못하도록 제한하고 싶습니다.내 JTextField를 방해하는 DocumentListener

지금 당장 내 텍스트 필드는 공백으로 남겨두고 처음에는 버튼이 회색으로 표시됩니다. 그러나 입력 할 때 버튼이 회색으로 유지됩니다. 이 코드는 모두 생성자에 있습니다.

private JTextField plays = new JTextField(7); 
DocumentFilter filter = new NumberFilter(); 
((AbstractDocument)plays.getDocument()).setDocumentFilter(filter); 
plays.setToolTipText("Please input an integer."); 

if(plays.getText().equals("")) 
     play.setEnabled(false); 

private class NumberFilter extends DocumentFilter 
    { 
     public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String text, AttributeSet attrs) 
     throws BadLocationException 
     { 
      fb.insertString(offset, text.replaceAll("[^0-9]", ""), attrs); 
     } 
    } 

답변

3

지금 필터 코드는 정수 숫자 만 문서에 입력되도록 편집합니다.

삽입 후 추가 데이터를 입력했는지 확인한 다음 필요에 따라 텍스트 필드를 활성화/비활성화해야합니다.

import java.awt.*; 
import java.awt.event.*; 
import java.util.List; 
import java.util.ArrayList; 
import javax.swing.*; 
import javax.swing.event.*; 

public class DataEntered implements DocumentListener 
{ 
    private JButton button; 
    private List<JTextField> textFields = new ArrayList<JTextField>(); 

    public DataEntered(JButton button) 
    { 
     this.button = button; 
    } 

    public void addTextField(JTextField textField) 
    { 
     textFields.add(textField); 
     textField.getDocument().addDocumentListener(this); 
    } 

    public boolean isDataEntered() 
    { 
     for (JTextField textField : textFields) 
     { 
      if (textField.getText().trim().length() == 0) 
       return false; 
     } 

     return true; 
    } 

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

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

    @Override 
    public void changedUpdate(DocumentEvent e) {} 

    private void checkData() 
    { 
     button.setEnabled(isDataEntered()); 
    } 

    private static void createAndShowUI() 
    { 
     JButton submit = new JButton("Submit"); 
     submit.setEnabled(false); 

     JTextField textField1 = new JTextField(10); 
     JTextField textField2 = new JTextField(10); 

     DataEntered de = new DataEntered(submit); 
     de.addTextField(textField1); 
     de.addTextField(textField2); 

     JFrame frame = new JFrame("SSCCE"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(textField1, BorderLayout.WEST); 
     frame.add(textField2, BorderLayout.EAST); 
     frame.add(submit, BorderLayout.SOUTH); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowUI(); 
      } 
     }); 
    } 
} 

개념은 DocumentFilter를위한 같을 것이다 : 여기서

이렇게하는 DocumentListener를 사용하는 예이다. 텍스트를 삽입하거나 제거 할 때 검사를 수행해야합니다.

관련 문제