Swing/OverTypeMode のバックアップの現在との差分(No.9)
JTextAreaのキャレットを上書きモード対応にする
編集者:Terai Atsuhiro~
作成日:2006-01-16
更新日:2022-09-30 (金) 15:14:20
概要
JTextArea
にキャレット上の文字を上書きする上書きモードを追加します。JTextPane edit mode (insert or overwrite)???のソースコードを変更して全角文字対応にしています。
Screenshot
Advertisement
概要
JTextAreaにキャレット上の文字を上書きする上書きモードを追加します。サンプルコード
#spanend
#spanadd
// Paint a horizontal line the width of a column and 1 pixel high
#spanend
#spanadd
class OvertypeCaret extends DefaultCaret {
#spanend
// 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) {}
}
}
#spandel
[[Java Forums - JTextPane edit mode (insert or overwrite)???>http://forum.java.sun.com/thread.jspa?forumID=57&threadID=667407]]のソースコードを変更して全角文字対応にしています。
#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('あ');
height = r.height;
repaint();
}
}
#spanadd
}
#spanend
#spanadd
View in GitHub: Java, Kotlin#screenshot
解説
上記のサンプルでは、DefaultCaret#paint(...)
メソッドなどをオーバーライドした上書きモード用のCaret
を作成しInsertキーでこのCaret
を表示するモードに切り替えることができます。
サンプルコード
// 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) 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) {} } } // 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) 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('あ'); height = r.height; repaint(); } } }
- 上書きモード自体の動作は
JTextArea#replaceSelection(...)
メソッドをオーバーライドすることで実現- ここでキー入力を検知したとき次の文字までを選択置換する処理を実行
- &jnlp;
- &jar;
- &zip;
参考リンク
解説
上記のサンプルでは、上書きモード用のキャレットを作成して、Insertキーで切り替えるようになっています。コメント
- 改行の処理がまだいい加減です。 -- aterai
- テキストを選択状態にしてInsertキーを押すと、反転されたままになるようなので修正。 -- aterai
-
IME
起動時、「あ」を入力し、変換キー(or Spaceキー)を押すたびに減っていきます。日本語対応のソースを心待ちにしています。 -- 初心者 - バグですね。報告ありがとうございます。減らないように修正はしたのですが、置換は以下のように適当です。 -- aterai
参考リンク
コメント
- 改行の処理がまだいい加減です。 -- terai
- テキストを選択状態にしてInsertキーを押すと、反転されたままになるようなので修正。 -- terai
- IME起動時、「あ」を入力し、変換キー(or spaceキー)を押すたびに減っていきます。日本語対応のソースを心待ちにしています。 -- 初心者?
- バグですね。報告ありがとうございます。減らないように修正はしたのですが、置換は以下のように適当です。 -- terai
aaaabbbb //元のテキストの先頭で「ああ」と入力、変換して確定すると 嗚呼bbbb //こうならずに 嗚呼aabbbb //こうなってしまう(まじめにやれば、なんとかなりそうだが)
- 早速のご対応ありがとうございます。m時 -- 初心者
- ごめんなさい。途中で送信してしまいました。文字という点で、半角
1
文字の上書きが全角1
文字でOKだと個人的には思います。 -- 初心者 -
xyzzy
を参考にして「嗚呼bbbb」の方がいかなと思ったのですが、さっき試したexcel
だと「嗚呼aabbbb」になるみたいです。ので、これは仕様ということにしておきます(^^;。 -- aterai -
xyzzy
は使ったことがないのですが、秀丸と同じでしょうか。「嗚呼」に「a」と入力して、「a 呼」なのは、ちょっといやでした。excel
上書できるんですね。word
でIME
起動中にInsertキー押下したら、ダイアログに驚きました。 -- 初心者 -
xyzzy
でも「a 呼」です。他の文字の位置が上書きで可能な限り移動しないようにするための処理だと思います。 -- aterai