JButton ArrayList在tick上没有正确更新?

时间:2015-06-30 02:58:07

标签: java swing jframe

我正在使用默认的JFrame gui进行粗略的空闲游戏(想想CookieClicker)。货币单位是“点击”,一旦获得足够的“点击”,玩家应该能够点击与他们可以购买的自动转换相对应的JButton。但是,只有最后一个'autoclicker'添加到自动链接器的ArrayList才能在正确的时间可用,如果单击它,则所有其他JButton都会使用其属性。如果可能的话,你能帮我解决问题吗?免责声明:可能是一堆故障排除。

这是我的主要课程: (我有额外的JButtons和AutoClickers注释掉,所以它按预期工作)

public class AutoClicker {
    private static String name;
    private static double cps;
    private static double cost;
    private static int numberOwned;

    public AutoClicker(String nameIn, double cpsIn, int costIn){
        name = nameIn;
        cps = cpsIn;
        cost = costIn;
        numberOwned = 0;
    }

    public String getName(){
        return name;
    }
    public double getCPS(){
        return cps;
    }
    public double getCost(){
        return cost;
    }
    public int getNumberOwned(){
        return numberOwned;
    }

    public void buy(){
        numberOwned++;
        cost*=1.174;
    }
}

这是我的AutoClicker类:​​

#include<stdlib.h>
#include<stdio.h>


//begin function
int main ()
{

//declare variables
int choice;
int number = 0;
int cubed;
int squared;

//menu and begin do while loop
do {


printf("***********************\n");
printf("--Main Menu---\n");
printf("***********************\n");
printf("1.Enter a number\n");
printf("2.Cube the number\n");
printf("3.Square the number\n");
printf("4.Display Even or Odd\n");
printf("5.Quit\n");

printf("Enter your choice:   ");
scanf("%i", &choice);

printf("Your current number is: %i \n", number);

//begin switch and functions
switch(choice){

 case 1: 
      printf("Enter a number\n");
      scanf("%i", &number);
break;

case 2:  

      if (number == 0)
      printf("You have not entered a number\n");
      else 
      cubed= number * number * number;
      printf("Your number cubed is: %i \n", cubed);
break;

case 3:
       if (number == 0)
       printf("You have not entered a number\n");
       else
       squared=  number * number;
       printf("Your number squared is: %i \n", squared);
break;
case 4:
      if (number == 0)
       printf("You have not entered a number\n");
       else if
      (number % 2 ==0)
      printf("Your number squared is even!\n");

      else 

      printf("Your number is odd!\n");

break;

case 5:
      printf("Goodbye!!!!\n");
system("pause");
break;

default:
      printf("Was not 1 through 5\n");
break;
}// end switch and functions








} while (choice!=5); 


} //end function

非常感谢! ^ _ ^

1 个答案:

答案 0 :(得分:5)

  1. 摆脱所有静态修饰符。特别是在AutoClicker类中。当这些字段是静态的时,它们将成为类的字段而不是对象,因此每个AutoClicker对象与所有其他字段共享相同的字段 - 而不是您想要的字段。
  2. 事实上,唯一应该是静态的东西应该是主要方法,就是这样。然后你可以改变这个:

    public static void main(String[] args){
        init();
        run();
    }
    

    到此:

    public static void main(String[] args){
        Main main = new Main();
        main.init();
        main.run();
    }
    

    另外

    • 您已经两次声明了cpst变量,一个是类的一个字段,另一个是render()方法的一个本地,最后一个是阴影类字段 - 你确定要这样做吗?
    • 如评论中所述,您正在主线程中的run()方法中调用代码。如果您的代码已正确启动,则会在Swing事件线程中调用它,并完全冻结您的程序。如果你更正了这个并将Runnable放在一个Thread中并在其上调用了start(),那么现在你要在后台线程中改变Swing组件 - 所有危险的事情都要做。请阅读:课程:Swing中的并发以了解如何解决此问题。