在我的程序中,我有一大堆字符串(比如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
。任何人都有更好的方法吗?