javaswingfocuscaretjformattedtextfield

JFormattedTextField caret position on focus


I am utilizing a few JFormattedTextFields in my program. For some reason when the text field gains focus after a click on the text field, the caret position always jumps to the left (position 0). I would like the caret to end up at the location clicked by the user. So if I click in between two digits, the caret should end up in between those two digits.

So I implemented a FocusListener that would get the click location and set the caret position there.

FocusListener focusListener = new FocusListener(){


    public void focusGained(FocusEvent evt) {

        JFormettedTextField jftf = (JFormattedTextField) evt.getSource();

        //This is where the caret needs to be.
        int dot = jftf.getCaret().getDot(); 

        SwingUtilities.invokeLater( new Runnable() {

        public void run() {
'the textField that has focus'.setCaretPosition('Some how get the evt or dot');              
              }
           });
        }

    public void focusLost (FocusEvent evt) {}

    });

I've tried a number of things to get his to work. I've tried using the final keyword, which works, but only for a single textfield.

I've used set/get methods inside the focus listener to assign the current object, but am not sure about how to make this "safe" (e.g. do they need to be synchronized?).

Maybe there is something I am missing?


Solution

  • You need to use a MouseListener:

    MouseListener ml = new MouseAdapter()
    {
        public void mousePressed(final MouseEvent e)
        {
            SwingUtilities.invokeLater(new Runnable()
            {
                public void run()
                {
                    JTextField tf = (JTextField)e.getSource();
                    int offset = tf.viewToModel(e.getPoint());
                    tf.setCaretPosition(offset);
                }
            });
        }
    };
    
    formattedTextField.addMouseListener(ml);