【问题标题】:How to programmatically set a string value in a JavaFX ComboBox如何以编程方式在 JavaFX ComboBox 中设置字符串值
【发布时间】:2016-08-14 00:27:36
【问题描述】:

基本上,这就是我需要的:

我有一个 JavaFX 组合框,它被设置为可编辑。由于它是可编辑的,因此那里有一个小文本字段,有人可以在其中输入字符串。我想使用以前生成的数据来填充那个小文本字段。我该如何做到这一点?

    enterSchoolName.setSelectionModel((SingleSelectionModel<String>) FXCollections.observableArrayList(studentData.getSchoolName()));

这就是我所拥有的相关代码和解决方案的“尝试”。

【问题讨论】:

    标签: java javafx combobox


    【解决方案1】:

    可以在构造函数中设置ComboBox的数据项:

     ObservableList<String> data = FXCollections.observableArrayList("text1", "text2", "text3");
     ComboBox<String> comboBox = new ComboBox<>(data);
    

    或以后:

    comboBox.setItems(data);
    

    要选择一个数据项,可以在SelectionModel中选择相应的索引或该项本身:

    comboBox.getSelectionModel().select(0);
    comboBox.getSelectionModel().select("text1");
    

    还可以为组合框编辑器设置一个值,该值不包含在底层数据模型中:

    comboBox.setValue("textXXX");
    

    【讨论】:

      【解决方案2】:

      可编辑的ComboBox 中的“小文本字段”称为ComboBox 的editor。这是一个普通的TextField 对象。要访问该对象,您需要使用方法ComboBox#getEditor()。这样您就可以使用TextField 类的方法。如果我理解正确,您要做的就是设置 TextField 的文本。

      这是通过comboBox.getEditor().setText(text) 或comboBox.setValue(text) 完成的。这两种方法都将设置 ComboBox 的文本。

      但是当您想要获取该文本时会有所不同。 ComboBox#getValue() ComboBox#getEditor()#getText() 不一定返回相同的值。

      考虑以下示例:

      import javafx.application.Application;
      import javafx.geometry.Insets;
      import javafx.scene.Scene;
      import javafx.scene.control.ComboBox;
      import javafx.scene.control.Label;
      import javafx.scene.layout.GridPane;
      import javafx.scene.layout.VBox;
      import javafx.stage.Stage;
      
      public class TestComboBox extends Application {
          @Override
          public void start(Stage stage) {
              ComboBox<String> comboBox = new ComboBox<String>();
              comboBox.setEditable(true);
              comboBox.setValue("Test");
              comboBox.getItems().addAll("Test", "Test2", "Test3");
      
              VBox content = new VBox(5);
              content.getChildren().add(comboBox);
              content.setPadding(new Insets(10));
      
              GridPane valueGrid = new GridPane();
      
              Label cbValue = new Label();
              cbValue.textProperty().bind(comboBox.valueProperty());
              Label cbText = new Label();
              cbText.textProperty().bind(comboBox.getEditor().textProperty());
      
              valueGrid.add(new Label("ComboBox value: "), 0, 0);
              valueGrid.add(new Label("ComboBox text: "), 0, 1);
              valueGrid.add(cbValue, 1, 0);
              valueGrid.add(cbText, 1, 1);
      
              content.getChildren().add(valueGrid);
      
              stage.setScene(new Scene(content));
              stage.show();
          }
      
          public static void main(String[] args) {
              launch();
          }
      }
      

      如果您通过选择列表中的替代项来更改ComboBox 中的文本,ComboBox#valueProperty() 和ComboBox#getEditor#textProperty() 都会发生变化。但正如您所看到的,如果您在 ComboBox 中输入内容,则只有 textProperty 会发生变化。

      因此,当您设置ComboBox 的文本时,请使用您想要的任何方法,但要注意检索该文本时的区别。

      【讨论】:

        猜你喜欢
        • 2011-05-02
        • 2010-09-26
        • 2011-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多