首先,我为这个不好的头衔表示歉意。我很难描述这个错误。我有一个使用以下类制作的GUI应用程序:Click here to see my classes.我遇到了一个非常奇怪的问题,其中可以在GUI中访问类设置,但不能在Lottery中访问。在GUI中,我可以通过在GUI中创建的Settings对象调用方法,并且该方法可以正常工作。但是,当我从彩票中致电给他们时,则不返回任何内容或返回0。
我已经在彩票中创建了一个设置对象。在设置“设置”中的值后单击按钮时,我在下面运行此代码。
public void initialize(){
teams = settings.getTeams();
pick = settings.getNumberOfTeams();
//Returns nothing ^
//teams and pick is a local varible
}
即使我设置了上述变量,它们也不算什么。而且我知道它们已经设置好了,因为如果我从Settings类中调用getTeams(),它将在下面返回正确的值。
public void addTeam(String name, String wins, String losses){
teams.add(new Team(name, wins, losses));
System.out.println(teams.size() - 1 + " " + teams.get(teams.size() - 1));
System.out.println("Number of teams (SETTINGS): " + getNumberOfTeams());
}
然而,当从彩票中召集时,它什么也没有保留。但是,当我从GUI调用“设置”时,确实会正确返回,但不会返回任何其他类。注意:每个类都会创建一个单独的Settings对象。
另一个有趣的事情是我的IDE表示该方法可以是私有的,即使我从上面的另一个类中清楚地调用了该方法。在这里看到:It's hard to see but Public is highlighted saying it can be private
我通常善于发现错误,但是这个错误使我难堪了大约一个星期。一切都会有帮助的。如果有帮助,我还将在下面放置完整的彩票和设置类。请注意:“设置”中的局部变量已设置,可以在“设置”本身中进行访问。
彩票类:
public class Lottery {
Settings settings = new Settings();
private Random rand = new Random();
private int randNum;
private int pick;
private ArrayList<Team> draftOrder = new ArrayList<Team>(0);
private ArrayList<Team> teams = new ArrayList<Team>(0);
private boolean lotteryDone;
public Lottery(){}
public void initialize(){
teams = settings.getTeams();
System.out.println("Lottery team size: " + teams.size());
pick = settings.getNumberOfTeams();
System.out.println("Number of Teams (From lottery): " + pick);
System.out.println("Number of teams (LOTTO): " + pick);
System.out.println("Test..." + settings.getDraftRounds());
teams.add(settings.getTeam(1));
System.out.println("Other method test: " + teams.get(0));
}
public void setDraftOrder(){
while (teams.size() > 0){
randNum = rand.nextInt(teams.size() - 1);
System.out.println(randNum);
draftOrder.add(teams.remove(randNum));
System.out.println(draftOrder.get(0));
}
}
public void getNextPick(){
if (pick > 0){
randNum = rand.nextInt(teams.size() - 1);
draftOrder.add(pick, teams.remove(randNum));
pick -= 1;
}
}
public int getPickNumber(){
return pick;
}
public Team getCurrentPick(int i){
return draftOrder.get(i);
}
public ArrayList<Team> getDraftOrder(){
return draftOrder;
}
public boolean lotteryDone(){
if (lotteryDone){
return true;
}else{
return false;
}
}
设置类别:
public class Settings {
private ArrayList<Team> teams = new ArrayList<Team>(0);
private Boolean skipLottery;
private Boolean autoSelectPick;
private int autoSelectPickTimer;
private int totalMoney;
private int yellowOverlay;
private int draftRounds;
private int draftPickTimer;
private int draftTickTimer;
private int currentRound;
private int currentPick;
private boolean lotteryInitialized;
private boolean draftInitialized;
private boolean auctionInitialized;
public void addTeam(String name, String wins, String losses){
teams.add(new Team(name, wins, losses));
System.out.println(teams.size() - 1 + " " + teams.get(teams.size() - 1));
System.out.println("Number of teams (SETTINGS): " + getNumberOfTeams());
}
public boolean settingsDone(){
if (teams.size() != 0 && totalMoney != 0 && yellowOverlay != 0 && draftRounds != 0 && draftPickTimer != 0 && draftTickTimer != 0){
return true;
}else{
return false;
}
}
public void clearSettings(){
teams.clear();
skipLottery = false;
autoSelectPick = false;
autoSelectPickTimer = 0;
totalMoney = 0;
yellowOverlay = 0;
draftRounds = 0;
draftPickTimer = 0;
draftTickTimer = 0;
currentRound = 0;
currentPick = 0;
lotteryInitialized = false;
draftInitialized = false;
auctionInitialized = false;
}
public void setSkipLottery(boolean i){
skipLottery = i;
}
public boolean getSkipLottery(){
return skipLottery;
}
public void setAutoSelectPick(boolean i){
autoSelectPick = i;
}
public boolean getAutoSelectPick(){
return autoSelectPick;
}
public void setAutoSelectPickTimer(int i){
autoSelectPickTimer = i;
}
public int getAutoSelectPickTimer(){
return autoSelectPickTimer;
}
public void setTotalMoney(int i){
totalMoney = i;
}
public int getTotalMoney(){
return totalMoney;
}
public void setYellowOverlay(int i){
yellowOverlay = i;
}
public int getYellowOverlay(){
return yellowOverlay;
}
public void setDraftRounds(int i){
draftRounds = i;
}
public int getDraftRounds(){
return draftRounds;
}
public void setDraftPickTimer(int i){
draftPickTimer = i;
}
public void setDraftTickTimer(int i){
draftTickTimer = i;
}
public ArrayList<Team> getTeams(){
return teams;
}
public Team getTeam(int index){
return teams.get(index);
}
public int getNumberOfTeams(){
return teams.size();
}
public int getDraftPickTimer(){
return draftPickTimer;
}
public int getDraftTickTimer(){
return draftTickTimer;
}
public void setLotteryInitialized(boolean i){
lotteryInitialized = i;
}
public boolean getLotteryInitialized(){
return lotteryInitialized;
}
public void setDraftInitialized(boolean i){
draftInitialized = i;
}
public boolean getDraftInitialized(){
return draftInitialized;
}
public void setAuctionInitialized(boolean i){
auctionInitialized = i;
}
public boolean getAuctionInitialized(){
return auctionInitialized;
}
最佳答案
“注意:每个类都会创建一个单独的Settings对象。”
这是造成您问题的原因。
您有Setting类的多个实例。这意味着您无法访问在其他实例上设置的字段。
当你写Setting settings = new Settings();
在“彩票”类中,您正在创建设置类的新实例。因此,没有任何字段被填充。
要解决此问题,您需要一个集中的Settings对象。在连接所有内容的类(GUI?)中仅创建一个Settings实例,并从该类中进行写入/读取。您可以将该设置的一个实例从GUI传递给Lottery类,它将保留所有分配的字段。
另外,似乎您的Settings对象缺少构造函数,并且Lottery.initialize()方法中的内容应该位于(当前为空)构造函数中。您应该至少使用通用构造函数初始化设置。