我构建了一个扩展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()
来显示提示,但是在处理密码时这并不好(我不想因为记录它们而受到指责......)。还有另一种方法可以阻止这种情况吗?
TextPrompt
,但我想建立一个简单的解决方案。
答案 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;
}