Java JTextField-更改focusLost事件上的插入符号位置

Java JTextField-更改focusLost事件上的插入符号位置,java,swing,jtextfield,focuslistener,Java,Swing,Jtextfield,Focuslistener,我在一个JFrame中有5个JTextFields,我在一个循环中向所有这些字段添加了一个FocusListener 在focusgound()事件中,我使用setCaretPosition()方法将插入符号移动到JTextField的末尾 在focusLost()事件中,我试图将插入符号移动到JTextField的开头,以便可以从开头读取相应字段中的文本 我不知道在focusLost事件中该做什么。我尝试将caretPosition设置为零,但没有成功 有人能帮我吗 编辑: 以下是SSCCE:

我在一个
JFrame
中有5个
JTextField
s,我在一个循环中向所有这些字段添加了一个
FocusListener

focusgound()
事件中,我使用
setCaretPosition()
方法将插入符号移动到
JTextField
的末尾

focusLost()
事件中,我试图将插入符号移动到
JTextField
的开头,以便可以从开头读取相应字段中的文本

我不知道在focusLost事件中该做什么。我尝试将caretPosition设置为零,但没有成功

有人能帮我吗

编辑:

以下是SSCCE:

public void focusGained(FocusEvent etffl)
{
 for(int i = 0; i < 5; i++)
 {
  field[i].setCaretPosition(field[i].getText().length());
 }
}
public void focusLost(FocusEvent etffl)
{
 for(int i = 0; i < 5; i++)
 {
  field[i].setCaretPosition(0);
 }
}
public void focusgovered(FocusEvent etffl)
{
对于(int i=0;i<5;i++)
{
字段[i].setCaretPosition(字段[i].getText().length());
}
}
公共无效焦点丢失(焦点事件etffl)
{
对于(int i=0;i<5;i++)
{
字段[i].setCaretPosition(0);
}
}
编辑#2:

这是MCTRE:

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

    class SampleGUI

    {
     public static JTextField[] field = new JTextField[5];
     public static void main(String[] args)

     {
      JFrame frame = new JFrame("Frame");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

      final JPanel panel = new JPanel();

      for(int i=0; i<5; i++)
      {
       field[i] = new JTextField(20);
       field[i].addFocusListener(new TextFieldFocusListener());
       panel.add(field[i]);
      }

      frame.add(panel);
      frame.setSize(300,300);
      frame.setVisible(true);

     }

    }

    //TextFieldFocusListener
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

class TextFieldFocusListener implements FocusListener

{

 public void focusGained(FocusEvent etffl)
 {
  for(int i = 0; i < 5; i++)
  {
   SampleGUI.field[i].setCaretPosition(SampleGUI.field[i].getText().length());
  }
 }
 public void focusLost(FocusEvent etffl)
 {
  for(int i = 0; i < 5; i++)
  {
   SampleGUI.field[i].setCaretPosition(0);
  }
 }
}
import java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
导入javax.swing.event.*;
类示例GUI
{
公共静态JTextField[]字段=新JTextField[5];
公共静态void main(字符串[]args)
{
JFrame框架=新的JFrame(“框架”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
最终JPanel面板=新JPanel();
对于(int i=0;i
我尝试将caretPosition设置为零,但没有成功

尝试将代码包装在一个
SwingUtilities.invokeLater()

如果你需要更多的帮助,那就发一篇文章来说明这个问题

您的代码过于复杂。您只需重置生成事件的文本字段(不是所有文本字段)的插入符号:


这样就可以从一开始就读取相应字段中的文本。你的意思是什么?如果调用
getText()
方法,就会得到整个文本字段的内容,插入符号的位置对该方法调用没有影响。@Laf我想OP的意思是“可以直观地读取”,也就是说,如果文本比JTextField长,文本的开头可能不可见。也许OP可以澄清。@splungebob你完全正确。这正是我的意思。编辑(修复旧注释):为了更快地获得更好的帮助,请发布一篇演示问题的文章。很多时候,仅仅创建一个例子就可以揭示问题。
class TextFieldFocusListener implements FocusListener
{
    public void focusGained(FocusEvent etffl)
    {
        JTextField textField = (JTextField)etffl.getComponent();
        textField.setCaretPosition(textField.getDocument().getLength());
    }

    public void focusLost(FocusEvent etffl)
    {
        JTextField textField = (JTextField)etffl.getComponent();
        textField.setCaretPosition(0);
    }
}