私の問題は、FileChooser
を使用するすべての例で、ステージを渡す必要があることです。唯一の問題は、メインのステージとは別のコントローラークラスを使用するfxml
ファイルでUIが定義されていることです。
@FXML protected void locateFile(ActionEvent event) {
FileChooser chooser = new FileChooser();
chooser.setTitle("Open File");
chooser.showOpenDialog(???);
}
???
に何を置いて機能させるのですか?先ほど言ったように、コントローラークラスのどのステージも参照していないので、どうすればよいですか?
シーン内の任意のノード(たとえば、ルートノード。ただし、@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
}
}