概要

JTextFieldなどのJTextComponentが編集不可の状態でもCaretを非表示にせず点滅が継続するよう設定します。

スクリーンショット

Swing/NonEditableTextFieldCaret.png

サンプルコード

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になる

参考リンク

コメント