功能中设置的变量不断变化

时间:2017-05-08 16:38:57

标签: java swing jlabel

我想在游戏纸牌中实现操作撤消。我有创建功能保存,它将复制元素的实际状态和功能负载,这将覆盖这些副本的实际元素。但是当我在使用卡进行某些操作之前调用函数save时,函数会保存值,但是当这些值的源更改时,这些变量也会发生变化。

这些变量在构造函数之前在此类中设置:

public class Game extends javax.swing.JPanel 
像这样

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

函数save_undo只是将实际的值状态复制到这些撤消值,如下所示:

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

功能是在每次卡片行动之前调用 - 卡片是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 个答案:

答案 0 :(得分:1)

如果working_pack1_stack是可变的(可以改变),即使它被添加到ArrayList之后也可以更改它。您所做的只是将对堆栈的引用添加到ArrayList。如果您修改堆栈,任何引用它的地方(包括列表)也将被更改。

制作堆栈对象的副本并将其添加到列表中,以防止外部代码更改它。