2014-09-28 96 views
-1

JAVAFX新手,所以这可能是一个简单的修复,但我有我的应用程序设置使用FXML文件中的控制器。我引用控制器通过FXML文件中使用并加载我使用下面的代码在我的应用程序类从控制器设置参考应用程序?

private void replaceScene(String resource) { 
    try { 
     FXMLLoader loader = new FXMLLoader(getClass().getResource(resource)); 

     Pane screen = (Pane) loader.load(); 
     Scene scene = new Scene(screen); 
     scene.getStylesheets().addAll(getClass().getResource("/css/application.css").toExternalForm()); 
     stage.setScene(scene); 
     stage.sizeToScene(); 

     IControlledScreen controller = (IControlledScreen) loader.getController(); 
     controller.setApp(this); 
    } catch (Exception e) { 
     System.out.println("Cannot load resource " + resource); 
     System.out.println(e.getMessage()); 
    } 
} 

而且这里的文件是一个基本的控制器

public class MyController implements IControlledScreen { 

    MyApplication app; 

    public void setApp(MyApplication application) { 
     app = application; 
    } 


    @FXML 
    public Button btnStart; 

    // Initialises the controller class. 
    @FXML 
    protected void initialize() { 
     btnStart.setOnAction(new EventHandler<ActionEvent>() { 

      @Override 
      public void handle(ActionEvent arg0) { 
       // code here 
      } 

     }); 
    } 

} 

我也有一个接口所谓IControlledScreen到基准设定为应用

public interface IControlledScreen { 

    // ALlows us a reference to the application 
    public void setApp(MyApplication app); 

} 

现在,这一切工作正常,直到我尝试初始化事件过程中访问应用程序变量。所以现在改变上面的控制器,因为app = NULL。

public class MyController implements IControlledScreen { 

    MyApplication app; 

    public void setApp(MyApplication application) { 
     app = application; 
    } 


    @FXML 
    public Button btnStart; 

    // Initialises the controller class. 
    @FXML 
    protected void initialize() { 
     // HERE app = NULL 
     app.GetSomeProperty = ""; 
    } 

} 

我该如何解决这个问题?

回答

0

嗯,我认为你必须改变你的设计。 initialize方法FXMLLoader.load过程称为() 所以调用堆栈将类似于

..replaceScene 
..loader.load 
....MyController.initialize() 
..loader.getController 
..controller.setApp(app) 

如果你真的需要从你的控制器中,你需要使它成为一个单身访问应用程序。

+0

我同意这是一个糟糕的设计:由FXML控制器对代表的组件不应该耦合到使用它们的应用程序类。但是,如果您确实想要这样做,那么通常也可以避免在'initialize()'方法中引用'app'引用,并在'setApp(...)'方法中初始化依赖它的任何东西。这将避免必须让你的应用程序类成为单例。 – 2014-09-29 16:45:42

相关问题