我有一个带有JTextField和JPasswordField的简单登录框架。当我的框架加载JTextField的文本时,“打字你的登录”。我希望在JTextField获得焦点时擦除该文本。它是我框架中的第一个元素,所以当我加载框架时它已经具有焦点,但是我希望每当我点击它或开始输入它时它就会清除。我尝试了一个MouseListener,它工作正常,但现在我想从我开始输入的那一刻起清除JTextField。这是涉及我的问题的代码:
import java.awt.FlowLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
public class TextFields extends JFrame {
private static final long serialVersionUID = 1L;
private JTextField login;
private JPasswordField password;
public TextFields() {
super("Event handling");
setLayout(new FlowLayout());
login = new JTextField("Type your login", 20);
password = new JPasswordField(20);
add(login);
add(password);
LoginHandler handler = new LoginHandler();
login.addMouseListener(handler);
}
private class LoginHandler implements ActionListener, MouseListener {
public void mouseClicked(MouseEvent e) {
login.setText("");
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void focusLost(FocusEvent arg0) {
// TODO Auto-generated method stub
}
}
public static void main(String[] args) {
TextFields test = new TextFields();
test.setDefaultCloseOperation(EXIT_ON_CLOSE);
test.setSize(250, 100);
test.setVisible(true);
}
}
答案 0 :(得分:5)
我不知道规范的答案,但我通过在focusGained方法中调用selectAll()
来使用FocusListener解决了这个问题。不要使用MouseListener,因为如果用户选中该字段,这将失败。
如,
private class MyFocusListener extends FocusAdapter {
@Override
public void focusGained(FocusEvent fEvt) {
JTextComponent component = (JTextComponent) fEvt.getSource();
component.selectAll();
}
}
和
login.addFocusListener(new MyFocusListener());
答案 1 :(得分:5)
从概念上讲,您真正想要的是为文本字段设置“占位符”或“提示符”,而不是更改字段中的实际文本。这样的抽象也会给你一些功能,比如能够将提示样式设置为浅灰色。
普通JTextField
不支持此功能,但您可以编写自己的子类,也可以使用库。 This answer解释了如何使用SwingX库来实现这一目标。基本上,只需import org.jdesktop.swingx.prompt.PromptSupport;
并添加以下行:
PromptSupport.setPrompt("Type your login", login);