【问题标题】:JTextField - changing caret position on focusLost eventJTextField - 在 focusLost 事件上更改插入符号位置
【发布时间】:2014-03-14 08:14:05
【问题描述】:

我在 JFrame 中有 5 个 JTextFields,并且我在循环中向所有这些 FocusListener 添加了一个 FocusListener

focusGained() 事件中,我使用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);
 }
}

编辑#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);
  }
 }
}

【问题讨论】:

  • 这样可以从头开始阅读相应字段内的文本。 你是什么意思?如果你调用getText()方法,你会得到整个文本字段的内容,插入符号的位置不会影响这个方法调用。
  • @Laf 我认为 OP 的意思是“可以在视觉上阅读”,即如果文本比 JTextField 长,则文本的开头可能不可见。也许OP可以澄清。
  • @splunebob 你说得对。这正是我的意思。
  • 编辑(修复旧评论):为了尽快获得更好的帮助,请发布 Minimal, Complete, Tested and Readable example 来证明问题。很多时候,仅仅创建示例就会暴露问题。

标签: java swing jtextfield focuslistener


【解决方案1】:

我尝试将 caretPosition 设置为零,但没有成功。

尝试将代码包装在 SwingUtilities.invokeLater() 中。

如果您需要更多帮助,请发布 MCTRE 来说明问题。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    • 2015-09-07
    • 2022-01-22
    相关资源
    最近更新 更多