简体   繁体   中英

java swing: Focus lost on enter key event

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.

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

gain and lost focus from frame in java Swing Application

public class MainFrame extends Frame {
Frame awe;
public MainFrame(Database database) {
    awe = this;
    this.addWindowFocusListener(new WindowFocusListener() {
        @Override
        public void windowGainedFocus(WindowEvent we) {
            System.out.println("Gain Focus");
        }

        @Override
        public void windowLostFocus(WindowEvent we) {
            System.out.println("Lost Focus");
        }
    });

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM