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?
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());
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.
À 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());
}
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
}
}