3 回答
TA贡献1779条经验 获得超6个赞
我建议使用电池工厂来解决此问题。
listViewOfWords.setCellFactory(param -> new ListCell<Word>() {
@Override
protected void updateItem(Word item, boolean empty) {
super.updateItem(item, empty);
if (empty || item == null || item.getWord() == null) {
setText(null);
} else {
setText(item.getWord());
}
}
});
样品申请
添加图片
import javafx.application.Application;
import javafx.collections.*;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.stage.Stage;
public class CellFactories extends Application {
@Override
public void start(Stage stage) {
ObservableList<Word> wordsList = FXCollections.observableArrayList();
wordsList.add(new Word("First Word", "Definition of First Word"));
wordsList.add(new Word("Second Word", "Definition of Second Word"));
wordsList.add(new Word("Third Word", "Definition of Third Word"));
ListView<Word> listViewOfWords = new ListView<>(wordsList);
listViewOfWords.setCellFactory(param -> new ListCell<Word>() {
@Override
protected void updateItem(Word item, boolean empty) {
super.updateItem(item, empty);
if (empty || item == null || item.getWord() == null) {
setText(null);
} else {
setText(item.getWord());
}
}
});
stage.setScene(new Scene(listViewOfWords));
stage.show();
}
public static class Word {
private final String word;
private final String definition;
public Word(String word, String definition) {
this.word = word;
this.definition = definition;
}
public String getWord() {
return word;
}
public String getDefinition() {
return definition;
}
}
public static void main(String[] args) {
launch(args);
}
}
实施说明
尽管您可以在Word类中重写toString来提供该单词的字符串表示形式,以供ListView中的表示形式使用,但我还是建议在ListView中提供一个单元工厂,以从单词对象中提取视图数据并在您的视图中进行表示列表显示。使用这种方法,因为您没有将Word对象的图形视图与其文本toString方法联系在一起,所以可以将关注点分离。因此toString可以继续具有不同的输出(例如,有关Word字段的完整信息,其中包含单词名称和用于调试目的的描述)。此外,单元工厂更加灵活,因为您可以应用各种图形节点来创建数据的可视表示,而不仅仅是纯文本字符串(如果您愿意这样做)。
另外,我建议您将Word对象设为不可变的对象,删除他们的二传手。如果您确实需要修改单词对象本身,那么处理该对象的最佳方法是公开对象字段的可观察属性。如果您还希望UI随着对象的可观察属性的变化而更新,那么您需要通过侦听对它们的更改,使列表单元知道对关联项目的更改(这在此方面要复杂得多)案件)。请注意,包含单词的列表已经可以观察到,并且ListView将负责处理对该列表的更改,但是如果您在显示的单词对象中修改了实例的单词定义,则您的列表视图将不会接受对单词的更改。 ListView单元工厂中没有适当的侦听器逻辑的情况下定义。
添加回答
举报