当前位置: 首页 > 知识库问答 >
问题:

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

丘华翰
2023-03-14

我对Java、JavaFX和一般编程都有点陌生,我有一个问题让我大吃一惊。

在我查阅的大多数关于填充ListView(更具体地说,使用ObservableArrayList)的教程中,最简单的方法是从字符串的ObservableList创建它,如下所示:

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);

ListView<Word> listViewOfWords = new ListView<>(wordsList);

要明确的是,这不是android的,单词列表最终会被更改、保存和加载,所以我不能只做另一个数组来保存WordString。我在web上做了一些研究,似乎有一种叫做“细胞工厂”的东西,但对于如此简单的问题来说,它似乎不必要地复杂,正如我之前所说的,当涉及到编程时,我是一个新手。

有人能帮忙吗?这是我第一次来这里,所以如果我没有包含足够的代码或我做错了什么,我很抱歉。

共有1个答案

子车峰
2023-03-14

求解方法

我建议使用细胞工厂来解决这个问题。

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);
    }
}
 类似资料:
  • 我对Java、JavaFX和一般编程都有点陌生,我有一个问题让我大吃一惊。 在我查阅的大多数关于填充ListView(更具体地说,使用ObservableArrayList)的教程中,最简单的方法是从字符串的ObservableList创建它,如下所示: 但我不想用字符串。我想使用我制作的一个名为Words的自定义对象: 要明确的是,这不是android的,单词列表最终会被更改、保存和加载,所以我

  • 我的Java程序产生了很多数据,我用它构建了单个的ResultObject。因为只有某些结果对象会引起兴趣,所以我填充了一个可观察的HashMap 虽然映射和处理这些结果按预期工作,但我很难用该ObservableHashMap填充TableView 我的CustomObject(如果两个CustomObject具有相同的属性,只需检查JSONObject): 我的ObservableHashMa

  • 我有一个要填充信息的对象。我从许多不同的服务中检索信息。我做了一个助手类,它有一个公共方法,然后有许多私有方法来调用服务。我写的东西很好,但我不确定这是否是正确的方法。 您可能想知道为什么我需要一个包含所有这些信息的对象。我需要它全部在一个对象中,因为我从这个java对象创建了一个json对象并将其传递给javascript层。 我的方法有什么问题?我是否应该遵循一种编程范式来做这样的事情? 例子

  • 我有一个简单的JavaFX类,对于这个问题,它的结构是这样的。 BorderPane包含包含FlowPane的StackPane。 几天来,我一直试图让StackPane填充其父级BorderPane,但似乎没有任何效果。最终结果应该是StackPane的背景设置为“红色”。 代码: 我的应用程序正在运行的照片 所以基本上这个左侧区域应该完全填充我的BorderPane的左侧,因此背景应该正确覆盖

  • 我正在与这种情况作斗争...我在SFDC(机会)中有一个标准对象,它有一个指向用户对象的自定义查找字段,我试图用创建自定义对象的用户名称填充该字段在机会布局中可用... i、 e.新建GOP检查表---然后选择检查表的类型---然后填写所有必填字段并单击保存,这将指向Opportunity视图。首先,这是可行的吗?我知道查找字段可能很棘手。我的第二个问题是,通过编程(触发器)或使用工作流和字段更新

  • 我有一个片段,我想创建一个自定义列表视图,但当我发送参数到适配器,它给我的错误。 这是我的代码片段.. 这是我的Mainhome.java 我的错误是...