Swing/NonEditableTextFieldCaret のバックアップ(No.2)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/NonEditableTextFieldCaret へ行く。
- 1 (2022-12-19 (月) 00:14:22)
- 2 (2023-04-03 (月) 16:39:01)
- category: swing folder: NonEditableTextFieldCaret title: JTextFieldが編集不可状態でもCaretが点滅するよう設定する tags: [JTextField, JTextComponent, DefaultCaret] author: aterai pubdate: 2022-12-19T00:15:08+09:00 description: JTextFieldなどのJTextComponentが編集不可の状態でもCaretを非表示にせず点滅が継続するよう設定します。 image: https://drive.google.com/uc?id=18ZFiLXopnIpYF5bc7nr-WTLw1vG1ZZwo
概要
JTextField
などのJTextComponent
が編集不可の状態でもCaret
を非表示にせず点滅が継続するよう設定します。
Screenshot
Advertisement
サンプルコード
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, Kotlin解説
Default
Border
を非表示、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
になる
参考リンク
- [JDK-4512626] Non-editable JTextArea provides no visual indication of keyboard focus - Java Bug System
- デフォルトで編集不可でも
Caret
が非表示にならないようJava 20
で修正される予定
- デフォルトで編集不可でも
- JTextAreaなどのCaretを非表示にする