当我开始输入时,JTextField文本必须清除

时间:2014-11-08 01:01:01

标签: java swing jtextfield

我有一个带有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);

    }

}

2 个答案:

答案 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);