Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 变量丢失存储值_Java_Variables - Fatal编程技术网

Java 变量丢失存储值

Java 变量丢失存储值,java,variables,Java,Variables,在下面的代码中,XPos不断地更改值,而我的代码不会对其采取任何操作 public class JTwinPreviewButtons { static PreviewPanel previewPanel; static EditorPanel editorPanel; ArrayList<JTwinPreviewButtons> subButtons = new ArrayList<JTwinPreviewButtons>(); priv

在下面的代码中,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);
    }
}
公共类JTwinPreviewButtons{
静态预览面板预览面板;
静态EditorPanel EditorPanel;
ArrayList子按钮=新建ArrayList();
私有静态int-overallYPos=0;
项目;
JButton plusButton;
JButton项目按钮;
私有布尔isPlus;
显示私有布尔值;
私营机构;
私人int XPO;
公共JTwinPreviewButtons(Item someItem,int itemNum){
plusButton=新的JButton(“-”);
itemButton=newjbutton(someItem.getName());
item=someItem;
isPlus=false;
显示=正确;
System.out.println(“项目编号:+itemNum”);
XPos=(itemNum*15)+25;
System.out.println(XPos);//XPos==70
如果(previewPanel!=null){
如果(itemNum==0){
previewPanel.addTopButton(此按钮);
}
previewPanel.refresh();//在此处打印XPos==25
System.out.println(XPos);//XPos==70
}
plusButton.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件e){
如果(isPlus){
用于(JTwinPreviewButtons子按钮:子按钮){
subs.setSubShown(真);
}
plusButton.setText(“-”);
isPlus=false;
previewPanel.refresh();
}否则{
用于(JTwinPreviewButtons子按钮:子按钮){
subs.setSubShown(假);
}
plusButton.setText(“+”);
isPlus=true;
previewPanel.refresh();
}
}
});
addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件e){
}
});
//这里XPos==70
//初始化方法XPos==25后
}
}
私有void updateYPos(){
YPos=总体YPos;
总的来说,POS+=25;
}
私人证券交易所(){
updateYPos();
System.out.println(XPos);//25
加钮扣.立根(XPos-20,YPos+2,16,16);
itemButton.setBounds(XPos、YPos、itemButton.getText().length()*7+15,20);
}
公共空间显示(){
如图所示{
System.out.println(XPos);//25
挫折();
previewPanel.add(plusButton);
previewPanel.add(项目按钮);
}
}
因此,XPos似乎只在初始化方法期间保留其值。没有其他地方可以设置XPos的值。真正让我困惑的是,无论我在初始化时将XPos设置为什么,它总是恢复为25,但我已经搜索了我所有的代码,寻找我错误地执行“XPos=25”的任何其他位置,它根本不存在于我的代码中。。。这里还能有什么工作

编辑:

导入java.awt.Component;
导入java.awt.Dimension;
导入java.util.ArrayList;
导入javax.swing.JPanel;
公共类预览面板{
ArrayList topButtons=新建ArrayList();
JPanel面板=新JPanel(空);
公共预览面板(){
面板。设置首选尺寸(新尺寸(600750));
刷新();
}
公共无效addTopButton(JTwinPreviewButtons按钮){
添加(按钮);
}
公共无效添加(组件组件组件){
面板。添加(comp);
}
公共无效刷新(){
panel.removeAll();
recursiveRefresh(顶部按钮);
}
私有void recursiveRefresh(ArrayList列表){
用于(JTwinPreviewButtons o:list){
o、 显示();
recursiveRefresh(o.getSubButtons());
}
}
公共JPanel getComponent(){
返回面板;
}
}

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

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


哇哦,那太疯狂了。

初始化XPos=25后你是什么意思?调用构造函数后,您在哪里检查
xpos
的值?
xpos=(itemNum*15)+25…您是否使用
itemNum==0
创建对象?Jim Garrisson的回答几乎肯定是正确的,但我们能否查看previewPanel的代码以确保添加到@RichardTingle的注释中,查看初始化后的打印位置也会有所帮助。这要感谢RichardTingle、SamIam,尤其是crush。请给我一秒钟时间在回答中说明问题所在。我不会在previewPanel.refresh()中打印它。previewPanel有一个对所有JTwinPreviewButtons的引用,当我设置一个虚拟方法(在JTwinPreviewButtons内部)来打印它们的XPO时,它们都打印25。另外,这也不能解释为什么初始化后调用了任何方法(我可以在其中嵌套System.out.print)print 25。另外,我在问这个问题之前也尝试过公开这个问题,因为这是我对罪犯的第一次怀疑。但是,这导致了相同的结果(25)。如果你不显示相关代码,你希望如何得到有意义的答案?更新^I我试图发布它,但是有太多代码和太多评论需要回复。我不指望有人能神奇地知道这个秘密
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;
    }
}