2012-08-13 45 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