提示JTextField / JPasswordField

时间:2014-12-30 15:28:28

标签: 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;
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做同样的事情,但我不想在2个不同的类中编写相同的方法。有没有一种方法可以从两个类中指向同一个方法,而一个扩展JTextField而另一个扩展JPasswordField?

3)我决定是否通过调用getText()来显示提示,但是在处理密码时这并不好(我不想因为记录它们而受到指责......)。还有另一种方法可以阻止这种情况吗?

Btw:我知道TextPrompt,但我想建立一个简单的解决方案。

1 个答案:

答案 0 :(得分:1)

据我所知,你想要一个叫做占位符的东西。然后覆盖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;
}