如何以编程方式在 JavaFX ComboBox 中设置字符串值

Posted

技术标签:

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

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

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

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

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

【问题讨论】:

【参考方案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 中的“小文本字段”称为ComboBoxeditor。这是一个普通的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 的文本时,请使用您想要的任何方法,但要注意检索该文本时的区别。

【讨论】:

以上是关于如何以编程方式在 JavaFX ComboBox 中设置字符串值的主要内容,如果未能解决你的问题,请参考以下文章

我如何以编程方式从另一种方法单击 JavaFX 中的按钮?

如何在 WPF 的 Datagrid 中设置以编程方式生成的 ComboBox 的启用属性?

如何修复 javafx 中的渲染错误(ComboBox、ListView)

如何以编程方式用户根据 JavaFX 中的字符串值定义列表视图的颜色

以编程方式 ComboBox VirtualizingStackPanel WPF

生成int列表以在JavaFX中填充ComboBox