如何从控制器类打开JavaFX FileChooser?

我的问题是使用FileChooser所有示例都要求您传入一个阶段。 唯一的问题是我的UI是在fxml文件中定义的,该文件使用与主阶段分开的控制器类。

 @FXML protected void locateFile(ActionEvent event) { FileChooser chooser = new FileChooser(); chooser.setTitle("Open File"); chooser.showOpenDialog(???); } 

我该怎么办??? 使它工作? 就像我说的那样,我对控制器类中的任何阶段都没有任何引用,所以我该怎么办?

对于场景中的任何节点(例如,根节点;但是使用@FXML注入的任何节点都可以),

 chooser.showOpenDialog(node.getScene().getWindow()); 

您不必坚持在应用程序中创建的舞台,您可以:

 @FXML protected void locateFile(ActionEvent event) { FileChooser chooser = new FileChooser(); chooser.setTitle("Open File"); File file = chooser.showOpenDialog(new Stage()); } 

或者如果你想继续使用同一个舞台,那么你必须先将舞台传递给控制器​​:

  FXMLLoader loader = new FXMLLoader(getClass().getResource("yourFXMLDocument.fxml")); Parent root = (Parent)loader.load(); MyController myController = loader.getController(); myController.setStage(stage); 

并且您可以随时使用应用程序的主要阶段。

从菜单项

 public class SerialDecoderController implements Initializable { @FXML private MenuItem fileOpen; @Override public void initialize(URL url, ResourceBundle rb) { // TODO } public void fileOpen (ActionEvent event) { FileChooser fileChooser = new FileChooser(); fileChooser.setTitle("Open Resource File"); fileChooser.showOpenDialog(fileOpen.getParentPopup().getScene().getWindow()); } 

或者,什么对我有用:简单地把null

 @FXML private void onClick(ActionEvent event) { File file = fileChooser.showOpenDialog(null); if (file != null) { //TODO } }