如何在JavaFx中的可编辑ComboBox中输入值?

时间:2016-06-20 13:11:13

标签: java javafx combobox

我有一个ComboBox,列出了设置的值。我使用setEditable(true)方法使其可编辑,但如何获取用户输入的值?我尝试了getSelectionModel()。getSelectedItem()和getValue()方法,但没有成功。

这是代码。

public class Comparator extends Application {

    @Override
      public void start(Stage stage) {
        stage.setTitle("ComboBoxSample");
        Scene scene = new Scene(new Group(), 450, 250);

        ComboBox<String> emailComboBox = new ComboBox<>();
        emailComboBox.getItems().addAll("A","B","C","D","E");

        emailComboBox.setEditable(true);        

        Button b = new Button("get text");

        GridPane grid = new GridPane();
        grid.setVgap(4);
        grid.setHgap(10);
        grid.setPadding(new Insets(5, 5, 5, 5));
        Label to = new Label("To: ");
        Label selected = new Label();
        grid.add(to, 0, 0);
        grid.add(emailComboBox, 1, 0);
        grid.add(b, 2, 0);
        grid.add(selected, 3, 0);

        b.setOnAction(e -> {
            selected.setText(emailComboBox.????);
        });

        Group root = (Group) scene.getRoot();
        root.getChildren().add(grid);
        stage.setScene(scene);
        stage.show();
      }

    public static void main(String[] args) {
        launch(args);
    }
}

我实际上想要获得新输入的值。 PS:如果以防万一,只是为了避免混淆。我可以输入列表中不存在的任何字符串。这将是输入的新值。

5 个答案:

答案 0 :(得分:7)

默认情况下,大多数JavaFX控件都不会提交&#34;关于失去焦点的一个值 - 所以TextField s,当用作较大控件(例如ComboBox内部的编辑控件时,不会将值提交回父控件,除非用户按下输入。关于这个设计决定存在很多争议:但是这是做出的决定,如果我们要使用JavaFX,我们必须接受或者找到解决方法来获得我们想要的行为。

快速而肮脏&#34;方法是挖掘文本字段并从中获取文本,如@ Ajeetkumar的回答:

selected.setText(emailComboBox.getEditor().getText());

这种方法的问题在于它使应用程序处于不一致状态:标签中显示给用户的值不是组合框模型中保存的值:换句话说emailComboBox.getValue()返回与标签中显示的值不同的值(因为文本字段中的值从未提交到组合框)。在某些时候,您的应用程序将需要处理显示的数据,程序员(或团队的其他成员)将在组合框的模型中寻找数据的自然位置:即他们将期望数据到在emailComboBox.getValue()。更好的方法是确保组合框的值在您需要时更新,然后只使用预期的emailComboBox.getValue()来获取数据。

例如,您可以在文本字段失去焦点时更新值:

    emailComboBox.getEditor().focusedProperty().addListener((obs, wasFocused, isNowFocused) -> {
        if (! isNowFocused) {
            emailComboBox.setValue(emailComboBox.getEditor().getText());
        }
    });

然后自然:

    b.setOnAction(e -> {
        selected.setText(emailComboBox.getValue());
    });

使用这种方法,应用程序始终处于一致状态:即标签显示组合框的值,这比以后直接从文本字段设置标签的可能性更小。

另一种变体是在编辑器中的文本发生更改后立即更新组合框值:

    emailComboBox.getEditor().textProperty().addListener((obs, oldText, newText) -> {
        emailComboBox.setValue(newText);
    });

请注意,如果您愿意,使用此版本您可以完全免除按钮,只需将标签的文字直接绑定到组合框的值:

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Label;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;

public class Comparator extends Application {

    @Override
      public void start(Stage stage) {
        stage.setTitle("ComboBoxSample");
        Scene scene = new Scene(new Group(), 450, 250);

        ComboBox<String> emailComboBox = new ComboBox<>();
        emailComboBox.getItems().addAll("A","B","C","D","E");

        emailComboBox.setEditable(true);        

        emailComboBox.getEditor().textProperty().addListener((obs, oldText, newText) -> {
            emailComboBox.setValue(newText);
        });


        GridPane grid = new GridPane();
        grid.setVgap(4);
        grid.setHgap(10);
        grid.setPadding(new Insets(5, 5, 5, 5));
        Label to = new Label("To: ");
        Label selected = new Label();
        grid.add(to, 0, 0);
        grid.add(emailComboBox, 1, 0);
        grid.add(selected, 2, 0);

        selected.textProperty().bind(emailComboBox.valueProperty());

        Group root = (Group) scene.getRoot();
        root.getChildren().add(grid);
        stage.setScene(scene);
        stage.show();
      }

    public static void main(String[] args) {
        launch(args);
    }
}

强烈建议保持数据的完整性,以保持应用程序的一致性并使其不太可能在以后引入错误,因此强烈建议更新组合框value包含要表示的值的属性,然后引用该值。用作编辑器的文本字段实际上是组合框的实现细节,它只应用于修改组合框编辑过程的行为:在此示例中,它用于修改更新行为 - 您还可以在它上面设置一个格式化程序等等。它不应该被用作模型的代理,因为这会使以后的生活变得困难。

答案 1 :(得分:1)

我得到了答案。

emailComboBox.getEditor()。gettext的()

我们在可编辑的ComboBox中键入的textField称为ComboBox的编辑器。它是一个普通的TextField对象。要访问该对象,您需要使用方法 ComboBox.getEditor()。这样您就可以使用TextField类的方法。

答案 2 :(得分:0)

当您更改编辑器值

时,这将更改列表
pluginConfig.getEditor().textProperty().addListener((obs, oldText, newText) -> {
        if (pluginConfig.getSelectionModel().getSelectedIndex() >= 0)
            pluginConfig.getItems().set(pluginConfig.getSelectionModel().getSelectedIndex(),newText);
    });

答案 3 :(得分:-1)

您可以使用以下代码行在ComboBox中获取所选值,并在Label上设置:

selected.setText(emailComboBox.getValue());

由于您正在使用字符串,因此您还应设置ComboBox的参数化类型,如下所示:

ComboBox<String> emailComboBox = new ComboBox<>();

答案 4 :(得分:-1)

试试这个:

String surName=cmbSurName.getSelectionModel().getSelectedItem().toString();
System.out.println(surName);