Swing/InputHintPasswordField のバックアップ差分(No.10)
- バックアップ一覧
- 現在との差分 を表示
- 現在との差分 - 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)
- 追加された行はこの色です。
- 削除された行はこの色です。
---
category: swing
folder: InputHintPasswordField
title: JPasswordFieldにヒント文字列を描画する
tags: [JPasswordField, TextLayout, Focus]
author: aterai
pubdate: 2012-06-04T14:33:56+09:00
description: JPasswordFieldに入力がない場合、ヒント文字列を描画します。
image: https://lh3.googleusercontent.com/-UKh7dosDsR4/T8xFLnpMGwI/AAAAAAAABNY/nxgzH2XN1vo/s800/InputHintPasswordField.png
---
* 概要 [#summary]
`JPasswordField`に入力がない場合、ヒント文字列を描画します。
#download(https://lh3.googleusercontent.com/-UKh7dosDsR4/T8xFLnpMGwI/AAAAAAAABNY/nxgzH2XN1vo/s800/InputHintPasswordField.png)
* サンプルコード [#sourcecode]
#code(link){{
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) {}
}
}}
* 解説 [#explanation]
上記のサンプルでは、`JPasswordField#paintComponent(...)`をオーバーライドしてヒント文字列を描画しています。
`paintComponent(...)`メソッドをオーバーライドするのは同じですが、[[JTextFieldに透かし画像を表示する>Swing/WatermarkInTextField]]とは異なり、`JPasswordField`にフォーカスがあっても、まだ入力がない場合(`DocumentListener`を追加)などに、ヒント文字列を非表示にはせず、薄く表示するようにしています(参考: [https://tips4java.wordpress.com/2009/11/29/text-prompt/ Text Prompt « Java Tips Weblog])。
* 参考リンク [#reference]
- [https://tips4java.wordpress.com/2009/11/29/text-prompt/ Text Prompt « Java Tips Weblog]
-- `JTextComponent`に`BorderLayout`を設定して、文字列やアイコンを設定した`JLabel`を追加し、これを`JLabel#setVisible(boolean)`で切り替えているので、汎用的な使用が可能
- [[JTextFieldにフォーカスと文字列が無い場合の表示>Swing/GhostText]]
-- `JTextField#setText()`メソッドを使用
- [[JTextFieldに透かし画像を表示する>Swing/WatermarkInTextField]]
-- `JTextField#paintComponent(...)`メソッドをオーバーライド
- [[JComboBoxでアイテムが選択されていない場合のプレースホルダ文字列を設定する>Swing/ComboBoxPlaceholder]]
* コメント [#comment]
#comment
#comment