限制组合框内的文本输入

时间:2014-11-14 02:21:48

标签: combobox javafx

我需要用正数来限制组合框内的文本输入。我为此搜索了stackoverflow,发现了类似的问题:Recommended way to restrict input in JavaFX textfield

唯一的区别是提到的问题涉及裸文本域。 javafx设计者批准的答案是扩展TextField类并覆盖几种方法:replaceTextreplaceSelection。如果存储在内部,则此hack不适用于combobox:TextField实例,并且可用作名为editor只读属性。

那么在javafx组合框中限制文本输入的推荐方法是什么?

3 个答案:

答案 0 :(得分:1)

由于这个问题从来没有得到正确的答案我正在添加一个我实现的解决方案,限制用户输入匹配正则表达式并且比特定长度短(这是可选的)。这是通过向编辑器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;
                    }
                }
            });

答案 1 :(得分: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

答案 2 :(得分:0)

如何将文本编辑器从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);

现在您可以完全控制TextField,允许覆盖任何方法等。