LostFocusEvent не происходит, когда я удаляю текст внутри Jtextfield?

Привет, я реализовал простой метод focusListener и зарегистрировал в нем два jTextFields. Что делает этот метод, так это добавляет в них числа и отображает их в JLabel. Если я введу в них «2», он будет правильно обновлен, чтобы дать мне 4. Однако, если я просто удалю 2 после этого, событие focusLost не будет запущено, даже если я щелкну в другом месте. Если я введу 0 в JTextField, то событие focusLost произойдет нормально. Почему это так? Спасибо!


person Laughy    schedule 05.07.2012    source источник
comment
вам нужно добавить jTextField.getDocument().addDocumentListener(new DocumentListener(){...}).   -  person Liu guanghua    schedule 05.07.2012
comment
@Liuguanghua привет, я пробовал именно это. Однако он запускает событие, даже когда я ввожу в него текст. Как я могу сделать так, чтобы событие запускалось после того, как человек закончил вводить текст в поле jtextfield? (независимо от того, пустое это поле или нет)   -  person Laughy    schedule 05.07.2012


Ответы (2)


Без SSCCE трудно сказать, какую логику вы используете в своем случае. Поскольку в следующем примере он работает так, как вы ожидаете:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;

public class TextFieldExample
{
    private JTextField tfield1;
    private JTextField tfield2;
    private JLabel label;
    private FocusListener tfieldListener = new FocusListener()
    {
        @Override
        public void focusGained(FocusEvent fe)
        {
        }

        @Override
        public void focusLost(FocusEvent fe)
        {
            String num1 = tfield1.getText().trim();
            String num2 = tfield2.getText().trim();
            if (num1 == null || num1.equals(""))
                num1 = "0";
            if (num2 == null || num2.equals(""))
                num2 = "0";         
            label.setText(Integer.toString(Integer.parseInt(num1) + Integer.parseInt(num2)));
        }
    };

    private void displayGUI()
    {
        JFrame frame = new JFrame("Text Field Focus Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel contentPane = new JPanel();
        contentPane.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5));

        tfield1 = new JTextField(10);
        tfield2 = new JTextField(10);

        tfield1.addFocusListener(tfieldListener);
        tfield2.addFocusListener(tfieldListener);

        ((AbstractDocument)tfield1.getDocument()).setDocumentFilter(new MyDocumentFilter());
        ((AbstractDocument)tfield2.getDocument()).setDocumentFilter(new MyDocumentFilter());

        label = new JLabel("SUM IS");

        contentPane.add(tfield1);
        contentPane.add(tfield2);
        contentPane.add(label);

        frame.setContentPane(contentPane);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    class MyDocumentFilter extends DocumentFilter
    {
        @Override
        public void insertString(FilterBypass fb, int offset
                                                , String text
                                                , AttributeSet aset)
        {
            try
            {
                super.insertString(fb, offset, text.replaceAll("\\D++", ""), aset);
            }
            catch(BadLocationException ble)
            {
                ble.printStackTrace();
            }
        }

        @Override
        public void replace(FilterBypass fb, int offset, int len
                                           , String text
                                           , AttributeSet aset)
        {
            try
            {
                super.replace(fb, offset, len, text.replaceAll("\\D++", ""), aset);
            }
            catch(BadLocationException ble)
            {
                ble.printStackTrace();
            }
        }       
    }

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new TextFieldExample().displayGUI();
            }
        });
    }
}
person nIcE cOw    schedule 05.07.2012
comment
@Laughy: Если вы оставите JTextField пустым, вы обязательно получите NumberFormatException, поскольку вы не сможете преобразовать "" в целочисленное значение. - person nIcE cOw; 05.07.2012

Один из подходов заключается в использовании свойства value в JFormattedTextField, как показано в этом примере и описано здесь.

person trashgod    schedule 05.07.2012