这个问题已经在这里有一个答案:
- 如何从一个控制器类打开文件选择JavaFX的? 4个回答
我用.fxml档案我的应用程序的视图层。 每个FXML具有连接到它的控制器
<AnchorPane fx:controller="movielistjavafx.view.MainWindowController">
假设我有一台主机,它的控制器。 该mainFrame.fxml被加载到start(Stage)
-方法。
现在你想显示其连接到阶段/窗/无论文件选择。
对于这将是很好的让FXML控制器了解例如 primaryStage
。
有没有办法把它注入到控制器,还是在FXML知道在运行时哪个场景和舞台是属于?
唯一的想法我已经是存储在primaryStage一些静态的背景,但似乎不喜欢的方式那样对我。
不FXML但在FXML节点(对照组)(或在其控制器)知道他们属于哪个场景和舞台在运行时(被添加到场景之后)。
在控制器类,
...
@FXML private Label label;
...
// in some method block
Stage stageTheLabelBelongs = (Stage) label.getScene().getWindow();
或者您可以使用CDI事件得到初级阶段。 看博客条目FXML和JavaFX的搭载CDI与JBoss的焊接 。
强大的解决方案(可作为一个片断):以一个事件,然后拿到发射了事件控制。 使用控制来获取阶段:
@FXML
private void browseDirectory(ActionEvent event) {
Stage stage = Stage.class.cast(Control.class.cast(event.getSource()).getScene().getWindow());
DirectoryChooser directoryChooser = new DirectoryChooser();
File selectedDirectory = directoryChooser.showDialog(stage);
System.out.println(selectedDirectory.getAbsolutePath());
}
http://code.makery.ch/java/javafx-2-tutorial-part5
这里是一个很好的教程做与样品代码示例
Controller...
//Application class type variable
public MainApp mainApp;
public Stage stage;
.........
.........
/**
* Is called by the main application to give a reference back to itself.
*
* @param mainApp
*/
public void setMainApp(MainApp mainApp) {
this.mainApp = mainApp;
}
}
.....
.........
@FXML
public void initialize(){
stage=mainApp.getStage();
}
Application class....
class MainApp extends Application{
Stage stage;
...
...
@Override
public void start(Stage stage) {
this.stage=stage;
FXMLLoader loader = new
FXMLLoader(MainApp.class.getResource("view/PersonOverview.fxml"));
PersonOverviewController controller = loader.getController();
controller.setMainApp(this);
}
...
,,
public getStage()
{
return this.stage;
}
}