オーディオ ファイルを参照してサンプリングするための単純なコントロールを作成しています。ObjectProperty<File>
ファイルの再生を担当するボタンのいくつかのプロパティをバインドできるように、を使用したいと思います。
PlayButton.disableProperty.bind(this.BGMFile.isNull());
PlayButton.textProperty.bind(this.BGMFile.asString());
そのため、オーバーライドする必要があることが 3 つあり、そのうちの 2 つが正常に完了したため、ここには入りません。
3 つ目は asString メソッドです。
new SimpleObjectProperty<File>(this, "BGM File", null){
/*yadda yadda overrides*/
@Override public StringBinding asString(){
if (super.get() != null && super.get().exists())
return (StringBinding) Bindings.format(
super.get().getName(), this
);
else return (StringBinding) Bindings.format("[NONE]", this);
}
}
これは私には正しいと感じており、grepCode hereからコードをリッピングしましたが、FileChooser を使用してファイルを参照すると、使用するファイルをセットアップして選択し、SimpleProperty に設定して、ボタンのテキストはそのままです[なし]。
これは、ファイルを参照するためのコードです。
this.btnBrowseBGM.setOnAction((ActionEvent E) -> {
FileChooser FC = new FileChooser();
FC.getExtensionFilters().add(Filters.AudioExtensions());
FC.setTitle("Browse for Background Audio File");
File F = FC.showOpenDialog(this.getScene().getWindow());
if (F != null && F.exists()) try {
this.BGMFile.set(Files.copy(
F.toPath(),
Paths.get("Settings/Sound/", F.getName()),
StandardCopyOption.REPLACE_EXISTING
).toFile());
} catch(IOException ex) {
Methods.Exception(
"Unable to copy file to Settings Sound Directory.",
"Failed to copy Sound File", ex);
this.BGMFile.set(F);
} else this.BGMFile.set(null);
E.consume();
});
パスが存在しないため、私に怒鳴られますが(私は予想していました)、それでもBGMFile
プロパティをに設定する必要がありますF
。トグルボタンがアクティブになり、それを押すとサウンドファイルが再生されるため、そうであることがわかります。
では、ここで何が欠けている/間違っているのでしょうか?
編集:
私はアイデアを持っていると思います:私がオーバーライドするメソッドの1つはsetメソッドです:
@Override public void set(File newValue){
if (newValue != null && newValue.exists())
super.set(newValue);
else super.set(null);
}
set メソッドをオーバーライドすると、オーバーライドされたメソッドがトリガーされない可能性がありasString
ますか?