2014-11-14 3 views
0

Мне нужно ограничить ввод текста внутри combobox с положительными номерами. Я искал stackoverflow для этого и нашел аналогичный вопрос: Recommended way to restrict input in JavaFX textfieldОграничить ввод текста внутри combobox

Единственное различие заключается в том, что упомянутый вопрос касается открытого текстового поля. Ответ, одобренный дизайнерами javafx, должен расширить класс TextField и переопределить несколько методов: replaceText и replaceSelection. Этот хак не работает с combobox: TextField экземпляр, если он хранится внутри и доступен как только для чтения свойство с именем editor.

Итак, какой рекомендуемый способ ограничить ввод текста внутри javafx combobox?

ответ

0

Вы можете зарегистрировать метод проверки в свойстве редактора, чтобы проверить, не является ли какой-либо входным.

Здесь я разрешаю редактирование, но рисую красную рамку, если значения не находятся в списке элементов.

ObservableList<String> myChoices = FXCollections.observableArrayList(); 

void testComboBoxCheck(VBox box) { 
    myChoices.add("A"); 
    myChoices.add("B"); 
    myChoices.add("C"); 

    ComboBox<String> first = new ComboBox<String>(); 
    first.setItems(myChoices); 
    first.setEditable(true); 
    first.editorProperty().getValue().textProperty().addListener((v, o, n) -> { 
     if (myChoices.contains(n.toUpperCase())) { 
      first.setBackground(new Background(new BackgroundFill(Color.rgb(30,30,30), new CornerRadii(0), new Insets(0)))); 
     } else { 
      first.setBackground(new Background(new BackgroundFill(Color.RED, new CornerRadii(0), new Insets(0)))); 
     } 
    }); 

    box.getChildren().addAll(first); 
} 

enter image description here enter image description here

+0

Многие комментаторы в подобных вопросах, относящихся к классу TextField, препятствуют этому способу. Я не знаю, почему. – ayvango

0

Как насчет decouplign редактора текста из ComboBox и связать их значение?

HBox combo = new HBox(); 

    TextField editor = new TextField(); 

    ComboBox<String> first = new ComboBox<String>(); 
    first.setItems(myChoices); 
    first.setButtonCell(new ComboBoxListCell<String>(){ 
     @Override public void updateItem(String s, boolean empty) { 
      super.updateItem(s, empty); 
      setText(null); 
     } 
    }); 

    editor.textProperty().bindBidirectional(first.valueProperty()); 

    combo.getChildren().addAll(editor, first); 
    box.getChildren().addAll(combo); 

Теперь у вас есть полный conroll над TextField, позволяющий переопределить любые методы и т.д.

0

Поскольку этот вопрос вопрос не получил должного ответа я добавляю решение я реализован, ограничивающее пользователю который соответствует регулярному выражению и короче определенной длины (это необязательно). Это делается путем добавления ChangeListener к редактору TextField. Любой вход, который не соответствует, не будет записан в редактор TextField.

Этот пример ограничивает пользователя не более двух числовых символов.

ComboBox<Integer> integerComboBox = new ComboBox<Integer>(); 
integerComboBox.setEditable(true); 
integerComboBox.getEditor().textProperty() 
      .addListener(new ChangeListener<String>() { 

       // The max length of the input 
       int maxLength = 2; 

       // The regular expression controlling the input, in this case we only allow number 0 to 9. 
       String restriction = "[0-9]"; 

       private boolean ignore; 

       @Override 
       public void changed(
         ObservableValue<? extends String> observableValue, 
         String oldValue, String newValue) { 
        if (ignore || newValue == null) { 
         return; 
        } 

        if (newValue.length() > maxLength) { 
         ignore = true; 
         integerComboBox.getEditor().setText(
           newValue.substring(0, maxLength)); 
         ignore = false; 
        } 

        if (!newValue.matches(restriction + "*")) { 
         ignore = true; 
         integerComboBox.getEditor().setText(oldValue); 
         ignore = false; 
        } 
       } 
      }); 
Смежные вопросы