Java JTextField/JPasswordField的提示

Java JTextField/JPasswordField的提示,java,swing,listener,jtextfield,hint,Java,Swing,Listener,Jtextfield,Hint,我构建了一个扩展JTextField类的类和一个自己的提示函数 package functions; import java.awt.Color; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import javax.swing.JTextField; public class TextField extends JTextField { private String hint; privat

我构建了一个扩展JTextField类的类和一个自己的提示函数

package functions;

import java.awt.Color;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import javax.swing.JTextField;

public class TextField extends JTextField {

private String hint;
private Color cForeground;
private Color cHint;

public void setHint(String s) {
    hint = s;
    cForeground = getForeground();

    setText(hint);
    cHint = new Color(cForeground.getRed(), cForeground.getGreen(),
            cForeground.getBlue(), cForeground.getAlpha() / 2);

    addFocusListener(new FocusListener() {

        @Override
        public void focusLost(FocusEvent arg0) {
            if (getText().equals("")) {
                setForeground(cHint);
                setText(hint);
            }
        }

        @Override
        public void focusGained(FocusEvent arg0) {
            if (getText().equals(hint)) {
                setText("");
                setForeground(cForeground);
            }
        }
    });
}
}
1) 目前,我的提示只有在没有集中注意力时才会出现。但是我希望我的提示在它是空的时候是可见的,也就是在它被聚焦的时候。我玩了
ActionListener
而不是
FocusListener
,但我没有得到它

2) 我希望JPasswordField有同样的功能,但我不想在两个不同的类中编写相同的方法。当一个扩展JTextField,另一个扩展JPasswordField时,有没有办法从两个类中指向同一个方法

3) 我决定是否通过调用
getText()
来显示提示,但这在处理密码时并不好(我不想因为记录密码而受到责备…)。有没有其他方法可以防止这种情况发生


顺便说一句:我知道关于
TextPrompt
,但我想建立一个自己的简单解决方案。

据我所知,您需要一个HTML中称为占位符的东西。然后像这样重写
paintComponent
方法:

public class STextField extends JTextField{
    public static final Color placeholderColor = new Color(cForeground.getRed(), cForeground.getGreen(), cForeground.getBlue(), cForeground.getAlpha() / 2);
    public STextField(String placeholder){
        this.placeholder = placeholder;
    }
    protected void paintComponent(final Graphics pG) {
        super.paintComponent(pG);
        if(placeholder.length() == 0 || getText().length() > 0)
            return;
        final Graphics2D g = (Graphics2D) pG;
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g.setColor(placeholderColor);
        int offset = 4; // This value depends on height of text field. Probably can be calculated from font size.
        g.drawString(placeholder, getInsets().left, pG.getFontMetrics().getMaxAscent() + offset);
    }
    private String placeholder;
}

我知道TextPrompt,但我想构建一个自己的简单解决方案
——然后从一些有用的东西开始,并根据您的需求定制它。也许创建一个简单的解决方案并不容易<代码>但我希望我的提示在它为空时可见,也在它聚焦时可见。TextPrompt会这样做
我希望JPasswordField也有同样的功能,但我不想在两个不同的类中编写相同的方法
文本提示再次向您展示了如何做到这一点,因此请从一个工作示例中学习。我的评论是假设您谈论的是这个类。