2015-04-15 62 views
1

我想让DocListener检查JTextField是否为空,如果它是空的以隐藏按钮,则id文本字段不为空按钮将出现 此处是我对DocListener的合作。我已经将DocListener添加到文本字段tfName。当代码运行时,按钮仍然可见?我是在写错听者还是将它添加到文本框中?使用DocumentListener检查JTextField是否为空

MyDocumentListener d1 = new MyDocumentListener(); 
tfName.getDocument().addDocumentListener(d1); 


private class MyDocumentListener implements DocumentListener 
{ 
    @Override 
    public void changedUpdate(DocumentEvent e) { 
     // TODO Auto-generated method stub 
    } 
    @Override 
    public void insertUpdate(DocumentEvent e) 
     { //is used when the user types anything into the textfield 
      if(tfName.getText().trim().length() == 0) 
       btnSubmit.setEnabled(false); 
      else 
       btnSubmit.setEnabled(true); 
     } 
    @Override 
    public void removeUpdate(DocumentEvent e) 
    { //is used when the user uses backspace in the textfield 
     if(tfName.getText().trim().length() == 0) 

      btnSubmit.setEnabled(false); 
     else 
      btnSubmit.setEnabled(true); 
    } 
} 

回答

2

你不是应该使用

btnSumbit.setVisible(tfName.getText().trim().length() == 0 ? false : true); 
+0

谢谢你们俩我得到它的工作,这是很很有帮助。 :) – PhilVarg

0

您的代码似乎是罚款。但是,在大多数外观实现中,setVisible(false)将隐藏一个按钮,而setEnabled(false)会使其灰显并使其不可点击。

另外,我建议增加一个单一的方法去做检测,可以在文档侦听器,并从所有三个接口中的方法调用它:

private class MyDocumentListener implements DocumentListener 
{ 
    @Override public void changedUpdate(DocumentEvent e) { checkIfEmpty(); } 
    @Override public void insertUpdate(DocumentEvent e) { checkIfEmpty(); } 
    @Override public void removeUpdate(DocumentEvent e) { checkIfEmpty(); } 

    private void checkIfEmpty() 
    { //is used when the user uses backspace in the textfield 
     if(tfName.getText().trim().length() == 0) 
      btnSubmit.setVisible(false); 
     else 
      btnSubmit.setVisible(true); 
    } 
} 

,如果你需要做一大堆这将是非常有用额外的步骤,如重新绘制和重新布置按钮的父母(如果这不是在您移除它时自动完成)。

0

对于可重用的代码和一个更通用的解决方案,让您为1(或更多)文本框映射到一个按钮,你可以使用:

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(); 
      } 
     }); 
    } 
}