Java геттер и сеттер проблема

Добрый день!

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

В моем классе настроек я вызываю метод установки из 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());
        }           

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

     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...
        }

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


person newbie    schedule 03.02.2011    source источник
comment
вы устанавливаете difficultLvl в `MainGame` и получаете его в Game, так как это могло быть возможным.   -  person Harry Joy    schedule 03.02.2011
comment
так что я должен сделать, чтобы получить значение из одного класса в другой?   -  person newbie    schedule 03.02.2011


Ответы (7)


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

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

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

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

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

person Andreas Dolk    schedule 03.02.2011

В конструкторе игры элемент 'difficultLvl' будет равен нулю, так как именно для этого он инициализирован - нет причин ожидать, что он будет равен 2. После создания вы используете метод установки, чтобы установить значение 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());
    }   
person John Pickup    schedule 03.02.2011
comment
я создал метод получения в игре, но я все еще не могу получить доступ к значению - person newbie; 03.02.2011
comment
Я предполагаю, что причина, по которой вы не можете получить к ней доступ, заключается в том, что вы создаете игру внутри обработчика щелчка мыши - затем экземпляр игры выходит за рамки и уничтожается после завершения обработки щелчка мыши. Поэтому вам необходимо создать игровой объект таким образом, чтобы он имел более длительный срок жизни, чтобы он существовал дольше, чем щелчок мышью. Я предложил это в своем первоначальном ответе выше. - person John Pickup; 03.02.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(), но она имеет сложность по умолчанию, которая печатается в конструкторе. Далее вы устанавливаете его уровень сложности (если после этого вы напечатаете сложность, она будет правильной). Тогда игра выбрасывается: она выходит за рамки — это была всего лишь локальная переменная.

person Bert F    schedule 03.02.2011
comment
так как я могу получить доступ к переменной из другого класса без ее инициализации? - person newbie; 03.02.2011

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

person bobby    schedule 03.02.2011

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

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

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

person Oliver    schedule 03.02.2011

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

MainGame m2 = new MainGame(this);

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

m2.setDifficulty(jComboBox1.getSelectedIndex());

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

person Phil    schedule 03.02.2011

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

частный интервал трудныйLvl = 0;

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

person Timmo    schedule 03.02.2011