2016-04-21 14 views
0

Grundsätzlich hier auf das, was ich brauche:Wie programmatisch einen String-Wert in einer JavaFX ComboBox

ich JavaFX ComboBox haben, und es wird auf Editierbare gesetzt. Da es editierbar ist, gibt es dort ein kleines Textfeld, in das jemand einen String eingeben kann. Ich möchte zuvor generierte Daten verwenden, um dieses kleine Textfeld zu füllen. Wie erreiche ich das?

Dies ist alles, was ich in der Art von relevanten Code und ein "Versuch" zu einer Lösung haben.

Antwort

5

Sie die Datenelemente eines ComboBox im Konstruktor festlegen:

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

oder später:

comboBox.setItems(data); 

Um ein Datenelement auswählen, können Sie die entsprechende Index in der Auswahl SelectionModel oder das Element selbst:

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

Es ist auch möglich, einen Wert festzulegen an den Combobox-Editor, der in dem zugrunde liegenden Datenmodell nicht enthalten ist:

comboBox.setValue("textXXX"); 
1

Das „kleine Textfeld“ in einer editierbaren ComboBox als editor der ComboBox bekannt. Und es ist ein normales TextField Objekt. Um auf dieses Objekt zuzugreifen, müssen Sie die Methode ComboBox#getEditor() verwenden. Auf diese Weise können Sie die Methoden der Klasse TextField verwenden. Wenn ich Sie richtig verstehe, wollen Sie nur den Text TextField setzen.

Dies geschieht, indem comboBox.getEditor().setText(text) oder comboBox.setValue(text) getan wird. Beide Methoden legen den Text der ComboBox fest.

Aber es gibt einen Unterschied, wenn Sie diesen Text abrufen möchten. ComboBox#getValue()ComboBox#getEditor()#getText() gibt nicht unbedingt den gleichen Wert zurück.

Betrachten Sie das folgende Beispiel:

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(); 
    } 
} 

Wenn Sie den Text in den ComboBox von chosing eine Alternative in der Liste zu ändern, beide ComboBox#valueProperty() und ComboBox#getEditor#textProperty() Änderungen. Aber wie Sie sehen können, wenn Sie etwas in die ComboBox eingeben, ändert sich nur die textProperty.

Verwenden Sie also die gewünschte Methode, wenn Sie den Text der ComboBox festlegen, aber beachten Sie den Unterschied, wenn Sie diesen Text abrufen möchten.

Verwandte Themen