2

再会!

我创建了两个类,即设置和游戏;在我的游戏中,首先访问设置类。

在我的设置类中,我从 Game 中调用 setter 方法.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());
        }           

然后我访问我的第二个 CLass,即游戏。但是我无法在 setter 方法之外获得 hardLvl 的值。(请参阅我对代码的评论)

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

问题是我无法访问 setter 类之外的 hardLvl 值......它返回到它的默认分配值,在这种情况下为 0。我做错了什么?如何访问 setter 方法中的值。我用过this.difficultLvl但没有结果。我是java新手...请帮忙!您的帮助将不胜感激。谢谢你。

4

7 回答 7

3

在游戏的构造函数中,'difficultLvl' 成员将为零,因为这就是它的初始化值 - 没有理由期望它为 2。一旦构造,您使用 setter 方法将值设置为 2;从那时起,该值将是 2,直到设置为其他值。

如果要添加 getter 方法:

public int getDifficulty() {
    return difficultLvl;
}

并调用它你会看到价值。

我怀疑您不想在每次鼠标单击时构建一个新游戏,而是保留一个并在鼠标单击时调用 setter 方法:

   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());
    }   
于 2011-02-03T09:12:31.477 回答
2

difficultLvl是一个实例变量,所以它对每个实例都有一个值。每次创建 的新实例时Game,它都有自己的diffucultLvl初始化为0。如果您设置difficultLvlin one 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()但它具有默认难度,即在构造函数中打印的内容。接下来,您设置它的难度级别(如果您在此之后打印难度,它将是正确的)。然后游戏被扔掉:它超出了范围 - 它只是一个局部变量。

于 2011-02-03T09:11:55.103 回答
1

此行将调用构造函数并创建一个difficultLvl= 0;的对象。

MainGame m2 = new MainGame(this);

在你打电话后

m2.setDifficulty(jComboBox1.getSelectedIndex());

然后 difficultLvlofm2将设置为选定的索引。

于 2011-02-03T09:39:52.337 回答
1

您正在打印构造函数中的值。此时该值将为 0。只有在调用 setDifficulty() 之后,该值才设置为 2。

于 2011-02-03T09:11:40.710 回答
1

这是因为您首先创建了 MainGame 对象,而 System.out.println 在构造函数中。然后你调用 setter 来改变值。但是构造函数已经打印了初始值(因为它首先出现)。

解决方案:难度级别需要是构造函数的参数才能工作。

使用调试器并仔细查看。这是一个非常基本的事情,因此充分了解这里发生的事情很重要。

于 2011-02-03T09:15:33.907 回答
1

我看到了几个问题。

首先,您确定要MainGameSetter课堂上实例化吗?它是子类Game还是不同的东西?如果代码正确,difficultLvl' inMainGame has nothing to do withhardLvl inGame` - 两者都是不同的类。

其次,如果您想要游戏的难度级别,请使用构造函数进行:

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

或者使用 setter 方法,但是您在创建对象设置值,因为我们都无法展望未来,您只会看到实际代码的初始值。

于 2011-02-03T09:18:12.863 回答
1

您似乎在鼠标单击操作处理程序中创建了 MainGame 的一个实例,一旦方法调用完成,该处理程序又会立即收集垃圾。因此,由于收集了包含它的对象,因此您的值 (=2) 丢失了。因此,在另一次单击时,您将创建一个具有值 (=0) 的新实例,因为您将其初始化为 0。

私人 int 难度 Lvl = 0;

我不太了解你想要做什么,但似乎你想在你的应用程序的某个地方保持一个指向游戏对象的句柄。

于 2011-02-03T12:08:05.433 回答