2012-08-13 91 views
1

我想在javaFX 2中創建一個應用程序,該應用程序以較小的登錄窗口打開,然後,當您輸入正確的數據時,它會將您帶到較大的主窗口。兩者都是在fxml中設計的,事件在Java代碼中處理。JavaFX全局場景變量意外地更改爲空

是的,我知道,它幾乎與樣本中的應用程序相同,我試圖做我想做的事情,它在那裏工作。

現在,當我在我的項目中做同樣的事情時,當我想要改變舞臺的價值時,我遇到了一個問題。

正如你可以在下面的代碼中看到的,我有全局變量,並且我在start方法中設置了primaryStage的值。就像測試一樣,我在啓動方法結束時將其打印出來,並設置值。

然後,當我點擊按鈕時嘗試使用它(方法buttonClick),stage變量的值爲null,因此我不能用它來調整窗口大小或其他任何東西。

我的問題是爲什麼階段變量值重設,儘管我不使用兩個打印之間的任何改變?

此代碼是我嘗試過的示例,我剛剛刪除了所有代碼,這些代碼對於理解我的應用程序如何工作並不重要。

public class App extends Application { 

    private Stage stage; 
    @FXML 
    private AnchorPane pane; 

    @Override 
    public void start(Stage primaryStage) { 
     try { 
      stage = primaryStage; // Set the value of primaryStage to stage 
      primaryStage.setScene(new Scene(openScene("Login"))); // Load Login window 
      primaryStage.show(); // Show the scene 
     } catch (IOException ex) { 
      Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     System.out.println(stage);// <-- Here it has the value of primaryStage obviously 
    } 

    @FXML 
    void buttonClick(ActionEvent event) throws IOException { 
    // Note that even if I try to print here, the value of stage is still 
    // null, so the code doesn't affect it 
    // Also, this loads what I want, I just can't change the size. 
     try{ 
      pane.getChildren().clear(); // Clear currently displayed content 
      pane.getChildren().add(openScene("MainScene")); // Display new content 
      System.out.println(stage); // <-- Here, output is null, but I don't know why 
      stage.setWidth(500); // This line throws error because stage = null 
     } catch (IOException ex) { 
      Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex); 
     } 

    } 

    public Parent openScene(String name) throws IOException { 
     //Code from FXML login example 
     Parent parent = (Parent) FXMLLoader.load(PrijavnoOkno.class.getResource(name 
       + ".fxml"), null, new JavaFXBuilderFactory()); 
     return parent; 
    } 

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

回答

2

雖然它不是由誰明確,其中buttonClick動作方法被調用時,我pressume它是Login.fxml登錄按鈕的動作。此外,我還假設您已將App(又名PrijavnoOkno)定義爲此Login.fxml的控制器。
根據這些假設,有App.class的2個實例:
一個時,應用程序啓動,並且其中所述階段變量在start()方法分配有初級階段創建,
和由FXMLLoader創建的另一個實例(而加載Login.fxml)以及舞臺變量未分配的位置,從而NPE。
其中一種正確的方法是,爲Login.fxml創建一個新的Controller類,在其中調用您的登錄動作。從那裏訪問全球舞臺(通過在App中使其變爲靜態)。

+0

謝謝你的回答。我並沒有真正想到這一點。和這個類被稱爲PrijavnoOkno,然後我改變了應用(PrijavnoOkno意味着登錄窗口,如果你從slovene:D翻譯它)。但是我沒有想到讓實例能夠做到這一點,這可能是我在尋找的東西,當我回家的時候我必須對它進行測試。我會在一小時內彙報,再次感謝。 – 2012-08-13 14:15:29

+0

工作,謝謝你的建議。我想我應該在進入編碼之前看過一些教程。我現在已經研究了一些關於控制器的例子,現在一切似乎都更加清晰。再次感謝您的回答。 (也對不起雙重職位) – 2012-08-13 16:14:37