Swing/InputHintPasswordField のバックアップ(No.2)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/InputHintPasswordField へ行く。
  - 1 (2012-12-25 (火) 18:26:20)
- 2 (2014-11-22 (土) 03:59:58)
- 3 (2014-12-11 (木) 15:05:10)
- 4 (2016-01-27 (水) 18:22:37)
- 5 (2016-05-27 (金) 13:23:57)
- 6 (2017-03-29 (水) 13:57:19)
- 7 (2017-11-02 (木) 15:32:16)
- 8 (2018-02-28 (水) 19:06:16)
- 9 (2018-04-18 (水) 20:51:38)
- 10 (2020-04-12 (日) 01:36:42)
- 11 (2021-10-16 (土) 00:42:42)
- 12 (2023-10-23 (月) 20:05:00)
- 13 (2025-01-03 (金) 08:57:02)
- 14 (2025-01-03 (金) 09:01:23)
- 15 (2025-01-03 (金) 09:02:38)
- 16 (2025-01-03 (金) 09:03:21)
- 17 (2025-01-03 (金) 09:04:02)
- 18 (2025-06-19 (木) 12:41:37)
- 19 (2025-06-19 (木) 12:43:47)
 
- title: JPasswordFieldにヒント文字列を描画する tags: [JPasswordField, TextLayout, Focus] author: aterai pubdate: 2012-06-04T14:33:56+09:00 description: JPasswordFieldに入力がない場合、ヒント文字列を描画します。
概要
JPasswordFieldに入力がない場合、ヒント文字列を描画します。
Screenshot

Advertisement
サンプルコード
class WatermarkPasswordField extends JPasswordField
                             implements FocusListener, DocumentListener {
  private boolean showWatermark = true;
  public WatermarkPasswordField() {
    super();
    addFocusListener(this);
    getDocument().addDocumentListener(this);
  }
  @Override public 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) {}
}
解説
上記のサンプルでは、JPasswordField#paintComponent(...)をオーバーライドしてヒント文字列を描画しています。
paintComponent(...)メソッドをオーバーライドするのは同じですが、JTextFieldに透かし画像を表示するとは異なり、JPasswordFieldにフォーカスがあっても、まだ入力がない場合(DocumentListenerを追加)などに、ヒント文字列を非表示にはせず、薄く表示するようにしています(参考: Text Prompt « Java Tips Weblog)。
参考リンク
- Text Prompt « Java Tips Weblog
- JTextComponentに- BorderLayoutを設定して、文字列やアイコンを設定した- JLabelを追加し、これを- JLabel#setVisible(boolean)で切り替えているので、汎用的に使用することができます。
 
- JTextFieldにフォーカスと文字列が無い場合の表示
- setText()を使用
 
- JTextFieldに透かし画像を表示する
- paintComponent(...)メソッドをオーバーライド