2015-12-13 2 views
0

Я написал небольшое приложение JavaFX, которое иллюстрирует мою проблему. У меня есть набор checkBoxes и TextField, все они завернуты в Vbox, который создается при запуске приложения. Я бы хотел, чтобы checkBoxes, которые были проверены, добавлены в список, который мне удалось сделать, но для TextField я его не получаю. Когда я ввожу текст в текстовое поле, все символы добавляются в список, но Я хочу, чтобы весь текст был добавлен сразу. Вот мой код, чтобы проиллюстрировать, что я имею в виду.Добавить содержимое 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); 
    } 
} 

Если я вхожу «привет» в TextField, он добавляет «час», «он» «Хель», «ад», «привет» в моем списке. Как добавить «привет» сразу.

спасибо. Pierre.

+0

Это природа «изменилась» событие. Все, что напечатано или удалено в TextField, вызывает это событие. То, что вы, возможно, захотите попробовать, - это событие keyPress и набирать, когда нажата клавиша ввода, указывающая конец ввода данных в TextField. – DevilsHnd

ответ

1

Использование setOnAction вместо TextProperty изменил

textArea.setOnAction(e -> checked.add(textArea.getText())); 

нажмите ввод в TextField, когда закончите печатать «привет»

+0

Спасибо большое :) –

Смежные вопросы