【发布时间】: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