Java 类无法正确运行另一个类的方法

标签 java class user-interface

首先,我为这个糟糕的标题表示歉意。我很难描述这个错误。我有一个使用以下类制作的 GUI 应用程序:Click here to see my classes.我遇到了一个非常奇怪的问题,可以在 GUI 中访问类设置,但不能在 Lottery 中访问。在 GUI 中,我可以通过在 GUI 中创建的 Settings 对象调用方法,并且它可以工作。然而,当我从 Lottery 调用他们时,什么也没有返回或返回 0。 我已经在 Lottery 中创建了一个 Settings 对象。设置“设置”中的值后单击按钮时,我会运行下面的代码。

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 说该方法可以是私有(private)的,即使我明确地从上面的另一个类调用它。请参阅此处:It's hard to see but Public is highlighted saying it can be private

我通常很擅长发现错误,但这个问题困扰了我大约一周。任何事情都会有所帮助。如果有帮助的话,我还将把完整的 Lottery 和 Settings 类放在下面。请注意:“设置”中的局部变量已设置,并且可以在“设置”本身中访问。

彩票类别:

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 对象。” 这就是您的问题的原因。

您有多个设置类实例。这意味着您无法访问在不同实例上设置的字段。

当你写的时候 设置settings = new Settings(); 在 Lottery 类中,您正在创 build 置类的新实例。所以没有填充任何字段。

要解决此问题,您需要有一个集中的设置对象。仅在连接所有内容(GUI?)的类中创建一个 Settings 实例,并从该类进行写入/读取。您可以将 Settings 的一个实例从 GUI 传递到 Lottery 类,它将保留您指定的所有字段。

此外,您的 Settings 对象似乎缺少构造函数,而 Lottery.initialize() 方法中的内容应该位于(当前为空)构造函数中。您应该至少使用通用构造函数来初始化您的设置。

关于Java 类无法正确运行另一个类的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41943807/

相关文章:

java - JFrame 在图标化时监听 KeyEvent

java - 自动生成的静态变量,必须在构造函数中传递以进行对象实例化

java - 设置应用程序范围的 key 监听器

java - 扫描仪语法错误

python - 如何检查两个实例是否属于同一类 Python

c++ - 试图通过指针访问嵌套类的成员函数

java - 适用于 OS X、Linux 的更好的 JFileChooser 替代品?

r - 在 bash 脚本中运行时,使 R(统计包)等待键盘提示

c++ - GUI 声明性语言实现

java - 在 servlet 中访问 jSTL 变量