1

編集:投稿の最後を見てください...

始めに、私の下手な英語を許してください...

JTabbedPane を使用して複数のファイルを編集し、Java でテキスト エディターを作成しようとしています。その場合に UndoManager を使用するための適切なヘルプがインターネット上に見つかりませんでした。

だから私は何かを試しましたが、うまくいかないようです。

実際に、タブを変更するときに聞いて、すべての UndoableEdit を保存しようとしました。タブを変更するときは、以前に開いていたタブの UndoableEdits を保存してから、UndoManager の編集内容を消去し、最後に新しいアクティブなタブの UndoableEdits を復元します。

私が抱えている問題は、元に戻す/やり直しボタンの状態を更新する関数を呼び出すと、canUndo()/canRedo() メソッドが常に false を返すことですが、リストに編集があります...なぜなのかわかりませんこれが起こる、私は何をするのを忘れたのか理解できません...

明らかに、「編集」ベクトルに UndoableEdits が存在していても、UndoManager はこれを気にしません。ボタンを強制的に有効にしようとすると、例外がスローされます... (javax.swing.undo.CannotUndoException / javax.swing.undo.CannotRedoException)

私を手伝ってくれますか ?

さらに詳しい情報が必要な場合は、遠慮なくお尋ねください。

ありがとうございました。

UndoManager クラスの私の拡張:

public class UndoManagerPerso extends UndoManager
{
private static final long serialVersionUID = 8386145389216281754L;


public ArrayList<UndoableEdit> getEdits()
{
    ArrayList<UndoableEdit> listEdits = new ArrayList<UndoableEdit>();

    listEdits.addAll(this.edits);

    return listEdits;
}

public void setEdits(ArrayList<UndoableEdit> listEdits)
{
    for(UndoableEdit ue:listEdits)
    {
        this.addEdit(ue);
    }
}

}

私のメインウィンドウのクラスでのこれらの関数の呼び出し:

    tabbedPane_editeur.addChangeListener(new ChangeListener()
    {
        @Override
        public void stateChanged(ChangeEvent e)
        {
            if (e.getSource() instanceof JTabbedPane)
            {
                JTabbedPane pane = (JTabbedPane) e.getSource();
                int previousTab = f_principale.this.activeTab;
                int activeTab = pane.getSelectedIndex();

                System.out.println("Selected paneNo : " + pane.getSelectedIndex() + ", précédent : " + previousTab);

                f_principale.this.listEditeurs.get(previousTab).setListEdits( f_principale.this.undoManager.getEdits());
                f_principale.this.undoManager.setEdits(f_principale.this.listEditeurs.get(activeTab).getListEdits());

                f_principale.this.activeTab = activeTab;

                f_principale.this.updateButtons();
            }
        }

    });
public void updateButtons()
 {
     this.btnUndo.setText(undoManager.getUndoPresentationName());
     this.btnRedo.setText(undoManager.getRedoPresentationName());
     this.btnUndo.setEnabled(undoManager.canUndo());//returns false
     this.btnRedo.setEnabled(undoManager.canRedo());//returns false
 }

編集 : (1 日後) 今日 UndoManader をもう一度テストしたところ、何かに気づきました。実際、手動で挿入すると UndoableEdit が機能します。しかし、編集数の増加が速すぎて正常ではありません...

私はすぐにデフォルトの制限 (100) に達したので、昨日はまったく機能していないと思いました: 制限に達すると、canUndo() / canRedo() は false を返し、ボタンが強制的に有効になると、例外がスローされます。

タブを切り替えると、何か問題が発生する可能性があります...しかし、何ですか?何か考えはありますか?私はこれを見てみるつもりです...

4

1 に答える 1

1

タブごとに個別の UndoManager を作成する必要があります。

于 2013-12-17T01:52:30.657 に答える