可变失去储值

时间:2013-09-10 19:50:22

标签: java variables

在下面的代码中,XPos不断更改值,而我的代码没有采取任何操作。

public class JTwinPreviewButtons {
    static PreviewPanel previewPanel;
    static EditorPanel editorPanel;
    ArrayList<JTwinPreviewButtons> subButtons = new ArrayList<JTwinPreviewButtons>();
    private static int overallYPos = 0;
    Item item;
    JButton plusButton;
    JButton itemButton;
    private boolean isPlus;
    private boolean shown;
    private int YPos;
    private int XPos;

    public JTwinPreviewButtons(Item someItem, int itemNum) {
        plusButton = new JButton("-");
        itemButton = new JButton(someItem.getName());
        item = someItem;
        isPlus = false;
        shown = true;
        System.out.println("Item Number: "+itemNum);
        XPos = (itemNum * 15) + 25;
        System.out.println(XPos); //XPos == 70
        if (previewPanel!=null) {
            if (itemNum == 0) {
                previewPanel.addTopButton(this);
            }
            previewPanel.refresh();   //printed inside here XPos == 25
            System.out.println(XPos); //XPos == 70
        }

        plusButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (isPlus) {
                    for (JTwinPreviewButtons subs : subButtons) {
                        subs.setSubShown(true);
                    }
                    plusButton.setText("-");
                    isPlus = false;
                    previewPanel.refresh();
                } else {
                    for (JTwinPreviewButtons subs : subButtons) {
                        subs.setSubShown(false);
                    }
                    plusButton.setText("+");
                    isPlus = true;
                    previewPanel.refresh();
                }
            }
        });

        itemButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
            }
        });
        //here XPos == 70
        //after initialization method XPos == 25
    }
}

private void updateYPos() {
    YPos = overallYPos;
    overallYPos += 25;
}

private void setBounds() {
    updateYPos();
    System.out.println(XPos); //25
    plusButton.setBounds(XPos-20, YPos+2, 16, 16);
    itemButton.setBounds(XPos, YPos, itemButton.getText().length()*7+15, 20);
}

public void display() {
    if (shown) {
        System.out.println(XPos); //25
        setBounds();
        previewPanel.add(plusButton);
        previewPanel.add(itemButton);
    }
}

因此,似乎XPos仅在初始化方法的持续时间内保留其值。没有其他地方可以设置XPos的值。真正让我困惑的是,无论我在初始化中将XPos设置为什么,它总是回复到25但是我已经搜索了我的所有代码,因为我错误地做了“XPos = 25”并且它根本就不存在我的代码......还有什么可以在这里工作?

编辑:

import java.awt.Component;
import java.awt.Dimension;
import java.util.ArrayList;

import javax.swing.JPanel;

public class PreviewPanel {
    ArrayList<JTwinPreviewButtons> topButtons = new ArrayList<JTwinPreviewButtons>();
    JPanel panel = new JPanel(null);

    public PreviewPanel() {
        panel.setPreferredSize(new Dimension(600,750));
        refresh();
    }

    public void addTopButton(JTwinPreviewButtons button) {
        topButtons.add(button);
    }

    public void add(Component comp) {
        panel.add(comp);
    }

    public void refresh() {
        panel.removeAll();
        recursiveRefresh(topButtons);
    }

    private void recursiveRefresh(ArrayList<JTwinPreviewButtons> list) {
        for (JTwinPreviewButtons o : list) {
            o.display();
            recursiveRefresh(o.getSubButtons());
        }
    }

    public JPanel getComponent() {
        return panel;
    }
}

2 个答案:

答案 0 :(得分:4)

XPos内引用的JTwinPreviewButtons对该类是私有的。当您在XPos内打印previewPanel.refresh()时,您指的是一个完全不同的变量。

答案 1 :(得分:1)

问题是previewPanel正在从JTwinPreviewButtons(JTPB)调用方法。从previewPanel调用时,所有这些方法都会返回X(按钮数)25。原因是每次创建新的JTPB时都会调用recursiveRefresh方法。由于previewPanel只引用了顶级JTPB,因此每次创建新的JTPB时都会调用一个布局方法。那个顶层实际上没有任何对低层次JTPB的引用,因此recursiveRefresh不会递归地影响任何其他JTPB。

哇,这太疯狂了。