Swing/InputHintPasswordField のバックアップの現在との差分(No.5)
- category: swing folder: InputHintPasswordField title: JPasswordFieldにヒント文字列を描画する tags: [JPasswordField, TextLayout, Focus] author: aterai pubdate: 2012-06-04T14:33:56+09:00 description: JPasswordFieldに入力がない場合、ヒント文字列を描画します。 image:
概要
概要
JPasswordField
に入力がない場合、ヒント文字列を描画します。
Screenshot
Advertisement
サンプルコード
サンプルコード
class WatermarkPasswordField extends JPasswordField
implements FocusListener, DocumentListener {
private boolean showWatermark = true;
public WatermarkPasswordField() {
super();
addFocusListener(this);
getDocument().addDocumentListener(this);
}
#spanadd
#spanend
@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();
}
}
#spanadd
#spanend
@Override public void focusGained(FocusEvent e) {
repaint();
}
#spanadd
#spanend
@Override public void focusLost(FocusEvent e) {
showWatermark = getPassword().length == 0;
repaint();
}
#spanadd
#spanend
@Override public void insertUpdate(DocumentEvent e) {
showWatermark = e.getDocument().getLength() == 0;
repaint();
}
#spanadd
#spanend
@Override public void removeUpdate(DocumentEvent e) {
showWatermark = e.getDocument().getLength() == 0;
repaint();
}
#spanadd
#spanend
@Override public void changedUpdate(DocumentEvent e) {}
}
View in GitHub: Java, Kotlin解説
上記のサンプルでは、JPasswordField#paintComponent(...)
をオーバーライドしてヒント文字列を描画しています。
解説
-
JPasswordField#paintComponent(...)
をオーバーライドしてヒント文字列を描画-
paintComponent(...)
メソッドをオーバーライドするのはJTextFieldに透かし画像を表示すると同様だが、こちらはJPasswordField
にフォーカスがあってもまだ入力がない場合(DocumentListener
を追加)などに、ヒント文字列を非表示にはせず薄く表示するよう変更 - 参考: Text Prompt « Java Tips Weblog
-
paintComponent(...)
メソッドをオーバーライドするのは同じですが、JTextFieldに透かし画像を表示するとは異なり、JPasswordField
にフォーカスがあっても、まだ入力がない場合(DocumentListener
を追加)などに、ヒント文字列を非表示にはせず、薄く表示するようにしています(参考: Text Prompt « Java Tips Weblog)。
参考リンク
- Text Prompt « Java Tips Weblog
-
JTextComponent
にBorderLayout
を設定して、文字列やアイコンを設定したJLabel
を追加し、これをJLabel#setVisible(boolean)
で切り替えているので、汎用的に使用することができます。
-
参考リンク
- Text Prompt « Java Tips Weblog
-
JTextComponent
にBorderLayout
を設定して文字列やアイコンを設定したJLabel
を追加し、これをJLabel#setVisible(boolean)
で切り替えているので汎用的な使用が可能
-
- JTextFieldにフォーカスと文字列が無い場合の表示
-
setText()
を使用
-
-
JTextField#setText()
メソッドを使用
- JTextFieldに透かし画像を表示する
-
paintComponent(...)
メソッドをオーバーライド -
JTextField#paintComponent(...)
メソッドをオーバーライド
-
- JComboBoxでアイテムが選択されていない場合のプレースホルダ文字列を設定する