Я пишу проект в формате MVC, и он должен стать музыкальным проигрывателем.
В моем представлении у меня есть библиотека Listview и плейлист, подобный этому:
private ListView<ISong> library = new ListView<ISong>();
private ListView<ISong> playlist = new ListView<ISong>();
public ListView<ISong> getLibrary() {return library;}
public ListView<ISong> getPlaylist() {return playlist;}
public View() {
HBox hBoxCenter = new HBox(library, playlist);
У нас также есть классы «Playlist» и «Song», которые оба реализуют предоставленный нам интерфейс, а «Playlist» имеет следующий ArrayList, который вначале будет совершенно пустым:
package model;
import interfaces.IPlaylist;
import interfaces.ISong;
import javafx.collections.ModifiableObservableListBase;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.Iterator;
public class Playlist extends ModifiableObservableListBase<ISong> implements IPlaylist {
private ArrayList<ISong> songs = new ArrayList<>();
@Override
public boolean addSong(ISong s) throws RemoteException {
if (songs.add(s)){
return true;
}
throw new RemoteException("Song could not be added!");
}
@Override
public boolean deleteSong(ISong s) throws RemoteException {
if (songs.contains(s)){
songs.remove(s);
return true;
}
throw new RemoteException("Song does not exist in this Playlist!");
}
@Override
public boolean deleteSongByID(long id) throws RemoteException {
for (int i = 0; i < songs.size(); i ++){
if (songs.get(i).getId() == id){
songs.remove(i);
return true;
}
}
throw new RemoteException("No Song with matching ID exists in Playlist!");
}
@Override
public void setList(ArrayList<ISong> s) throws RemoteException {
if (s != null) {
songs = s;
return;
}
throw new RemoteException("Playlist can not be null.");
}
@Override
public ArrayList<ISong> getList() throws RemoteException {
try {
return songs;
}catch(Exception e){throw new RemoteException();}
}
@Override
public void clearPlaylist() throws RemoteException {
try {
songs.clear();
}catch(Exception e){throw new RemoteException();}
}
@Override
public int sizeOfPlaylist() throws RemoteException {
try {
return songs.size();
}catch(Exception e){throw new RemoteException();}
}
@Override
public ISong findSongByPath(String name) throws RemoteException {
for(int i=0; i<songs.size();i++){
ISong song = songs.get(i);
if (song.getPath().equals(name)) return song;
}
throw new RemoteException("Could not find song with given Path!");
}
@Override
public ISong findSongByID(long id) throws RemoteException {
for(int i=0; i<songs.size();i++){
ISong song = songs.get(i);
if (song.getId()==id) return song;
}
throw new RemoteException("Could not find song with given ID!");
}
@Override
public Iterator<ISong> iterator() {
return null;
}
@Override
public ISong get(int index) {
return songs.get(index);
}
@Override
public int size() {
return songs.size();
}
@Override
protected void doAdd(int index, ISong element) {
songs.add(index, element);
}
@Override
protected ISong doSet(int index, ISong element) {
return null;
}
@Override
protected ISong doRemove(int index) {
return null;
}
}
В моем контроллере я связываю их так:
public void link (Model model, View view){
this.view = view;
this.model = model;
view.getLibrary().setItems(model.getLibrary());
view.getPlaylist().setItems(model.getPlaylist());
}
MainClass выглядит следующим образом:
public void start(Stage primaryStage) throws Exception {
Model model = new Model();
View view = new View();
Controller controller = new Controller();
controller.link(model,view);
view.setController(controller);
controller.initializePlaylist();
Scene scene = new Scene(view);
primaryStage.setScene(scene);
primaryStage.show();
controller.cleanup();
}
Теперь вот моя проблема:
Когда графический интерфейс открывается и ArrayList пуст, он не будет отображать дальнейшие изменения, сделанные в ArrayList. ОДНАКО, если я добавлю «пустую» композицию в свой ArrayList, а затем просто очищу список после того, как GUI открыт, все будет работать отлично (именно поэтому я написал initializePlaylist и методы очистки).
Извините, если это глупый вопрос или я не предоставил достаточно фрагментов кода, у меня просто нет идей на данный момент, и я искал причину этого часами.