3

Java スキルを練習するために Java で Cookie クリッカーのクローンを作成していますが、小さな問題があります。ActionListener クラスからアクセスしたい main メソッドで宣言されている変数があります。ActionListener クラスのサンプル コードを次に示します。int 変数 (例: clicks、grandamaCost) と JTextFields (例: display、cpsDisplay) はすべてメイン メソッドにあります。このコードが他のクラスで機能するように、メイン メソッドの変数にどのようにアクセスできるのか疑問に思っていました。ありがとう!

@Override
public void actionPerformed(ActionEvent e) {
    JButton b = (JButton) e.getSource();
    button(b.getText());
}

public void button(String input) {
    switch (input) {
        case "Cookie":
            clicks++;
            display.setText("Cookies: " + clicks + "");
            cpsDisplay.setText("CPS: " + cps);
            break;
        case "Buy grandma":
            if (clicks >= grandmaCost) {
                grandmas++;
                clicks = clicks - grandmaCost;
                grandmaCost = (int) ((.15 * grandmaCost) + grandmaCost);
                cps++;
            }
            display.setText("Cookies: " + clicks + "");
            prices[0].setText("$" + grandmaCost);
            cpsDisplay.setText("CPS: " + cps);
            break;
        case "Buy monkey":
            if (clicks >= monkeyCost) {
                monkeys++;
                clicks = clicks - monkeyCost;
                monkeyCost = (int) ((.15 * monkeyCost) + monkeyCost);
                cps = cps + 2;
            }
            display.setText("Cookies: " + clicks + "");
            prices[1].setText("$" + monkeyCost);
            cpsDisplay.setText("CPS: " + cps);
            break;
        case "Buy Teemo":
            if (clicks >= teemoCost) {
                teemos++;
                clicks = clicks - teemoCost;
                teemoCost = (int) ((.15 * teemoCost) + teemoCost);
                cps = cps + 3;
            }
            display.setText("Cookies: " + clicks + "");
            prices[2].setText("$" + teemoCost);
            cpsDisplay.setText("CPS: " + cps);
            break;
    }
}

}

4

6 に答える 6

9

変数はfieldsである必要があります。

フィールドはクラスのメソッドの外で宣言され、通常はクラス宣言のすぐ下にあります。フィールドには、クラスのすべてのメソッドからアクセスできます。

また、ドット演算子を使用して、他のクラス (プライベートでない限り) からアクセスすることもできます。

  • フィールドが でマークされている場合static、そのクラス名を使用して参照されます。
  • フィールドが静的でない場合、そのクラスのオブジェクトを使用して参照されます。

    public class Man {
        public String name; //this is a field
        public static String gender = "Male"; //this is a static field

        public Man(String newName) {
            name = newName; //assigns the value of a field from within a method
        }
    }

そして別のクラス...

public class Main {
    public static void main(String[] args) {
        Man bob = new Man("Bob");
        System.out.println(bob.name); //referenced from object, prints Bob
        System.out.println(Man.gender); //referenced from class name, prints Male
    }
}

また、フィールドへのアクセスをより細かく制御するには、 getter と setterを使用できます。読んでください!

于 2013-10-17T00:54:01.843 に答える
1

ここでは、まさに必要なものの例を示します。このコードでは、追加したいものをactionPerformedasに設定するだけですstatic

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton; 

public class testJava implements ActionListener {

    protected static JButton b; // since this is static you can 
                                // now access it in other classes

    public static void main(String[] args) {



    }

    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub

        if(e.getSource() == b) {

            // do stuff here 

        }

    }

}
于 2013-10-17T03:52:37.903 に答える
0

メソッド変数の代わりに、変数を public クラス変数にする必要があります。これにより、変数のスコープと可視性が向上します。そのようです:

public class ActionClass {
{
    public string MyPublicVariable = "woot";

    @Override
    public void actionPerformed(ActionEvent e) {


        ...
    }
}

これを行うためのより一般的/推奨される方法は、変数を明示的にパブリックにする代わりにゲッター/セッターを使用することです。次のように、パブリック メソッドを介してプライベート変数にアクセスします。

public class ActionClass {
{
    @Override
    public void actionPerformed(ActionEvent e) {

        private string MyPublicVariable = "woot";

        public void setMyString(string newString){
            MyPublicVariable = newString;
        }

        public string getMyString(){
            return MyPublicVariable;
        }
    }
}

このようにして、変数の設定をより詳細に制御できます。

于 2013-10-17T00:58:46.210 に答える
0

メイン クラス インスタンス参照を別のクラス インスタンスに渡すか、コールバックを登録できます。最初の方法

Class MainClass {
  private int mValue;
  public void init() {
     AnotherClass cla = new AnotherClass(this); 
  }
  public void setValue(int value) {mValue = value;}
  public int getValue(){return mValue;}
}

Class AnotherClass {
  private MainClass mMain;
  public AnotherClass(MainClass ref) {
     mMain = ref;
  }

  public void controlValue() {
     if (mMain != null) {
        mMain.setValue(1);
        mMain.getValue();
     }
  }
}

2 番目の方法では、1. インターフェイスを宣言します。2. このインターフェイスをメイン クラスに実装します。3. この実装を別のクラスに登録します。4. 別のクラスで値を取得および設定します。

public interface ClassListener {
    public void setValue(int value);
    public int getValue();
}

public class MainClass implements ClassListener{

    private int mValue;

    public void registerListener() {
        AnotherClass cla = new AnotherClass();
        cla.registerListener(this);
    }

    @Override
    public void setValue(int value) {
        // TODO Auto-generated method stub
        mValue = value;
    }

    @Override
    public int getValue() {
        // TODO Auto-generated method stub
        return mValue;
    }
}

public class AnotherClass{

    private ClassListener mListener;

    public void registerListener(ClassListener listener) {
        mListener = listener;
    }

    public void controlValue() {
        if (mListener != null) {
            int value = mListener.getValue();
            mListener.setValue(++value);
        }
    }
}
于 2013-10-17T01:59:15.233 に答える
0

フィールドとそのアクセサ メソッドの使用。ここに例があります。

于 2013-10-17T00:54:17.047 に答える