Caretは、テキストの位置を示すカーソル。
(ただし、
Javaでは普通に「カーソル(cursor)」と言うとマウスカーソルを指す)
JTextComponentのeditableやenabledがfalse(つまり編集可能でない)の場合、キャレットは表示されないようになっている。
でも編集不可でも選択やコピーは出来るので、キャレットが見えないのは不便。
DefaultCaret#focusGained()の中で判定を行ってsetVisible(true)をしたりしなかったりしているので、ここをオーバーライドして常にsetVisible(true)してやればよい。
import java.awt.event.FocusEvent; import javax.swing.text.DefaultCaret;
public class VisibleCaret extends DefaultCaret { private static final long serialVersionUID = 1140099288992101139L; public VisibleCaret() { } public VisibleCaret(int rate) { setBlinkRate(rate); } @Override public void focusGained(FocusEvent e) { setVisible(true); setSelectionVisible(true); } }
あと、通常のキャレットは500ms毎に点滅している。
これは、JTextComponent内でキャレットをインスタンス化した後にsetBlinkRate(500)で間隔を設定している。
自分で後からキャレットをJTextComponentに割り当てる場合は、それも行う必要がある。
JTextPane text = new JTextPane(); text.setEditable(false); //編集不可 Caret c = text.getCaret(); Caret nc = new VisibleCaret(c.getBlinkRate()); text.setCaret(nc);