Swing/UndoRedoCheckBoxes のバックアップ(No.6)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/UndoRedoCheckBoxes へ行く。
- category: swing
folder: UndoRedoCheckBoxes
title: JCheckBoxの選択状態をBigIntegerで記憶し、UndoManagerを使用して元に戻したりやり直したりする
tags: [JCheckBox, UndoManager, UndoableEditSupport]
author: aterai
pubdate: 2016-04-18T00:42:25+09:00
description: 複数のJCheckBoxの選択状態をBigIntegerで記憶し、UndoManagerを使用してアンドゥ・リドゥを行います。
image:
hreflang:
href: https://java-swing-tips.blogspot.com/2016/10/undo-redo-selected-state-of-checkboxes.html lang: en
概要
複数のJCheckBox
の選択状態をBigInteger
で記憶し、UndoManager
を使用してアンドゥ・リドゥを行います。
Screenshot
Advertisement
サンプルコード
private BigInteger status = new BigInteger("111000111", 2);
private static final int BIT_LENGTH = 50;
//...
for (int i = 0; i < BIT_LENGTH; i++) {
BigInteger l = BigInteger.ONE.shiftLeft(i);
JCheckBox c = new JCheckBox(Integer.toString(i + 1));
c.addActionListener(e -> {
JCheckBox cb = (JCheckBox) e.getSource();
BigInteger newValue = cb.isSelected() ? status.or(l) : status.xor(l);
undoSupport.postEdit(new StatusEdit(status, newValue));
status = newValue;
label.setText(print(status));
});
c.setSelected(!status.and(l).equals(BigInteger.ZERO));
p.add(c);
}
View in GitHub: Java, Kotlin解説
JCheckBox
の選択状態をBigInteger
のビットフラグで管理、記憶- リスナとして
UndoManager
をUndoableEditSupport#addUndoableEditListener(...)
メソッドで追加 JCheckBox
がクリックされるなどで値が変化した場合、変更前と変更後のBigInteger
を持つUndoableEdit
を作成して、UndoableEditSupport#postEdit(...)
で登録UndoManager#undo()
でアンドゥ、UndoManager#redo()
でリドゥを実行し、BigInteger
のステータスを更新- 更新された
BigInteger
から各JCheckBox
の選択状態を復元
- 更新された
参考リンク
- Java Swing「UndoManager」メモ(Hishidama's Swing-UndoManager Memo)
- JCheckBoxの選択状態をBitSetで管理する
BitSet
を使用するサンプル