在JavaFX中的窗格中显示大型列表

时间:2015-07-30 17:31:39

标签: arrays listview combobox javafx

在我的程序中,我有一大堆字符串(比如1600),我希望将其显示为CheckBox列表。该阵列实际上是一台PC中所有歌曲的位置,因此可以逐渐变大。我不想使用ListView<String>,因为CheckBox列表效率更高,而且最重要的是我的目的。我现在正在做以下事情:

private void listAll() {
    songs = MediaManager.getAllSongs();
    VBox vb = new VBox();
    vb.setSpacing(5);
    vb.getStyleClass().add("background");
    if (songs != null) {
        Service s = new Service() {

            @Override
            protected Task createTask() {
                Task t = new Task() {
                    @Override
                    protected Object call() throws Exception {
                        for (String song : songs) {
                            addSong(song, vb);
                            c++;
                            updateMessage(c+" songs");
                        }
                        return null;
                    }
                };
                t.messageProperty().addListener((obs,o,n)->{
                    count.setText(n);
                });
                return t;
            }
        };
        s.start();
        ScrollPane sp = new ScrollPane(vb);
        getChildren().add(sp);
    }
}

private void addSong(String n, Pane p) {
    String toAdd = "";
    Media m = new Media(Paths.get(n).toUri().toString());
    if (m.getMetadata().get("title") == null || !(m.getMetadata().get("title").equals(""))) {
        toAdd = m.getSource().split("/")[m.getSource().split("/").length - 1].replace("%20", " ").replace(".mp3", "");
    } else {
        toAdd = ((String) m.getMetadata().get("title"));
    }
    SongBox s = new SongBox(toAdd);
    s.setUserData(n);
    p.getChildren().add(s);
}

class SongBox extends CheckBox {

    public SongBox(String t) {
        this();
        setText(t);
    }

    public SongBox() {
        super();

        setOnAction((ActionEvent evt) -> {
            if (isSelected()) {
                if (!playNow.isVisible()) {
                    playNow.setVisible(true);
                }
                path = (String) getUserData();
                selected.add((String) getUserData());
            } else {
                selected.remove((String) getUserData());
                if (selected.size() == 0) {
                    playNow.setVisible(false);
                }
            }
        });
    }
}

首先,这并没有显示完整的数组。每当我回去并返回时,歌曲的数量都会发生变化。其次,整个用户界面变得迟钝(有时候还挂着我的电脑)。此外,当我转到上一个窗口时,我无法取消Service,因为它总是返回false。任何人都有更好的方法吗?

0 个答案:

没有答案