第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用自定義對象在JavaFX中填充ListView?

如何使用自定義對象在JavaFX中填充ListView?

函數(shù)式編程 2019-11-18 14:26:41
我對Java,JavaFX和一般編程還是有點(diǎn)陌生,但是我遇到了一個困擾我的問題。在大多數(shù)教程中,我查找了有關(guān)填充ListView(更具體地說,使用ObservableArrayList)的方法,最簡單的方法是從字符串的ObservableList中進(jìn)行填充,如下所示:ObservableList<String> wordsList = FXCollections.observableArrayList("First word","Second word", "Third word", "Etc."); ListView<String> listViewOfStrings = new ListView<>(wordsList);但是我不想使用字符串。我想使用我制作的名為Words的自定義對象: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);每個Word對象只有兩個屬性:wordString(單詞的字符串)和definition(另一個字符串,它是單詞的定義)。我既有g(shù)etter也有setter。您可以看到代碼的編譯和工作原理,但是當(dāng)我在應(yīng)用程序中顯示它時,而不是在ListView中顯示每個單詞的標(biāo)題時,它會將Word對象本身顯示為字符串!該圖顯示了我的應(yīng)用程序及其ListView我的問題是,具體來說,是否有一種簡單的方法可以重寫:ListView<Word> listViewOfWords = new ListView<>(wordsList);以這種方式,而不是直接從wordsList中獲取Words,它訪問我的observableArrayList的每個Word中的wordString屬性?請注意,這不適用于android,單詞列表最終將被更改,保存和加載,因此我不能僅僅制作另一個數(shù)組來保存wordStrings。我已經(jīng)在網(wǎng)絡(luò)上做了一些研究,似乎有一個叫做“細(xì)胞工廠”的東西,但是看起來如此簡單的問題似乎不必要地復(fù)雜,正如我之前所說,我有點(diǎn)編程方面的新手。有人可以幫忙嗎?這是我第一次來,所以如果我沒有包含足夠的代碼或者做錯了什么,我感到抱歉。
查看完整描述

3 回答

?
哆啦的時光機(jī)

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下定義。


查看完整回答
反對 回復(fù) 2019-11-18
  • 3 回答
  • 0 關(guān)注
  • 1071 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號