Swing/ReplaceUndoableEdit のバックアップ差分(No.2)
- バックアップ一覧
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- バックアップ を表示
- Swing/ReplaceUndoableEdit へ行く。
- 1 (2012-10-15 (月) 14:31:20)
- 2 (2012-10-15 (月) 16:57:03)
- 3 (2012-10-15 (月) 19:54:03)
- 4 (2012-10-15 (月) 21:39:49)
- 5 (2012-10-17 (水) 17:08:44)
- 6 (2012-11-20 (火) 21:25:01)
- 7 (2012-12-05 (水) 18:27:44)
- 8 (2012-12-07 (金) 16:32:57)
- 9 (2014-06-27 (金) 20:06:06)
- 10 (2014-06-29 (日) 01:30:53)
- 11 (2014-11-06 (木) 01:08:59)
- 12 (2014-11-06 (木) 04:17:22)
- 13 (2014-11-19 (水) 20:14:21)
- 14 (2014-11-21 (金) 18:11:05)
- 15 (2015-12-18 (金) 16:26:34)
- 16 (2016-09-23 (金) 02:21:02)
- 17 (2016-09-27 (火) 01:10:08)
- 18 (2017-04-07 (金) 13:51:51)
- 19 (2017-11-02 (木) 15:32:16)
- 20 (2017-11-04 (土) 00:09:26)
- 21 (2018-02-24 (土) 19:51:30)
- 22 (2019-04-19 (金) 13:43:27)
- 23 (2019-05-30 (木) 18:34:13)
- 24 (2021-02-19 (金) 04:20:29)
- 追加された行はこの色です。
- 削除された行はこの色です。
TITLE:UndoManagerを使用した文字列選択ペーストの動作を変更する
#navi(../)
RIGHT:Posted by [[aterai]] at 2012-10-15
*UndoManagerを使用した文字列選択ペーストの動作を変更する [#g8638a3f]
JTextFieldなどにUndoManagerを設定し、文字列を選択してペーストした後のUndoの動作を変更します。
-&jnlp;
-&jar;
-&zip;
//#screenshot
#ref(https://lh4.googleusercontent.com/-7Otr-GEBDF8/UHuZ373ZxtI/AAAAAAAABUQ/ASmTdTbdv3o/s800/ReplaceUndoableEdit.png)
**サンプルコード [#g8b58a74]
#code(link){{
Document doc = new PlainDocument() {
@Override public void replace(
int offset, int length, String text, AttributeSet attrs)
throws BadLocationException {
undoManager.undoableEditHappened(
new UndoableEditEvent(
this, new ReplaceUndoableEdit(offset, length, text)));
replaceIgnoringUndo(offset, length, text, attrs);
}
private void replaceIgnoringUndo(
int offset, int length, String text, AttributeSet attrs)
throws BadLocationException {
removeUndoableEditListener(undoManager);
super.replace(offset, length, text, attrs);
addUndoableEditListener(undoManager);
}
class ReplaceUndoableEdit extends AbstractUndoableEdit {
private final String oldValue;
private final String newValue;
private int offset;
public ReplaceUndoableEdit(int offset, int length, String newValue) {
String txt;
try{
txt = getText(offset, length);
}catch(BadLocationException e) {
txt = null;
}
this.oldValue = txt;
this.newValue = newValue;
this.offset = offset;
}
@Override public void undo() throws CannotUndoException {
try{
replaceIgnoringUndo(offset, newValue.length(), oldValue, null);
}catch(BadLocationException ex) {
throw new CannotUndoException();
}
}
@Override public void redo() throws CannotRedoException {
try{
replaceIgnoringUndo(offset, oldValue.length(), newValue, null);
}catch(BadLocationException ex) {
throw new CannotUndoException();
}
}
@Override public boolean canUndo() {
return true;
}
@Override public boolean canRedo() {
return true;
}
}
};
}}
**解説 [#c90ce0a6]
- 上: デフォルト
-- JTextComponent#setText(String)や、文字列を選択してペーストした場合、Document#replace(...)で実行される Document#remove(...)とDocument#insertString(...)が別々にUndoManagerに登録される仕様?なので、二回Undoしないとペースト前の状態に戻らない
- 下
-- Document#replace(...)をオーバーライドし、直接UndoManager#undoableEditHappened(...)を使って取り消し可能な編集を登録
-- 実際の置換は、removeUndoableEditListener(...)でUndoManagerを一時的に削除した後に行う(直後にaddUndoableEditListener()で再登録)
-- 登録するUndoableEditでのUndo, Redo 時の置換もUndoManagerを一時的に削除して行う
-- メモ: このサンプルでは選択状態を復元していない
**参考リンク [#z0683651]
-- [http://www.java2s.com/Code/Java/Swing-JFC/Undomanager.htm Undo manager : Undo Redo?≪?Swing JFC?≪?Java]
-- [http://tips4java.wordpress.com/2008/10/27/compound-undo-manager/ Compound Undo Manager ≪ Java Tips Weblog]
-- [http://java-sl.com/tip_merge_undo_edits.html Merging UndoableEdits in one to be undone all together in JEditorPane.]
-- [http://www.ne.jp/asahi/hishidama/home/tech/java/swing/UndoManager.html Java Swing「UndoManager」メモ(Hishidama's Swing-UndoManager Memo)]
-- [http://kyopc.at.webry.info/201007/article_1.html Java Swingで複数のJTextFieldに対してUndo、Redoを行う(その2)-解決編 kyoはパソコンMaster or Slave?/ウェブリブログ]
**コメント [#pda09258]
#comment