3 回答

TA貢獻(xiàn)1779條經(jīng)驗(yàn) 獲得超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);
}
}
實(shí)施說明
盡管您可以在Word類中重寫toString來提供該單詞的字符串表示形式,以供ListView中的表示形式使用,但我還是建議在ListView中提供一個單元工廠,以從單詞對象中提取視圖數(shù)據(jù)并在您的視圖中進(jìn)行表示列表顯示。使用這種方法,因?yàn)槟鷽]有將Word對象的圖形視圖與其文本toString方法聯(lián)系在一起,所以可以將關(guān)注點(diǎn)分離。因此toString可以繼續(xù)具有不同的輸出(例如,有關(guān)Word字段的完整信息,其中包含單詞名稱和用于調(diào)試目的的描述)。此外,單元工廠更加靈活,因?yàn)槟梢詰?yīng)用各種圖形節(jié)點(diǎn)來創(chuàng)建數(shù)據(jù)的可視表示,而不僅僅是純文本字符串(如果您愿意這樣做)。
另外,我建議您將Word對象設(shè)為不可變的對象,刪除他們的二傳手。如果您確實(shí)需要修改單詞對象本身,那么處理該對象的最佳方法是公開對象字段的可觀察屬性。如果您還希望UI隨著對象的可觀察屬性的變化而更新,那么您需要通過偵聽對它們的更改,使列表單元知道對關(guān)聯(lián)項(xiàng)目的更改(這在此方面要復(fù)雜得多)案件)。請注意,包含單詞的列表已經(jīng)可以觀察到,并且ListView將負(fù)責(zé)處理對該列表的更改,但是如果您在顯示的單詞對象中修改了實(shí)例的單詞定義,則您的列表視圖將不會接受對單詞的更改。 ListView單元工廠中沒有適當(dāng)?shù)膫陕犉鬟壿嫷那闆r下定義。
添加回答
舉報