JavaFX Listview не обновляется при предоставлении ему пустого ArrayList - PullRequest
0 голосов
/ 17 ноября 2018

Я пишу проект в формате 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 и методы очистки).

Извините, если это глупый вопрос или я не предоставил достаточно фрагментов кода, у меня просто нет идей на данный момент, и я искал причину этого часами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...