【问题标题】:How to bind TextField and String object in JavaFX?如何在 JavaFX 中绑定 TextField 和 String 对象?
【发布时间】:2017-03-17 03:42:00
【问题描述】:

我在 TextField 中显示了一些单词。每次在 TextField 中更改此单词时,我都想重写此单词。 这是我的类型:

class WordType {
   String first;
   String second;
}

和我展示我的话的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);
            }
        }
    });

如果我在 TextField 中更改这些字符串,如何更改 WordType 中的字符串?

对不起,我的英语不好=)

【问题讨论】:

  • 您可以更改WordType 类以使用JavaFX 属性吗?
  • 不,我不能。我从一些资源中加载单词,我必须在这些资源中重写我的单词。
  • 我不明白为什么这会阻止您更改类实现...?
  • 如果在 WordType 中我将有 TextField 表单,我如何在资源中重写我的单词?
  • 我没有说在WordType 中使用TextFields。我的意思是用JavaFX properties 代替纯字符串来表示数据。

标签: java listview javafx textfield


【解决方案1】:

首先,修改您的 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);
    }
}

现在修改列表单元的实现,使其只创建一次文本字段。当项目发生变化时,将文本字段双向绑定到新项目中的属性:

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

如果由于某种原因您无法更改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);
    }
});

使用您现有的 WordType 类(为简洁起见,我假设您省略了 getset 方法)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-28
    • 2016-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多