Как открыть JavaFX FileChooser из класса контроллера?
моя проблема в том, что все примеры использования FileChooser
требует, чтобы вы прошли этап. Единственная проблема заключается в том, что мой UI определен в fxml
файл, который использует класс контроллера, отдельный от основного этапа.
@FXML protected void locateFile(ActionEvent event) {
FileChooser chooser = new FileChooser();
chooser.setTitle("Open File");
chooser.showOpenDialog(???);
}
что мне поставить на ???
чтобы заставить его работать? Как я уже сказал, У меня нет ссылок на какие-либо этапы в классе controller, так что мне делать?
4 ответов
для любого узла в вашей сцене (например, корневой узел; но любой узел, который вы ввели с @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
}
}