2017-01-30 18 views
1

まず、悪いタイトルをお詫び申し上げます。私はこのエラーを説明しようと努力しました。私は、次のクラスで作成しているGUIアプリケーションを持っています:Click here to see my classes.クラスの設定はGUIではアクセスできますが、宝くじではないという非常に奇妙な問題が発生しました。 GUIでは、GUIで作成したSettingsオブジェクトを通じてメソッドを呼び出すことができます。しかし、私がそれらを宝くじから呼び出すときは、何も返しません。 私はすでに宝くじに設定オブジェクトを作成しています。設定の値を設定した後、ボタンをクリックすると、以下のコードが実行されます。Javaクラスが別のクラスのメソッドを正しく実行していない

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を呼び出すと、正しく戻りますが、他のクラスは返されません。注:各クラス、個別の設定オブジェクトが作成されます。 もう1つの興味深いのは、私のIDEは、上記の別のクラスから明示的に呼び出すのにもかかわらず、メソッドがプライベートであると言います。これを参照してください:It's hard to see but Public is highlighted saying it can be private

私は通常、エラーを見つけるのがうまいですが、これは私に約1週間私を困らせました。何かが助けになるでしょう。それが役立つなら、私はまた、以下の完全な宝くじと設定のクラスを入れます。ちょうど注意:設定のローカル変数は既に設定されており、設定自体でアクセスできます。

宝くじクラス:

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; 
} 
+1

私は、あなたが設定しているものと読んでいるものの両方が、複数の設定オブジェクトを持っていると思います。私はあなたのデバッガのコードをステップ実行して、この値がどこに設定されているのか、なぜそれが期待したものではないのかを確認します。 –

+0

デバッガを使用します。コードをステップ実行します。単純なブレークポイントで十分であれば、入力と書式の量を調べる – efekctive

+0

コードで 'new Settings()'を検索してください。それは一度だけ起こるべきです。何度も@PeterLawreyが示唆するように、複数のオブジェクトがあります。一つは更新され、もう一つは更新されません。参考文献と、必要に応じて参照を渡す方法について学び、問題を解決します。私たちの助けが必要な場合は、有効な[mcve] - および**のコードを作成して投稿する必要があります。 –

答えて

1

"注:各クラス、個別の設定オブジェクトが作成されました" これは問題の原因です。

あなたはSettingクラスのインスタンスを複数持っています。つまり、別のインスタンスに設定されているフィールドにはアクセスできません。あなたは宝くじクラスで Setting settings = new Settings(); を書くとき

、あなたの設定クラスの新しいインスタンスを作成しています。したがって、フィールドのいずれも入力されません。

この問題を解決するには、集中化されたSettingsオブジェクトが必要です。すべてを(GUI?)接続し、そのクラスから書き込み/読み取りを行うクラスでは、設定のインスタンスを1つだけ作成します。その1つの設定のインスタンスをGUIからLotteryクラスに渡すことができ、割り当てられたすべてのフィールドが保持されます。

また、設定オブジェクトにはコンストラクタがありませんし、Lottery.initialize()メソッドにあるものは(現在は空の)コンストラクタにあるはずです。少なくとも一般的なコンストラクタで設定を初期化する必要があります。

+0

応答に感謝します。コンストラクタを持たない理由は、ボタンをクリックしたときに宝くじを作成する必要があるからです。でも、クラス全体で宝くじオブジェクトを利用できるようにする必要があります。これをどうやってやりますか? – nbreunig3

関連する問題