将TextField的内容添加到包含侦听器的列表中

时间:2015-12-13 22:56:27

标签: java javafx

我写了一个小JavaFX应用程序来说明我的问题。我有一组checkBoxes和一个TextField,它们都包含在一个Vbox中,它是在应用程序启动时构造的。我希望检查的复选框被添加到列表中,我设法做到了,但对于TextField,我没有得到它。当我在文本字段中键入文本时,所有字符都添加到列表中,但我希望立即添加整个文本。 这是我的代码来说明我的意思。

package sample;

import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.Initializable;
import javafx.scene.control.CheckBox;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.util.*;

public class Controller implements Initializable {

    public VBox mainVb;
    List<String> categories = new ArrayList<>();
    List<String> checked = new ArrayList<>();

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        categories();
    }

    public void categories() {
        categories.add("Condition 1");
        categories.add("Condition 2");
        categories.add("Condition 3");
        categories.add("Condition 4");
        categories.add("Condition 5");
        categories.add("Condition 6");
        categories.add("Condition 7");
        categories.add("Condition 8");
        checked.add("Condition 2");
        checked.add("Condition 3");
        checked.add("Condition 6");

        for (int i = 0; i < categories.size(); i++) {
            CheckBox checkBox = new CheckBox();
            checkBox.setText(categories.get(i));
            if (checked.contains(categories.get(i))) checkBox.setSelected(true);
            checkBox.setOnAction(new EventHandler<ActionEvent>() {
                @Override
                public void handle(ActionEvent event) {
                    if (checkBox.isSelected()) checked.add(checkBox.getText());
                    if (!checkBox.isSelected()) checked.remove(checkBox.getText());
                }
            });
            mainVb.getChildren().add(checkBox);
        }
        TextField textArea = new TextField();
        textArea.setPromptText("Other...");
        textArea.textProperty().addListener(new ChangeListener<String>() {
            @Override
            public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
                checked.add(textArea.getText());
            }
        });
        mainVb.getChildren().add(textArea);
    }

    public void seeChecked(ActionEvent event) {
        System.out.println(checked);
    }
}

如果我进入&#34;你好&#34;在TextField中,它添加了&#34; h&#34; &#34;他&#34; &#34; HEL&#34; &#34;地狱&#34; &#34;你好&#34;在我的清单中。如何添加&#34;你好&#34;马上。

非常感谢你。 皮尔。

1 个答案:

答案 0 :(得分:1)

使用setOnAction而不是textProperty已更改

 textArea.setOnAction(e ->  checked.add(textArea.getText()));
输入&#34; hello&#34;

后,按键入TextField