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,而不是使用一个按钮来过滤和显示新场景中的项目。我已经看到了这个实现,真的很喜欢这个功能。
谢谢你提供的任何帮助。
TextField
的onAction
事件处理程序中注册监听器,而不是在控制器的initializable.initialize
方法中注册监听器。这意味着当操作
事件发生时(默认情况下,当您点击Enter
)将注册监听器,并且每次操作
事件发生时将注册一个新的监听器。FilterItems
分配给ListView
的Items
属性,但是如果文本变短,则在再次筛选之前不分配新值。这意味着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