簡體   English   中英

如何以編程方式在JavaFX ComboBox中設置字符串值

[英]How to programmatically set a string value in a JavaFX ComboBox

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

我有一個JavaFX ComboBox,它被設置為可編輯。 由於它是可編輯的,因此在那里有一個文本字段,有人可以輸入字符串。 我想使用以前生成的數據來填充那個小文本字段。 我該如何做到這一點?

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

這就是我對相關代碼和解決方案“嘗試”的所有方法。

您可以在構造函數中設置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");

在一個可編輯的“小文本字段” ComboBox被稱為editor中的ComboBox 它是一個普通的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的文本時,請使用您想要的任何方法,但要在檢索該文本時注意區別。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM