JPasswordFieldにヒント文字列を描画する
Total: 5023
, Today: 2
, Yesterday: 1
Posted by aterai at
Last-modified:
概要
JPasswordField
に入力がない場合、ヒント文字列を描画します。
Screenshot
Advertisement
サンプルコード
class WatermarkPasswordField extends JPasswordField
implements FocusListener, DocumentListener {
private boolean showWatermark = true;
public WatermarkPasswordField() {
super();
addFocusListener(this);
getDocument().addDocumentListener(this);
}
@Override protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (showWatermark) {
Graphics2D g2 = (Graphics2D) g.create();
Insets i = getInsets();
Font font = getFont();
FontRenderContext frc = g2.getFontRenderContext();
TextLayout tl = new TextLayout("Password", font, frc);
g2.setPaint(hasFocus() ? Color.GRAY : Color.BLACK);
int baseline = getBaseline(getWidth(), getHeight());
tl.draw(g2, i.left + 1, baseline);
g2.dispose();
}
}
@Override public void focusGained(FocusEvent e) {
repaint();
}
@Override public void focusLost(FocusEvent e) {
showWatermark = getPassword().length == 0;
repaint();
}
@Override public void insertUpdate(DocumentEvent e) {
showWatermark = e.getDocument().getLength() == 0;
repaint();
}
@Override public void removeUpdate(DocumentEvent e) {
showWatermark = e.getDocument().getLength() == 0;
repaint();
}
@Override public void changedUpdate(DocumentEvent e) {}
}
View in GitHub: Java, Kotlin解説
JPasswordField#paintComponent(...)
をオーバーライドしてヒント文字列を描画paintComponent(...)
メソッドをオーバーライドするのはJTextFieldに透かし画像を表示すると同様だが、こちらはJPasswordField
にフォーカスがあってもまだ入力がない場合(DocumentListener
を追加)などに、ヒント文字列を非表示にはせず薄く表示するよう変更- 参考: Text Prompt « Java Tips Weblog
参考リンク
- Text Prompt « Java Tips Weblog
JTextComponent
にBorderLayout
を設定して文字列やアイコンを設定したJLabel
を追加し、これをJLabel#setVisible(boolean)
で切り替えているので汎用的な使用が可能
- JTextFieldにフォーカスと文字列が無い場合の表示
JTextField#setText()
メソッドを使用
- JTextFieldに透かし画像を表示する
JTextField#paintComponent(...)
メソッドをオーバーライド
- JComboBoxでアイテムが選択されていない場合のプレースホルダ文字列を設定する