2017-05-08 28 views
0

ゲームのソリティアで操作の取り消しを実装します。私は、これらのコピーで実際の要素をオーバーライドする、要素の実際の状態と関数の負荷をコピーする関数saveを作成しました。しかし、私は関数save関数を呼び出すと、関数はカードで関数を保存しますが、関数は値を保存しますが、これらの値のソースが変化すると、これらの変数も変化します。関数に設定された変数は常に変更されます

これらの変数は、コンストラクタの前に、このクラスに設定されています。

private void save_undo() 
{ 
    undo_card_stack1.add(working_pack1_stack); 
    undo_card_stack2.add(working_pack2_stack); 
.... 
:この

ArrayList<CardStack> undo_card_stack1 = new ArrayList<>(); 

機能save_undoよう

public class Game extends javax.swing.JPanel 

、単にこれらの値の実際の状態をコピーするには、このような値を元に戻します

カードカードを使用するすべてのアクションがJLabelである前に、機能がコールされます。 私には分かりませんが、save_undo()呼び出しの後にこのコード部分のデバッグを正しく設定すると、popとpushで数行後の値が書き換えられる理由が分かりません。

private void start_deckMouseClicked(java.awt.event.MouseEvent evt) {           

    save_undo(); 
    discardPile_card = null; 
    if (!deck.isEmpty()) 
    { 

     discardPile.deck.push(deck.pop()); 
     ... 

機能負荷ボタンをクリックしたときに保存してある通話の正反対の操作を行います。

private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {           
    load_undo(); 
} 

答えて

1

working_pack1_stackは(変更可能)可変である場合、されていても後に変更されるために、それが可能ですArrayListに追加されます。あなたがしているのは、スタックへの参照をArrayListに追加することだけです。スタックを変更した場合は、リストを含む参照がある場所も変更されます。

スタックオブジェクトのコピーを作成し、リストに追加して、外部コードによってスタックオブジェクトが変更されないようにします。

+0

ありがとうございます。これらのオブジェクトのコピーを作成するには、どのような方法が最善で最速ですか。 –

+0

@TomášDubovskýあなたのCardStackクラスのコードを見ずに言うのは難しいです。それがArrayListの単なるラッパーであれば、リストの* copy *を含む新しいCardStackインスタンスを作成してください。 – Carcigenicate

+0

@TomášDubovskýあなたのCardStackクラスのコピーコンストラクタを作成して、コピーを簡単にします。 CardStackを受け入れるコンストラクタを作成し、コンストラクタでそのコンストラクタを使用してコピーを作成させます。 – Carcigenicate

関連する問題