JTextFieldが編集不可状態でもCaretが点滅するよう設定する
Total: 1371, Today: 1, Yesterday: 0
Posted by aterai at
Last-modified:
Summary
JTextFieldなどのJTextComponentが編集不可の状態でもCaretを非表示にせず点滅が継続するよう設定します。
Screenshot

Advertisement
Source Code Examples
JTextField field3 = makeTextField("DefaultCaret#setBlinkRate(...)");
field3.setCaret(new DefaultCaret() {
@Override public void focusGained(FocusEvent e) {
super.focusGained(e);
if (getComponent().isEnabled()) {
setBlinkRate(UIManager.getInt("TextField.caretBlinkRate"));
setVisible(true);
}
}
});
View in GitHub: Java, KotlinDescription
DefaultBorderを非表示、JTextField#setOpaque(false)で背景色を描画しないよう設定NimbusLookAndFeelの場合、さらにJTextField#setBackground(new Color(0x0, true))のように背景色に透過色を設定する必要がある?
setEnabled(false)JTextFieldが無効化されている場合はフォーカスを取得できないのでCaretは表示不可能
setEditable(false)JTextFieldが編集不可の場合でもフォーカスの取得や文字列選択が可能だが、Caretは非表示になる
DefaultCaret#setVisible(true)DefaultCaret#focusGained(...)メソッドをオーバーライドしてJTextFieldが有効化されていれば編集可能・不可能に関係なくDefaultCaret#setVisible(true)を実行してCaretを表示するよう設定- 点滅速度はリセットされて
0になり点滅不可になる
DefaultCaret#setBlinkRate(...)DefaultCaret#focusGained(...)メソッドをオーバーライドしてJTextFieldが有効化されていれば編集可能・不可能に関係なくCaretを表示、点滅するよう設定- 点滅速度は
UIManager.getLookAndFeelDefaults().getInt("TextField.caretBlinkRate")で取得し、DefaultCaret#setBlinkRate(...)で再設定 NimbusLookAndFeelの場合UIManager.getLookAndFeelDefaults().getInt("TextField.caretBlinkRate")で点滅速度を取得すると0になる
Reference
- [JDK-4512626] Non-editable JTextArea provides no visual indication of keyboard focus - Java Bug System
- デフォルトで編集不可でも
Caretが非表示にならないようJava 20で修正される予定
- デフォルトで編集不可でも
- JTextAreaなどのCaretを非表示にする