Pas*_*rys 3 java listview javafx textfield
我在 TextField 中显示了一些单词。每次在 TextField 中更改这些单词时,我都想重写这些单词。这是我的类型:
class WordType {
String first;
String second;
}
Run Code Online (Sandbox Code Playgroud)
和 ListView 在那里我展示我的话:
ListView<WordType> list = new ListView<>();
list.setCellFactory(lv -> new ListCell<WordType>() {
@Override
public void updateItem(WordType item, boolean empty){
super.updateItem(item, empty);
if (empty){
setText(null);
} else {
ToolBar root = new ToolBar();
TextField word = new TextField(item.first);
TextField translate = new TextField(item.second);
root.getItems().addAll(word, new Separator(), translate);
setGraphic(root);
}
}
});
Run Code Online (Sandbox Code Playgroud)
如果我在 TextField 中更改这些字符串,如何更改 WordType 中的字符串?
对不起,我的英语不好=)
首先,修改您的WordType类以使用 JavaFX 属性:
public class WordType {
private final StringProperty first = new SimpleStringProperty();
private final StringProperty second = new SimpleStringProperty();
public StringProperty firstProperty() {
return first ;
}
public final String getFirst() {
return firstProperty().get() ;
}
public final void setFirst(String first) {
firstProperty().set(first);
}
public StringProperty secondProperty() {
return second ;
}
public final String getSecond() {
return secondProperty().get() ;
}
public final void setSecond(String second) {
secondProperty().set(second);
}
}
Run Code Online (Sandbox Code Playgroud)
现在修改列表单元实现,使其只创建一次文本字段。当 item 发生变化时,将文本字段双向绑定到新 item 中的属性:
list.setCellFactory(lv -> new ListCell<WordType>() {
private final TextField word = new TextField();
private final TextField translate = new TextField();
private final ToolBar root = new ToolBar(word, new Separator(), translate);
{
// anonymous constructor:
itemProperty().addListener((obs, oldWordType, newWordType) -> {
if (oldWordType != null) {
word.textProperty().unbindBidirectional(oldWordType.firstProperty());
translate.textProperty().unbindBidirectional(oldWordType.secondProperty());
}
if (newWordType != null) {
word.textProperty().bindBidirectional(newWordType.firstProperty());
translate.textProperty().bindBidirectional(newWordType.secondProperty());
}
});
}
@Override
protected void updateItem(WordType item, boolean empty) {
super.updateItem(item, empty);
setGraphic(empty ? null : root);
}
});
Run Code Online (Sandbox Code Playgroud)
如果由于某种原因您无法更改 的实现WordType,那么您可以在文本字段上使用一些侦听器。请注意,这只会以一种方式起作用:如果文本字段中的文本发生变化,则WordType属性也会发生变化;但是,如果在WordType显示单元格时该属性从某个其他源发生更改,则该单元格将不会更新。根据您的应用程序要求,这可能是也可能不是问题。本例中的单元实现如下所示:
list.setCellFactory(lv -> new ListCell<WordType>() {
private final TextField word = new TextField();
private final TextField translate = new TextField();
private final ToolBar root = new ToolBar(word, new Separator(), translate);
{
// anonymous constructor:
word.textProperty().addListener((obs, oldText, newText) -> {
WordType wordType = getItem();
wordType.setFirst(newText);
});
translate.textProperty().addListener((obs, oldText, newText) -> {
WordType wordType = getItem();
wordType.setSecond(newText);
});
}
@Override
protected void updateItem(WordType item, boolean empty) {
super.updateItem(item, empty);
setGraphic(empty ? null : root);
}
});
Run Code Online (Sandbox Code Playgroud)
与您现有的WordType课程(我假设您省略了get和set方法)。
| 归档时间: |
|
| 查看次数: |
11298 次 |
| 最近记录: |