2017-04-09 54 views
0

我的主類稱爲MainClass,它有在它下面的代碼:值在父類沒有改變

Startup startup = new Startup(); 
while (!startup.isDoneWelcoming()){ 
    System.out.print("Waiting for welcoming to finish."+br); 
    try{Thread.sleep(5000);}catch(Exception waitEx){System.out.print(waitEx+br);} 
} 

而且它會檢查從另一個類稱爲Startup具有此代碼值:

private boolean doneWelcoming=false; 

void openWelcomeScreen(){ 
//irrelevant code... 

//a welcome screen is displayed and when "get started" button is pressed 
//it opens a new window from the Tutorial class 
WelcomeScreen welcomeScreen = new WelcomeScreen(); 
welcomeScreen.openWelcomeScreen(); 

//irrelevant code... 
} 

void setWelcomeStatus(){ 
    System.out.print("Boolean \"doneWelcoming\" is true."+br); 
    doneWelcoming=true; 
} 

public boolean isDoneWelcoming(){ 
    System.out.print("Boolean \"doneWelcoming\" value returned as: "+doneWelcoming+br); 
    return doneWelcoming; 
} 

WelcomeScreenextendsStartup和具有這個代碼發起內的方法類:

void createTutorialWindow(){ 
    //ActionListener detects when the button is pressed and it does this... 
    Tutorial startTutorial = new Tutorial(); 
    startTutorial.createTutorialWindow(); 
} 

setWelcomeStatus方法是從稱爲Tutorial其中extendsStartup另一個類調用。在那裏,我有一個按鈕,當它按下時它這樣做:

setWelcomeStatus();

我的問題是,我看到這在我的控制檯:

等待歡迎來完成。
點擊按鈕。將返回歡迎過程完成。
布爾「doneWelcoming」是真實的。
布爾「doneWelcoming」返回值如下:假

這意味着doneWelcoming的價值確實變化,但它不會返回true原班等我的循環永遠不會停止。我應該改變什麼來解決這個問題?

編輯:在Startup和類本身中都添加了WelcomeScreen類的代碼。
注意:很明顯,涉及很多類的實例,所以它變得有點複雜。感謝您的幫助。

+1

嘗試在'doneWelcoming'聲明中的'private boolean'之前添加'volatile'。看起來你有一個併發問題。 – RealSkeptic

+2

東西聞起來很腥。你的第一個代碼位創建一個新的Startup對象,然而你有另一個擴展Startup的類,你改變這個第二類的狀態,然後期望你上面的原始啓動實例改變狀態。這不是Java繼承的工作原理,對我來說,看起來你錯誤地使用了繼承。 @RealSkeptic:想法? –

+1

請發佈一個有效的[SSCCE](http://SSCCE.org)作爲代碼格式的文本,以便我們可以看到自己正在做什麼以及它爲什麼不起作用。 –

回答

-1

在閱讀@Hovercraft完整的鰻魚的評論後,我發現問題在於我的繼承,他說得對。我刪除從我的兩個班extendsWelcomeScreenTutorial然後做成小方法從一個類,而使用單一實例爲每個類,返回值到另一個像這樣: 在Startup我所做的:

private WelcomeScreen welcomeScreen = new WelcomeScreen(); 
public boolean isDoneWelcoming(){ 
    System.out.print("Boolean \"doneWelcoming\" value returned as: "+doneWelcoming+br); 
    return welcomeScreen.returnToStartup(); 
} 

WelcomeScreen我說:

private Tutorial startTutorial = new Tutorial(); 
boolean returnToStartup(){ 
    return startTutorial.returnToWelcome(); 
} 

Tutorial我說:

buttonClicked=false; 
button.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      buttonClicked = true; 
     } 
}); 
//and as a separate boolean 
boolean returnToWelcome() { 
    while (!letsgoClicked) { 
     return false; 
    } 
    return true; 
} 
+1

啊,這是一個Swing程序。我最後一次評論說你忙於while循環是糟糕的。不要這樣做。使用諸如ChangeListener或PropertyChangeListener之類的監聽器可以讓您使用Swing庫進行編碼,而不是針對它。 –