Проблема получения и установки Java - PullRequest
2 голосов
/ 03 февраля 2011

Добрый день!

Я создал два класса, а именно Setting и Game;В моей игре сначала зайдите в класс Настройки.

В моем классе настроек я вызываю метод сеттера из Game, который равен .setDifficulty., и присваиваю ему значение, например == 2.

public class Setting extends javax.swing.JDialog {

       public Setting (JFrame owner) {
                super(owner, true);
                initComponents();
                setSize(400, 250);
                setLocation(370, 250);
                getContentPane().setBackground(new Color(128, 201, 20));
            }
         private void btnOkMouseClicked(java.awt.event.MouseEvent evt) {                                   
            dispose();
            MainGame m2 = new MainGame(this);
            m2.setDifficulty(jComboBox1.getSelectedIndex());
        }           

Затем я получаю доступ к своему второму классукакая игра.Но я не могу получить значение сложной переменной за пределами метода установки.(См. Мои комментарии к коду)

     public class Game extends javax.swing.JDialog {
        private int difficultLvl = 0;

        public Game(JFrame owner) {
            super(owner, true);
            initComponents();
            setSize(500, 500);
            setLocation(300, 120);
            getContentPane().setBackground(Color.getHSBColor(204, 204, 255));
            System.out.println(difficultLvl);  //SHOULD BE == 2, but == 0;
        }


        public void setDifficulty(int Difficulty) {
            this.difficultLvl = Difficulty;
            System.out.println(difficultLvl); == to 2 which is correct...
        }

Проблема в том, что я не могу получить доступ к значению hardLvl вне класса сеттера ... Он возвращается к назначенному ему значению по умолчанию, которое в этом случае равно 0. Что такоеЯ делаю не так?Как получить доступ к значению внутри метода setter.Я использовал this.difficultLvl, но без результата.Я просто новичок в Java ... Пожалуйста, помогите!Ваша помощь будет высоко оценена.Спасибо.

Ответы [ 7 ]

3 голосов
/ 03 февраля 2011

Внутри конструктора игры член 'затруднительный lvl' будет равен нулю, поскольку это то, к чему он инициализирован - нет причин ожидать, что он будет 2. После создания вы используете метод setter, чтобы установить значение 2; с этого момента значение будет равно 2, пока не будет установлено другое значение.

Если вы добавите метод получения:

public int getDifficulty() {
    return difficultLvl;
}

и назовите это, вы увидите значение.

Я подозреваю, что вы не хотите создавать новую Игру при каждом щелчке мыши, но вместо этого держите ее и просто вызывайте метод установки по щелчку мыши:

   private  MainGame m2 = new MainGame(this);

   public Setting (JFrame owner) {
            super(owner, true);
            initComponents();
            setSize(400, 250);
            setLocation(370, 250);
            getContentPane().setBackground(new Color(128, 201, 20));
        }
     private void btnOkMouseClicked(java.awt.event.MouseEvent evt) {                                   
        m2.setDifficulty(jComboBox1.getSelectedIndex());
    }   
2 голосов
/ 03 февраля 2011

difficultLvl - переменная экземпляра, поэтому она имеет значение для каждого экземпляра. Каждый раз, когда вы создаете новый экземпляр Game, он имеет собственный diffucultLvl, инициализированный на 0. Если вы установите difficultLvl в один Game, он не изменится для других Game экземпляров и не повлияет на будущие новые Game экземпляров.

private void btnOkMouseClicked(java.awt.event.MouseEvent evt) {                                   
        dispose();
        MainGame m2 = new MainGame(this);
        m2.setDifficulty(jComboBox1.getSelectedIndex());
}      

В этом коде вы создаете игру, MainGame m2 = new MainGame(), но у нее есть сложность по умолчанию, то есть то, что напечатано в конструкторе. Далее вы устанавливаете уровень сложности (если вы распечатаете сложность после этого, это будет правильно). Затем игра выбрасывается: она выходит из области видимости - это была только локальная переменная.

1 голос
/ 03 февраля 2011

Вы, кажется, создаете экземпляр MainGame в своем обработчике щелчка мыши, который, в свою очередь, получает мусор, собираемый, как только завершается вызов метода.Таким образом, ваше значение (= 2) теряется, так как объект, содержащий его, собирается.Таким образом, при следующем нажатии вы создаете новый экземпляр, который имеет значение (= 0), поскольку вы инициализируете его с 0.

private int hardLvl = 0;

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

1 голос
/ 03 февраля 2011

Эта строка вызовет конструктор и создаст объект с difficultLvl = 0;

MainGame m2 = new MainGame(this);

И после того, как вы вызовете

m2.setDifficulty(jComboBox1.getSelectedIndex());

, тогда difficultLvl из m2будет установлен на выбранный индекс.

1 голос
/ 03 февраля 2011

Я вижу пару проблем.

Первый Вы уверены, что хотите создать экземпляр MainGame в классе Setter? Это подкласс Game или что-то другое? Если код правильный, difficultLvl' in MainGame has nothing to do with Трудный уровень in Игра` - оба являются разными классами.

Второй Если вы хотите уровень сложности для игры, либо сделайте это с конструктором:

 public Game(int difficultyLevel) {
   this.difficultyLvl = difficultyLevel;
 }

или с помощью метода setter, но затем вы устанавливаете значение после создания объекта и, поскольку мы все не можем смотреть в будущее, вы не увидите ничего, кроме начального значения с вашим фактическим код.

1 голос
/ 03 февраля 2011

Это потому, что вы сначала создаете объект MainGame, а System.out.println находится в конструкторе.Затем вы вызываете сеттер, чтобы изменить значение.Но Конструктор уже напечатал начальное значение (так как оно появилось первым).

Решение: Уровень сложности должен быть параметром Конструктора, чтобы это работало.

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

1 голос
/ 03 февраля 2011

Вы печатаете значение в конструкторе.В этот момент значение будет равно 0. Его только после вызова setDifficulty () значение устанавливается равным 2.

...