java swing: Focus lost on enter key event

12,218

Here second JTextField is acting the way you want it to. Try your hands on this code example :

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 JButton button;
    private FocusListener tfieldListener = new FocusListener()
    {
        @Override
        public void focusGained(FocusEvent fe)
        {
        }

        @Override
        public void focusLost(FocusEvent fe)
        {
            System.out.println("I am LOST");
            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);
        tfield2.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent ae)
            {
                button.requestFocusInWindow();
            }
        });

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

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

        label = new JLabel("SUM IS");

        button = new JButton("USELESS");

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

        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();
            }
        });
    }
}
Share:
12,218
user613114
Author by

user613114

Updated on June 04, 2022

Comments

  • user613114
    user613114 almost 2 years

    I have a button in my dialog. After pressing enter key in that dilog, actions assigned to that button is getting called one by one.

    public void buttonAction1() { }
    ....
    public void buttonAction2() { }
    

    In my dialog I also have one text field on which focus lost event is listened. Whenever initially focus is inside that textfield, I click tab or using mouse I click on button, focus lost event is called and opens a popup. This pop-up helps to set the value inside text field. This value will be used by action called on button press.

    public void focusLostAction() { }
    

    Now the issue is that, when focus is inside text field and I press enter key, focus lost event is not getting called. So Pop-up is not getting opened and and proper values are not set inside that text field. but due to enter key event, action on that perticular button is getting called and this action is unable to find proper value inside text field.

    Inside the action method, which are called on enter key event, I have tried to set focus on button manually using:

    public void buttonAction1() {
        button.requestFocusInWindow();
    }
    
    public void buttonAction2() {
        // do the remaining task
    } 
    

    I also tried using, button.requestFocus;

    I was expecting that setting focus manually on that button will call loose focus from text field and focus lost event may get called (as this is implemented in separate swing worker thread). But it is not working. Please let me know, If you have faced this issue earlier and the solution for the same. Thanks.

  • user613114
    user613114 almost 12 years
    Dear nlcE, This sample code works fine. I need to check if I can modify my code the way you have mentioned. I have updated my query with what I had tried earlier. Is it incorrect doing it that way?
  • nIcE cOw
    nIcE cOw almost 12 years
    What you had specified, is just the method, though exactly where you using it is the real thing to look at, that's why a complete SSCCE, will be of much help to tell more :-)
  • user613114
    user613114 almost 12 years
    Dear nlcE, I understand your concern. Actually the problem is that, The text field is a part of Subview. and button is in parent view. I am newbie to swing and am working on this big piece of code, which is developed using classes extended from swing. That was the reson I could not give SSCCE. With your example, I just modified code to add button.grabFocus(). And it is working for me now. I apologize for not providing SSCCE for this scenario. I will mark you solution as answer, as it gave idea on what to exactly. Thank you ver much.
  • nIcE cOw
    nIcE cOw almost 12 years
    You are MOST WELCOME and KEEP SMILING :-) Happy to know that my answer did helped you somewhere :-)