web-dev-qa-db-fra.com

Comment ouvrir le FileChooser JavaFX à partir d'une classe de contrôleur?

Mon problème est que tous les exemples d'utilisation de FileChooser nécessitent que vous passiez dans une étape. Le seul problème est que mon interface utilisateur est définie dans un fichier fxml, qui utilise une classe de contrôleur distincte de la scène principale.

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

Qu'est-ce que je mets au ??? pour le faire fonctionner? Comme je l'ai dit, je n'ai aucune référence à aucune étape de la classe de contrôleur, alors que dois-je faire?

25
Electric Coffee

Pour tout nœud de votre scène (par exemple, le nœud racine; mais tout nœud que vous avez injecté avec @FXML fera l'affaire), faites

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

Vous n'êtes pas obligé de vous en tenir à la scène créée dans l'application, vous pouvez soit:

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

Ou si vous souhaitez continuer à utiliser la même étape, vous devez la passer au contrôleur avant:

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

et vous aurez la phase principale de l'application à utiliser à votre guise.

15
Mansueli

À partir d'un élément de menu

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());

}
2
spinnaker15136

Autrement, ce qui a fonctionné pour moi: mettez simplement null.

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