Swing/OverTypeMode のバックアップ(No.5)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/OverTypeMode へ行く。
- 1 (2006-01-16 (月) 15:56:38)
- 2 (2006-01-16 (月) 17:47:45)
- 3 (2006-01-16 (月) 18:49:42)
- 4 (2006-01-16 (月) 23:52:53)
- 5 (2006-02-27 (月) 16:18:09)
- 6 (2006-03-24 (金) 10:40:01)
- 7 (2006-03-24 (金) 16:26:25)
- 8 (2006-03-24 (金) 20:11:56)
- 9 (2006-03-27 (月) 14:09:27)
- 10 (2006-03-28 (火) 13:05:15)
- 11 (2006-03-31 (金) 16:39:04)
- 12 (2006-07-13 (木) 10:40:18)
- 13 (2007-03-04 (日) 18:38:31)
- 14 (2007-09-26 (水) 13:52:16)
- 15 (2012-07-08 (日) 02:55:42)
- 16 (2013-03-15 (金) 16:51:56)
- 17 (2013-07-26 (金) 01:46:36)
- 18 (2013-10-17 (木) 04:26:50)
- 19 (2014-11-25 (火) 03:03:31)
- 20 (2014-12-28 (日) 15:07:13)
- 21 (2015-01-04 (日) 07:16:33)
- 22 (2016-06-07 (火) 14:43:45)
- 23 (2017-03-29 (水) 19:41:20)
- 24 (2018-03-01 (木) 14:50:30)
- 25 (2018-11-08 (木) 17:45:19)
- 26 (2020-11-05 (木) 11:40:50)
- 27 (2022-09-30 (金) 15:14:20)
JTextAreaのキャレットを上書きモード対応にする
編集者:Terai Atsuhiro
作成日:2006-01-16
更新日:2022-09-30 (金) 15:14:20
概要
JTextAreaにキャレット上の文字を上書きする上書きモードを追加します。
Java Forums - JTextPane edit mode (insert or overwrite)???のソースコードを変更して全角文字対応にしています。
サンプルコード
// 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(); } } }
解説
上記のサンプルでは、上書きモード用のキャレットを作成して、Insertキーで切り替えるようになっています。
上書きモード自体の動作は、JTextArea#replaceSelectionメソッドをオーバーライドすることで行われています。上書きモードの場合、次の文字までを選択して置き換える処理がここで追加されています。