ejemplo - javafx save file to directory
¿Cómo abro el JavaFX FileChooser desde una clase de controlador? (4)
Mi problema es que todos los ejemplos de usar FileChooser
requieren que pase en una etapa. El único problema es que mi UI está definida en un archivo fxml
, que usa una clase de controlador separada de la etapa principal.
@FXML protected void locateFile(ActionEvent event) {
FileChooser chooser = new FileChooser();
chooser.setTitle("Open File");
chooser.showOpenDialog(???);
}
¿Qué pongo en el ???
para que funcione? Como dije, no tengo ninguna referencia a ninguna etapa en la clase de controlador, entonces ¿qué debo hacer?
Alternativamente, lo que funcionó para mí: simplemente ponga null
.
@FXML
private void onClick(ActionEvent event) {
File file = fileChooser.showOpenDialog(null);
if (file != null) {
//TODO
}
}
De un elemento de menú
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());
}
No tiene que seguir con el escenario creado en la aplicación, puede:
@FXML protected void locateFile(ActionEvent event) {
FileChooser chooser = new FileChooser();
chooser.setTitle("Open File");
File file = chooser.showOpenDialog(new Stage());
}
O si desea seguir usando el mismo escenario, debe pasar el escenario al controlador antes de:
FXMLLoader loader = new FXMLLoader(getClass().getResource("yourFXMLDocument.fxml"));
Parent root = (Parent)loader.load();
MyController myController = loader.getController();
myController.setStage(stage);
y tendrá la etapa principal de la aplicación allí para ser utilizada como lo desee.
Para cualquier nodo en su escena (por ejemplo, el nodo raíz, pero cualquier nodo que haya inyectado con @FXML
lo hará), haga
chooser.showOpenDialog(node.getScene().getWindow());