Почему это int не увеличивается? - PullRequest
1 голос
/ 13 октября 2011

Я застрял на, вероятно, легкой проблеме, но я действительно не могу понять, почему она не работает. Я пытаюсь увеличить mijnScore с 1 каждый раз, когда вызывается метод. Но почему-то mijnScore возвращается к 0 после завершения метода.

int mijnScore = 0;
...
public void updateUI() {
    System.out.println("updateUI");
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {  
            ikWin = true;

            while(ikWin) {
                mijnScore++;
                System.out.println("mijnScore" + mijnScore);
                Scoresp1.setText(mijnScore + "");
                ikWin = false;
                positie = 0;
            }
        }
    });
}

решаемые

Создание статической переменной решило мою проблему.

static int mijnScore = 0;

Ответы [ 4 ]

2 голосов
/ 13 октября 2011

Пожалуйста, ознакомьтесь с javadoc метода SwingUtilities.invokeLater (..) http://download.oracle.com/javase/1.4.2/docs/api/javax/swing/SwingUtilities.html#invokeLater(java.lang.Runnable)

Может случиться так, что поток, выполняющий инкременты mijnScore, вызывается только позже, и поэтому в родительском потоке вы по-прежнему видите значение 0 для него.

1 голос
/ 13 октября 2011

Если он работает после того, как вы сделали его статичным, у вас может возникнуть другая проблема!

Вы вызываете updateUI () для вновь созданного класса? Если это так, вызывайте его только для ранее созданного экземпляра, поскольку mijnScore является локальным для этого экземпляра!

РЕДАКТИРОВАТЬ:

Ваши классы выглядят так? (Возможно, вам следовало добавить больше кода в вопросе)

// Score.java
public class Score {

    int mijnScore = 0;

    JLabel scoreSp1 = new JLabel();

    public Score(JDialog dialog) {
            dialog.add(scoreSp1);
    }

    ...

    public void updateUI() {
        // Code from question
    }
}

// Window.java
public class Game {

    ...

    public void scoredPoint() {
        JDialog dialog = new JDialog("You scored!");
        new Score(dialog).updateUI();
        dialog.setVisible(true);
    }
}

В этом глупом примере проблема на самом деле во втором классе - вам не нужно каждый раз создавать новый экземпляр Score. Для примера код должен быть написан так:

// Window.java
public class Game {

    JDialog dialog = new JDialog("You scored!");

    Score score = new Score(dialog);

    ...

    public void scoredPoint() {
        score.updateUI();
        dialog.setVisible(true);
    }
}
1 голос
/ 13 октября 2011

Я не знаю, звоните ли вы с разными объектами или просто так. Просто предположите, что переменная mijnScore статическая, тогда все может быть в порядке.

1 голос
/ 13 октября 2011

почему вы установили ikWin = false;, затем цикл заканчивается на первом шаге

...