Java 该值递增,但立即返回零

Java 该值递增,但立即返回零,java,field,inner-classes,Java,Field,Inner Classes,我这里有一个俄罗斯方块项目的代码片段 private class Game implements Runnable { private int numDropped = -1; public void setCount(int count){ count++; } public int getCount(){ return count; } public void run() { int colum

我这里有一个俄罗斯方块项目的代码片段

private class Game implements Runnable  {
    private int numDropped = -1;
    public void setCount(int count){
        count++;
    }
    public int getCount(){
        return count;
    }
    public void run() {
        int column = 4, style = Piece.SHAPES[(int) (Math.random() * 7)][(int) (Math.random() * 4)];
        while (onPlay) {
            if (piece != null) {
                if (piece.isAlive()) {
                    try {
                        Thread.currentThread().sleep(100);
                    } 
                    catch (InterruptedException ie) {
                        ie.printStackTrace();
                    }
                    continue;
                }
            }

            checkFullLine();  
            if (isGameOver()) {
                playItem.setEnabled(true);
                pauseItem.setEnabled(true);
                resumeItem.setEnabled(false);
                rightPanel.setPlayButtonEnable(true);
                rightPanel.setPauseButtonLabel(true);

                displayGameOver();
                return;
            }
            piece = new Piece(style, -1, column, board);
            piece.start();
            style = Piece.SHAPES[(int) (Math.random() * 7)][(int) (Math.random() * 4)];
            rightPanel.setTipStyle(style);
            numDropped = numDropped+1;
            RightPanel.scoreTextField.setText(numDropped+"");
        }
    }
}
顺便说一下,类
游戏
是一个内部类。每当一个新的工件下降时,
numDropped
的值就会增加(如JTextField中所显示的),但过一会儿就会回到零。我放错地方了吗

numDropped = numDropped+1;
RightPanel.scoreTextField.setText(numDropped+"");

??或者是因为像是静态的之类的东西。请帮帮我。我对Java有点陌生。多谢各位

您发布的代码绝对不会将
scoreTextField
更新为小于先前使用的值

我首先怀疑的是,还有其他一些代码将
scoreTextField
更新为不等于
numDropped
的值

更新 在您另外发布的代码中,我看到:

RightPanel.scoreTextField = new JTextField(numDropped+"");
这是错误的;删除它并取消注释上面的行,该行设置现有文本字段中的文本

此外,您还有以下代码:

timer = new Timer(
                500, new ActionListener() {
                    public void actionPerformed(ActionEvent ae) {
                        scoreTextField.setText("" + game.getScore());
                        int scoreForLevelUpdate = game.getScoreForLevelUpdate();
                        if (scoreForLevelUpdate >= Tetris.PER_LEVEL_SCORE && scoreForLevelUpdate > 0)
                            game.levelUpdate();
                    }
                }
        );

        timer.start();
显然,这将用游戏分数覆盖
scoreTextField
,而在
game
的循环中,您正在写入被删除元素的数量。根据变量
scoreTextField
的名称判断,您应该在
Game
中更改代码,以更新其他一些文本字段,而不是用于显示分数的文本字段

您设计中的另一个错误是:

Thread thread = new Thread(new Game());
thread.start();
您正在启动另一个线程来控制游戏性。您不能更新主GUI线程(即所谓的事件调度线程(EDT))之外的任何Swing组件。我的建议是重新设计您的代码,类似于您在上面使用
timer
变量所做的工作:不要启动另一个线程;相反,计划另一个间隔为100毫秒的
计时器
,并在
while(onPlay)
中基于当前代码执行相关的
actionPerformed
——您需要更改的只是不再需要循环。当然,
Thread.sleep(100)
也将是多余的。游戏结束后,只需取消计时器任务

与此问题没有直接关系,但此代码

public void setCount(int count){
    count++;
}

这也是错误的:它不会写入实例变量
count
,而只是增加提供的参数,立即丢弃它(它只是一个局部变量)。

您发布的代码绝对不会将
scoreTextField
更新为小于先前使用的值的值

我首先怀疑的是,还有其他一些代码将
scoreTextField
更新为不等于
numDropped
的值

更新 在您另外发布的代码中,我看到:

RightPanel.scoreTextField = new JTextField(numDropped+"");
这是错误的;删除它并取消注释上面的行,该行设置现有文本字段中的文本

此外,您还有以下代码:

timer = new Timer(
                500, new ActionListener() {
                    public void actionPerformed(ActionEvent ae) {
                        scoreTextField.setText("" + game.getScore());
                        int scoreForLevelUpdate = game.getScoreForLevelUpdate();
                        if (scoreForLevelUpdate >= Tetris.PER_LEVEL_SCORE && scoreForLevelUpdate > 0)
                            game.levelUpdate();
                    }
                }
        );

        timer.start();
显然,这将用游戏分数覆盖
scoreTextField
,而在
game
的循环中,您正在写入被删除元素的数量。根据变量
scoreTextField
的名称判断,您应该在
Game
中更改代码,以更新其他一些文本字段,而不是用于显示分数的文本字段

您设计中的另一个错误是:

Thread thread = new Thread(new Game());
thread.start();
您正在启动另一个线程来控制游戏性。您不能更新主GUI线程(即所谓的事件调度线程(EDT))之外的任何Swing组件。我的建议是重新设计您的代码,类似于您在上面使用
timer
变量所做的工作:不要启动另一个线程;相反,计划另一个间隔为100毫秒的
计时器
,并在
while(onPlay)
中基于当前代码执行相关的
actionPerformed
——您需要更改的只是不再需要循环。当然,
Thread.sleep(100)
也将是多余的。游戏结束后,只需取消计时器任务

与此问题没有直接关系,但此代码

public void setCount(int count){
    count++;
}

这也是错误的:它不写入实例变量
count
,只是增加提供的参数,立即丢弃它(它只是一个局部变量)。

我能看到它如何设置为零的仅有两个地方如下:

public int getScore() {
        if (board != null) 
            return board.getScore();
        return 0;
    }


在某个时刻,您的
对象可能在重置功能中被置空。将调试器绑定到进程上,并在这两个函数中放置断点。

我能看到的两个地方是如何将其设置为零的,如下所示:

public int getScore() {
        if (board != null) 
            return board.getScore();
        return 0;
    }


在某个时刻,您的
对象可能在重置功能中被置空。将调试器绑定到进程上,并在这两个函数中放置一个断点。

“或者因为其他原因,例如是
静态的
之类的东西。”即使不是由此引起的,属性/代码可能也应该更改,以允许它成为实例属性。您没有发布足够的代码,我们无法帮助您。这是如何调用的?@Woot4Moo实际上,在任何情况下都不会使这个特定的代码减量/重置
numDropped
。@MarkoTopolnik如果OP调用
setCount(numbersmallerhancurrent)
will@Woot4Moo什么意思?这只会更新
count
变量,该变量在任何地方都不会被读取(好吧,除了getter中)。“或者因为
是静态的
之类的东西。”即使不是由此引起的,属性/代码可能应该更改为允许它成为实例属性。您没有发布足够的代码,我们无法帮助您。这是如何调用的?@Woot4Moo实际上,在任何情况下都不会使这个特定的代码减量/重置
numDropped
。@MarkoTopolnik如果OP调用
setCount(number