Използване на DocumentListener за проверка дали JTextField е празен

Опитвам се да накарам DocListener да провери дали JTextField е празен и ако е празен, за да скрия бутон, id текстовото поле не е празно, бутонът ще се появи тук е кодът, който имам за DocListener. Вече добавих DocListener към текстовото поле tfName. Когато кодът се изпълнява, бутонът все още се вижда??? Грешно ли пиша Listener или грешно го добавям към текстовото поле??

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

person PhilVarg    schedule 15.04.2015    source източник


Отговори (3)


Не трябва ли да използвате

btnSumbit.setVisible(tfName.getText().trim().length() == 0 ? false : true);
person Shar1er80    schedule 15.04.2015
comment
Благодаря и на двама ви, накарах го, това беше много полезно. :) - person PhilVarg; 15.04.2015

Вашият код изглежда е наред. Въпреки това, в повечето изпълнения на вид и усещане, 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);
    }
}

Това ще бъде особено полезно, ако трябва да направите куп допълнителни стъпки като пребоядисване и повторно оформление на родителя на бутона (ако това не се направи автоматично, когато го премахнете).

person Mad Physicist    schedule 15.04.2015

За код за многократна употреба и по-общо решение, което ще ви позволи да картографирате 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();
            }
        });
    }
}
person camickr    schedule 15.04.2015