背景:私は今mp3プログラムにファイルをロードして再生できますが、テーブルビューのすべての値はnullですか? JavaFXテーブルビューに文字列値を設定する方法
マイ歌クラス
package application;
//imports here
public class Song {
private String title;
private String artist;
private String album;
private SimpleStringProperty pTitle;
private SimpleStringProperty pArtist;
private SimpleStringProperty pAlbum;
private Media music;
private MediaPlayer mp;
private Image coverArt;
public Song(File file) {
music = new Media(file.toURI().toString());
music.getMetadata().addListener((Change<? extends String, ? extends Object> c) -> {
if (c.wasAdded()) {
if ("artist".equals(c.getKey())) {
System.out.println(c.getKey()+":"+c.getValueAdded());
this.pArtist = new SimpleStringProperty(c.getValueAdded().toString());
//pArtist.set(c.getValueAdded().toString());
artist = c.getValueAdded().toString();
} else if ("title".equals(c.getKey())) {
title = c.getValueAdded().toString();
System.out.println(c.getKey()+":"+c.getValueAdded());
} else if ("album".equals(c.getKey())) {
album = c.getValueAdded().toString();
System.out.println(c.getKey()+":"+c.getValueAdded());
} else if ("image".equals(c.getKey())) {
coverArt = (Image) c.getValueAdded();
}
}
});
mp = new MediaPlayer(music);
System.out.println(pArtist);
System.out.println(artist);
//artist = (String) mp.getMedia().getMetadata().get("artist");
//title = (String) music.getMetadata().get("title");
//album = (String) music.getMetadata().get("album");
//artist = "test";
//album = "test";
//title = "test";
}
public void play() {
mp.play();
}
public void pause() {
mp.pause();
}
public void stop() {
mp.stop();
}
public String getTitle(){
return title;
}
public void setTitle(String title){
this.title = title;
}
public String getArtist(){
return artist;
}
public void setArtist(String artist){
this.artist = artist;
}
public String getAlbum(){
return album;
}
public void setAlbum(String album){
this.album = album;
}
public Image getCover(){
return coverArt;
}
public MediaPlayer getMP(){
return mp;
}
}
最初に私は私の文字列変数が正しく設定されませんでしたし、それがコンソールにNULLとして示しているので、私はこれらのプリントを入れたときにnullに設定されたので、それが思った変なふうに十分Songオブジェクトが構築されているときにそれをテストするための行。ここで私はこれをテストするコンソールのサンプルです。ここで
null
null
artist:Foo Fighters
album:Saint Cecilia EP
title:Saint Cecilia
は私のコントローラクラスは
public class SceneController implements Initializable{
@FXML
private Button stopBtn;
@FXML
private Slider volume;
@FXML
private Button loadBtn;
@FXML
private Button playBtn;
@FXML
private TableView<Song> table;
@FXML
private Label label;
@FXML
private ProgressBar proBar;
private TableColumn songCol,artistCol,albumCol;
ObservableList<Song> songList = FXCollections.observableArrayList();
List<File> list;
FileChooser fileChooser = new FileChooser();
Desktop desktop;
Song mySong;
@Override
public void initialize(URL arg0, ResourceBundle arg1) {
TableColumn songCol = new TableColumn("Song");
TableColumn artistCol = new TableColumn("Artist");
TableColumn albumCol = new TableColumn("Album");
songCol.setCellValueFactory(
new PropertyValueFactory<Song,String>("title"));
//songCol.setCellFactory(new Callback);
artistCol.setCellValueFactory(
new PropertyValueFactory<Song,String>("artist"));
albumCol.setCellValueFactory(
new PropertyValueFactory<Song,String>("album"));
volume.setMin(0);
volume.setMax(100);
volume.setValue(100);
volume.valueProperty().addListener(new InvalidationListener() {
@Override
public void invalidated(Observable observable) {
mySong.getMP().setVolume(volume.getValue()/100.0);
}
});
}
// Event Listener on Button[#loadBtn].onAction
@FXML
public void loadFile(ActionEvent event) {
Node source = (Node) event.getSource();
Window theStage = source.getScene().getWindow();
//set fileChooser filter
FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter("MP3 files", "*.mp3");
fileChooser.getExtensionFilters().add(extFilter);
fileChooser.setTitle("Select MP3 files");
//File file = fileChooser.showOpenDialog(theStage);
//mySong = new Song(file);
list = fileChooser.showOpenMultipleDialog(theStage);
if(list!=null){
for(File x: list) {
mySong = new Song(x);
System.out.println(mySong.getTitle());
songList.add(mySong);
}
}
table.setItems(songList);
}
@FXML
public void playSong(ActionEvent event) {
mySong.play();
}
@FXML
public void stopSong(ActionEvent event) {
//mySong.pause();
System.out.println("song title: "+mySong.getArtist()+mySong.getTitle());
ImageView img = new ImageView(mySong.getCover());
//img.fitWidthProperty().bind(label.widthProperty());
//img.fitHeightProperty().bind(label.heightProperty());
img.setFitHeight(120);
img.setFitWidth(200);
label.setGraphic(img);
//label.setGraphic(new ImageView(mySong.getCover()));
}
あるしかし、私は、コントローラクラスで私の「停止」ボタンの別のテストプリントラインを作り、すべてがロードされていると私はそれを押した後、それが出て印刷しますアーティストとタイトルの罰金。私はこれを見たother threadと私のゲッターメソッドをチェックし、彼らは正しいようですか?私は実際にこれで失われて、誰かが何かの洞察力と私の変数がnullまたは私のPropertyValueFactoryが正しく行われていないために解決策を提供することができる場合
また、私はnullsが最初に来ることに気付くコントローラークラスで新しいソングオブジェクトを作成したときに最初に実行されたプリントラインがifステートメントにあるので、最後に印刷されたものですか?
あなたは 'setCellValueFactory(...)を呼び出し、'、すべて小文字を使用してみてください。私は引用符で囲まれた単語が 'Song'クラスの変数名と一致しなければならないと思います。私は、私は別の方法で私のセルの値を設定するため、私は思うと言う。 –
小文字と大文字を使ってみましたが、違いはありません –
'TableView'にはどこに列を追加しますか?私は 'songList'を追加する場所を見ていますが、' TableColumn'は追加していません。また、上の3つのカラムを宣言したようですが、 'initialize'でそれらを再宣言して初期化します。 'initialize'メソッドの宣言を削除し、そこで初期化してみてください。 –