it-swarm.com.ru

Как открыть JavaFX FileChooser из класса контроллера?

Моя проблема в том, что все примеры использования FileChooser требуют, чтобы вы прошли этап. Единственная проблема заключается в том, что мой пользовательский интерфейс определен в файле fxml, который использует класс контроллера, отдельный от основного этапа.

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

Что я должен поставить на ???, чтобы он заработал? Как я уже сказал, у меня нет ссылок на какие-либо этапы в классе контроллера, так что мне делать?

25
Electric Coffee

Для любого узла в вашей сцене (например, корневого узла; но любой узел, который вы добавили с помощью @FXML, подойдет), выполните

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

Вам не нужно придерживаться этапа, созданного в приложении, вы также можете:

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

и у вас будет основная стадия Приложения, которую вы сможете использовать по своему усмотрению.

15
Mansueli

Из пункта меню

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

Кроме того, что сработало для меня: просто введите null.

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