Swing/OverTypeMode のバックアップの現在との差分(No.25)
- category: swing folder: OverTypeMode title: JTextAreaのキャレットを上書きモード対応にする tags: [JTextArea, Caret] author: aterai pubdate: 2006-01-16T15:56:38+09:00 description: JTextAreaにキャレット上の文字を上書きする上書きモードを追加します。 image:
概要
JTextArea
にキャレット上の文字を上書きする上書きモードを追加します。Swing - JTextPane edit mode (insert or overwrite)???のソースコードを変更して全角文字対応にしています。
JTextArea
にキャレット上の文字を上書きする上書きモードを追加します。JTextPane edit mode (insert or overwrite)???のソースコードを変更して全角文字対応にしています。
Screenshot
Advertisement
サンプルコード
// Paint a horizontal line the width of a column and 1 pixel high
class OvertypeCaret extends DefaultCaret {
//The overtype caret will simply be a horizontal line
//one pixel high (once we determine where to paint it)
// The overtype caret will simply be a horizontal line
// one pixel high (once we determine where to paint it)
@Override public void paint(Graphics g) {
if (isVisible()) {
try {
JTextComponent component = getComponent();
TextUI mapper = component.getUI();
Rectangle r = mapper.modelToView(component, getDot());
g.setColor(component.getCaretColor());
int width = g.getFontMetrics().charWidth('w');
//全角などに対応
// 全角などに対応
if (isOvertypeMode()) {
int pos = getCaretPosition();
if (pos < getDocument().getLength()) {
if (getSelectedText() != null) {
width = 0;
} else {
String str = getText(pos, 1);
width = g.getFontMetrics().stringWidth(str);
}
}
} //ここまで追加
} // ここまで追加
int y = r.y + r.height - 2;
g.drawLine(r.x, y, r.x + width - 2, y);
} catch (BadLocationException e) {}
}
}
#spanadd
#spanend
// Damage must be overridden whenever the paint method is overridden
// (The damaged area is the area the caret is painted in. We must
// consider the area for the default caret and this caret)
@Override protected synchronized void damage(Rectangle r) {
if (r != null) {
JTextComponent c = getComponent();
x = r.x;
y = r.y;
//width = c.getFontMetrics(c.getFont()).charWidth('w');
//全角対応
// width = c.getFontMetrics(c.getFont()).charWidth('w');
// 全角対応
width = c.getFontMetrics(c.getFont()).charWidth('あ');
height = r.height;
repaint();
}
}
}
View in GitHub: Java, Kotlin解説
上記のサンプルでは、DefaultCaret#paint(...)
メソッドなどをオーバーライドした上書きモード用のCaret
を作成し、InsertキーでこのCaret
を表示するモードに切り替えることができます。
上記のサンプルでは、DefaultCaret#paint(...)
メソッドなどをオーバーライドした上書きモード用のCaret
を作成しInsertキーでこのCaret
を表示するモードに切り替えることができます。
- 上書きモード自体の動作は、
JTextArea#replaceSelection(...)
メソッドをオーバーライドすることで実現- ここでキー入力を検知したとき、次の文字までを選択して置き換える処理を行う
- 上書きモード自体の動作は
JTextArea#replaceSelection(...)
メソッドをオーバーライドすることで実現- ここでキー入力を検知したとき次の文字までを選択置換する処理を実行
参考リンク
- Swing - JTextPane edit mode (insert or overwrite)???
- JTextPane edit mode (insert or overwrite)???
- DefaultCaret#paint(...) (Java Platform SE 8)