2

良い一日!

設定とゲームの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());
        }           

次に、ゲームである2番目のCLassにアクセスします。しかし、setterメソッドの外でdifferfulLvlの値を取得することはできません。(コードに関する私のコメントを参照してください)

     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クラスの外部でdifferfulLvl値にアクセスできないことです...デフォルトの割り当て値(この場合は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ます。difficultLvlを1つに設定する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

コンストラクターで値を出力しています。その時点で、値は0になります。setDifficulty()が呼び出された後でのみ、値が2に設定されます。

于 2011-02-03T09:11:40.710 に答える
1

これは、最初にMainGameオブジェクトを作成していて、System.out.printlnがコンストラクターにあるためです。次に、セッターを呼び出して値を変更します。しかし、コンストラクターはすでに初期値を出力しています(最初に来たため)。

解決策:これが機能するには、differityLevelがコンストラクターのパラメーターである必要があります。

デバッガーを使用して、詳しく調べてください。これは非常に基本的なことなので、ここで何が起こっているのかを完全に理解することが重要です。

于 2011-02-03T09:15:33.907 に答える
1

いくつかの問題があります。

まずMainGameSetterクラスでインスタンス化してよろしいですか?それはのサブクラスですか、Gameそれとも何か違うものですか?コードが正しければ、MainGamehardLvlGame`-difficultLvl' inどちらも異なるクラスです。has nothing to do within

次に、ゲームの難易度が必要な場合は、コンストラクターを使用して実行します。

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

またはsetterメソッドを使用しますが、オブジェクトの作成に値を設定します。将来を見通すことができないため、実際のコードでは初期値しか表示されません。

于 2011-02-03T09:18:12.863 に答える
1

difficultLvlこの行はコンストラクターを呼び出し、 =0でオブジェクトを作成します。

MainGame m2 = new MainGame(this);

そして、あなたが電話した後

m2.setDifficulty(jComboBox1.getSelectedIndex());

次に difficultLvl、ofm2が選択したインデックスに設定されます。

于 2011-02-03T09:39:52.337 に答える
1

マウスクリックアクションハンドラーでMainGameのインスタンスを作成しているようです。このインスタンスは、メソッドの呼び出しが終了するとすぐにガベージコレクションを取得します。したがって、値(= 2)は、それを含むオブジェクトが収集されるため失われます。したがって、もう一度クリックすると、uが0で初期化されるため、値(= 0)を持つ新しいインスタンスが作成されます。

private int hardLvl = 0;

何をしたいのかよくわかりませんが、アプリのどこかにあるゲームオブジェクトを指すハンドルを保持したいようです。

于 2011-02-03T12:08:05.433 に答える