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);