Ответ 1
Для любого node в вашей сцене (например, root node, но любой node, который вы ввели с помощью @FXML
), сделайте
chooser.showOpenDialog(node.getScene().getWindow());
Моя проблема в том, что для всех примеров использования FileChooser
требуется пройти этап. Единственная проблема заключается в том, что мой пользовательский интерфейс определен в файле fxml
, который использует класс контроллера отдельно от основного этапа.
@FXML protected void locateFile(ActionEvent event) {
FileChooser chooser = new FileChooser();
chooser.setTitle("Open File");
chooser.showOpenDialog(???);
}
Что я делаю в ???
, чтобы он работал? Как я уже сказал, у меня нет ссылок на какие-либо этапы в классе контроллера, так что мне делать?
Для любого node в вашей сцене (например, root node, но любой node, который вы ввели с помощью @FXML
), сделайте
chooser.showOpenDialog(node.getScene().getWindow());
Вам не нужно придерживаться Stage, созданного в приложении, вы можете:
@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());
}