使用 DocumentListener 实现检查 JTextField

Posted

技术标签:

【中文标题】使用 DocumentListener 实现检查 JTextField【英文标题】:Check JTextField using DocumentListener implementation 【发布时间】:2017-07-16 21:25:35 【问题描述】:

我正在尝试使用 DocumentListener 实现创建一个单独的类来检查天气 TextFields 是否为空,以便可以将其添加到多个 JTextFeilds。我创建了 DocumentListener 实现的类,并添加到了 TextField。如果有人帮我解决这个问题,我应该很高兴。

提前致谢。

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

class Doc extends JFrame
public JButton bttAdd;
public JButton bttRemove;
public JTextField txtEmplyee;
public JTextField txtName;
private JPanel paneCenter;

Doc()
    setSize(500, 200);
    setTitle("Add Emplyee");

    paneCenter=new JPanel();
    bttAdd=new JButton("Add");
    bttRemove=new JButton("Remove");

    txtEmplyee = new JTextField(20);
    txtEmplyee.getDocument().addDocumentListener(new DocListner());

    txtName = new JTextField(20);


    bttAdd.setEnabled(false);

    paneCenter.add(txtEmplyee);
    paneCenter.add(txtName);
    paneCenter.add(bttAdd);
    paneCenter.add(bttRemove);

    add("Center", paneCenter);

  


   class DocListner implements DocumentListener

       @Override
       public void insertUpdate(DocumentEvent e) 
       statusChecker();
       

       @Override
       public void removeUpdate(DocumentEvent e) 
       statusChecker();
       

       @Override
       public void changedUpdate(DocumentEvent e) 
       statusChecker();
       
       public void statusChecker()
       Doc d2=new Doc();
       if(d2.txtEmplyee.getText().equals(""))
          d2.bttAdd.setEnabled(false);
       else 
          d2.bttAdd.setEnabled(true);
     
  

【问题讨论】:

我会将DocumentListener 链接回另一个观察者,该观察者知道文本字段,然后DocumentListener 可以生成观察者可以对其做出反应的“空”和“非空”事件 看来您使用的监听器类别不好。试试看:txtEmplyee.getDocument().addDocumentListener(<listener goes here>);。您必须重写一些接口方法。在这里你可以找到一个例子:stack answer 【参考方案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();
            
        );
    

有以下语句的几个cmets:

add("Center", paneCenter);
    不要使用魔法值。人们不知道字符串是什么意思。 API 将定义可用于布局约束的变量。 这是一个旧的 API。阅读 API 描述,你会发现你应该使用带有 add(component, constraint) 签名的方法。

所以你的代码应该是这样的:

add(paneCenter, BorderLayout.CENTER);

【讨论】:

以上是关于使用 DocumentListener 实现检查 JTextField的主要内容,如果未能解决你的问题,请参考以下文章

JTextArea DocumentListener 问题

使用 Java DocumentListener 的更聪明的方法

如何在 Netbeans 中使用 DocumentListener 和 jTextField?

从 DocumentListener 获取更改的文本

DocumentListener 无法正常工作

JTextField 和 JSlider 之间的交互 ​​- DocumentListener 感到困惑