Javaでクッキークリッカーのクローンを作成して、Javaスキルを練習していますが、小さな問題があります。mainメソッドで宣言されている変数があります。 ActionListenerクラスからアクセスしたいものです。ActionListenerクラスのサンプルコードを次に示します。int変数(クリック、grandamaCostなど)とJTextFields(display、cpsDisplayなど)はすべてmainメソッドにあります。このコードが他のクラスで機能するように、mainメソッドの変数にどのようにアクセスできるのか疑問に思っています。ありがとうございます。
@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;
}
}
}
変数は 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
}
}
また、フィールドへのアクセスをより細かく制御するには、 getters and setters を使用できます。読んでください!
public class ActionClass {
{
private static int clicks;
@Override
public void actionPerformed(ActionEvent e) {
clicks++;
}
public static void setClicks(int c){
clicks = c;
}
public static int getClicks(){
return clicks;
}
}
public class AnyClass {
{
// now you have access to your clicks count .
int clicks = ActionClass.getClicks();
// set value of clicks
ActionClass.setClicks(0);
}
ここでは、まさにあなたが必要としているものの例を示します。このコードでは、actionPerformed
に追加したいものを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
}
}
}
フィールドとそのアクセサメソッドの使用。例 ここ 。
変数をメソッド変数ではなくパブリッククラス変数にする必要があります。これにより、変数のスコープと可視性が向上します。そのようです:
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;
}
}
}
このようにして、変数の設定をより細かく制御できます。
メインクラスインスタンス参照を別のクラスインスタンスに渡すか、コールバックを登録できます。最初の方法
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);
}
}
}