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

在筛选器文本字段中输入文本时,ListView没有更改

石喜
2023-03-14

EDIT--显示对象类,在initialize方法中添加代码,删除以前的filter方法,并从FXML中删除TextField的OnAction。---

我第一次试图解决这个问题的尝试导致了许多Android问题,所以我在这里。

我使用JavaFX、Scenebuilder和FXML制作了一个简单的GUI。这个GUI模拟工厂车间的库存,可以从ObservableList添加到/删除/显示/保存到文件。它还应该根据用户在文本字段中输入的部分字符串筛选对象。

每个对象打印一个带有用户指定前缀的伪随机ID号(F表示花,W表示杂草,H表示药草,Fn表示真菌)、名称、颜色和布尔属性,如“荆棘”、“香味”、“可食用”等,这些都是由单选按钮确定的。例如,如果用户输入一朵新花的所有值,它将打印为:“ID:F-21,Name:Rose,Color:Red,Thorny?False,Scented?True”

下面是我最初的ObservableList和FilteredList:

ObservableList<Plant> observablePlantList = FXCollections.observableArrayList();
FilteredList<Plant> filteredList = new FilteredList<Plant>(observablePlantList);

下面是我的Plant类和一个子类(有4个子类完全相同),以显示它们在列表中的显示方式(布尔值是单选按钮):

    public class Plant {
public String ID;
public String name;
public String color;
public boolean smell;
public boolean thorns;
public boolean edible;
public boolean poisonous;
public boolean flavor;
public boolean medicine;
public boolean seasonal;
public int idNum;

public Plant(String ID, int idNum, String name, String color, boolean smell, boolean thorns, boolean edible, boolean poisonous, boolean flavor, boolean medicine, boolean seasonal) {
    this.ID = ID;
    this.idNum = randomID(idNum);
    this.name = name;
    this.color = color;
    this.smell = false;
    this.thorns = false;
    this.edible = false;
    this.poisonous = false;
    this.flavor = false;
    this.medicine = false;
    this.seasonal = false;
}

public void setColor(String color) {this.color = color;}
public void setID(String ID) {this.ID = ID;}
public void setName(String name) {this.name = name;}

public String getID() {return ID;}
public String getName() {return name;}

public int randomID(int idNum) {
    Random randomNum = new Random();
    idNum = randomNum.nextInt(50);
    return idNum;
}

public String toString() {

    return "ID: " + this.ID + "-" + this.idNum + ", Name: " + this.name + ", Color: " + this.color;
}

}
    public class Flower extends Plant {

public Flower(String ID, int idNum, String name, String color, boolean smell, boolean thorns, boolean edible, boolean poisonous, boolean flavor, boolean medicine, boolean seasonal) {

    super(ID, idNum, name, color, smell, thorns, edible, poisonous, flavor, medicine, seasonal);
}
public void setSmell(boolean smell) {
    this.smell = smell;
}
public void setThorns(boolean thorns) {
    this.thorns = thorns;
}
public String toString() {

    return super.toString() + ", Scent? " + this.smell + ", Thorns? " + this.thorns;
}

}
    @Override
public void initialize(URL fxmlFileLocation, ResourceBundle rb) {

    plantList.setItems(filteredList);

    //binding filterInput text entries
    filteredList.predicateProperty().bind(Bindings.createObjectBinding(() -> {
        String filterText = filterInput.getText();
        if(filterText == null || filterText.isEmpty()) {
            return null;
        }
        else {
            final String uppercase = filterText.toUpperCase();
            return (plant) -> plant.getName().toUpperCase().contains(uppercase);
        }
    }, filterInput.textProperty()));

我的目标是实时过滤一个ObservableArrayList,而不是使用一个按钮来过滤和显示新场景中的项目。我已经看到了这个实现,真的很喜欢这个功能。

谢谢你提供的任何帮助。

共有1个答案

阚原
2023-03-14
  • TextFieldonAction事件处理程序中注册监听器,而不是在控制器的initializable.initialize方法中注册监听器。这意味着当操作事件发生时(默认情况下,当您点击Enter)将注册监听器,并且每次操作事件发生时将注册一个新的监听器。
  • 您将FilterItems分配给ListViewItems属性,但是如果文本变短,则在再次筛选之前不分配新值。这意味着plantlist.getitems()(您遍历的列表)可以与您添加到=>ConcurrentModificationException.
  • 中的列表相同
  • 永远不会清除筛选的列表

使用FilteredList。它是一个为您进行筛选而设计的类。

@FXML
private ListView<Plant> plantList;
@FXML
private TextField filterInput;

ObservableList<Plant> observablePlantList = FXCollections.observableArrayList();
FilteredList<Plant> filterItems = new FilteredList<>(observablePlantList);

@Override
public void initialize(URL url, ResourceBundle rb) {
    plantList.setItems(filterItems);
    
    // bind predicate to text filterInput text
    filterItems.predicateProperty().bind(javafx.beans.binding.Bindings.createObjectBinding(() -> {
        String text = filterInput.getText();
        if (text == null || text.isEmpty()) {
            return null;
        } else {
            final String uppercase = text.toUpperCase();
            return (plant) -> plant.getName().toUpperCase().contains(uppercase);
        }
    }, filterInput.textProperty()));
}

当然,在本例中,您可以从fxml文件的textfield中删除onaction属性。

 类似资料:
  • 问题内容: 我想在输入文本字段的同时更新我的​​文本区域,但是在输入时我延迟了1次击键,即当我按下一个键时,会显示上一个键。这是我的代码段 问题答案: 我不建议使用 只需在您的via中添加一个: 里面每个方法(,和)只需要一个电话设置你的文字通过: 这是我做的一个例子:

  • 问题内容: 当我在文本字段中输入文本时,它将被删除。 这是代码: 问题答案: 同意Subir Kumar Sao和Faiz。

  • 当我在文本字段中输入文本时,它会被删除。 代码如下:

  • 我正在尝试实现一个编辑文本,将输入限制为仅 Alpha 字符 [A-Za-z]。 我从本文中的InputFilter方法开始。当我键入“a%”时,文本消失,如果我按退格键,文本为“a”。我尝试过过滤器函数的其他变体,比如使用正则表达式只匹配[a-Za-z],有时会看到疯狂的行为,比如重复字符,我会键入“a”,然后键入“b”,再键入“aab”,然后再键入“c”,再得到“aabaabc”,然后按退格键

  • 问题内容: 我有一个最大字符范围为16的字符,每4个字符后,我要添加一个负字符或空格,然后编写其余的字符,例如本示例5022-2222-2222-2222。有我的代码,但是那不起作用,该怎么办? 我在 范围方法中添加此代码。 问题答案: 我们可以从实现oisdk:s SwiftSequence 方法的(版本号)的Swift 3版本开始: 在这种情况下,实现自定义格式是创建4个字符的块并将其通过“-

  • 问题内容: 我正在尝试我的React.js的第一部分,并在很早的时候就陷入了困境…我有下面的代码,该代码将搜索表单呈现为。但是,在搜索框中输入内容无济于事。 大概在通过道具并上下移动时会丢失一些东西,这似乎是一个常见问题。但是我很沮丧-我看不到缺少的东西。 (最终,我会使用其他类型的,但是我只是想让这一类正常工作。) 问题答案: 您尚未将道具放在机箱中。它必须在JSX中。 在文档中充分考虑了将 p