我想在游戏纸牌中实现操作撤消。我有创建功能保存,它将复制元素的实际状态和功能负载,这将覆盖这些副本的实际元素。但是当我在使用卡进行某些操作之前调用函数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();
}
答案 0 :(得分:1)
如果working_pack1_stack
是可变的(可以改变),即使它被添加到ArrayList之后也可以更改它。您所做的只是将对堆栈的引用添加到ArrayList。如果您修改堆栈,任何引用它的地方(包括列表)也将被更改。
制作堆栈对象的副本并将其添加到列表中,以防止外部代码更改它。