如何从控制器类打开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 } }