将组合框中的选定项目设置为文本字段

时间:2018-06-25 00:31:20

标签: javafx

我想根据ComboBox中选定的项目设置TextField的文本

1 个答案:

答案 0 :(得分:0)

据我所知,您想根据TextField中选定的项目设置ComboBox的文本。可能您只是在使用,正如您在注释中提到的那样:personnelcongetxt.setText(String.valueOf(personneList.getValue()));,这不会在您每次选择其他项目时更新您的价值。由于默认选择(如果未设置)为null,因此它始终为null,因此它在Textfield中“打印”为null。如果要更新,有两种方法:

  1. 使用绑定。
  2. 使用监听器。

代码如下:

public class Controller implements Initializable {

    @FXML
    private ComboBox<Model> cb;
    @FXML
    private TextField tf;

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        initCB();
        // Solution one : using bindings :
        tf.textProperty().bind(Bindings.when(cb.getSelectionModel().selectedItemProperty().isNull())
                .then("")
                .otherwise(cb.getSelectionModel().selectedItemProperty().asString())); // uses toString of the Model

        // Solution two using listener :
//      cb.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> {
//          tf.setText(newValue.toString()); // or newValue.getName();
//      });
    }

    private void initCB() {
        cb.setItems(FXCollections
                .observableArrayList(new Model("Apple"), new Model("Banana"), new Model("")));
    }

    private class Model {
        private String name;

        public Model(String name) {
            this.name = name;
        }

        public String getName() {
            return name;
        }

        @Override
        public String toString() {
            return name;
        }
    }

}

根据您的选择,结果可能会有所不同。

  • 如果您正在使用第一个解决方案(绑定),则将无法通过键入文本字段的文本来“手动”更改,但是可以确保TextField会显示每个为组合框的选定项目计时。

  • 如果您正在使用第二个解决方案(侦听器),则在选择新项目后,将更新textField的值,但之后您可以随时编辑文本字段,并且可以更改文本到任何字符串。因此,如果要使用此功能,则应采用这种方式。

长话短说:绑定始终显示选定的项目,而侦听器仅在选择新项目后显示。