Java JTextField/JPasswordField的提示
我构建了一个扩展JTextField类的类和一个自己的提示函数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
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也有同样的功能,但我不想在两个不同的类中编写相同的方法
文本提示再次向您展示了如何做到这一点,因此请从一个工作示例中学习。我的评论是假设您谈论的是这个类。