S-JIS[2009-04-19] 変更履歴

Caret(Swing)

Caretは、テキストの位置を示すカーソル。
(ただし、 Javaでは普通に「カーソル(cursor)」と言うとマウスカーソルを指す)


常に表示するキャレット

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

Swing目次へ戻る / Java目次へ戻る
メールの送信先:ひしだま