栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何使用自定义对象在JavaFX中填充ListView?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何使用自定义对象在JavaFX中填充ListView?

解决方法

我建议使用电池工厂来解决此问题。

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单元工厂中没有适当侦听器逻辑的情况下定义。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/432064.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号