我有一个ComboBox,列出了设置的值。我使用setEditable(true)方法使其可编辑,但如何获取用户输入的值?我尝试了getSelectionModel()。getSelectedItem()和getValue()方法,但没有成功。
这是代码。
public class Comparator extends Application {
@Override
public void start(Stage stage) {
stage.setTitle("ComboBoxSample");
Scene scene = new Scene(new Group(), 450, 250);
ComboBox<String> emailComboBox = new ComboBox<>();
emailComboBox.getItems().addAll("A","B","C","D","E");
emailComboBox.setEditable(true);
Button b = new Button("get text");
GridPane grid = new GridPane();
grid.setVgap(4);
grid.setHgap(10);
grid.setPadding(new Insets(5, 5, 5, 5));
Label to = new Label("To: ");
Label selected = new Label();
grid.add(to, 0, 0);
grid.add(emailComboBox, 1, 0);
grid.add(b, 2, 0);
grid.add(selected, 3, 0);
b.setOnAction(e -> {
selected.setText(emailComboBox.????);
});
Group root = (Group) scene.getRoot();
root.getChildren().add(grid);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
我实际上想要获得新输入的值。 PS:如果以防万一,只是为了避免混淆。我可以输入列表中不存在的任何字符串。这将是输入的新值。
答案 0 :(得分:7)
默认情况下,大多数JavaFX控件都不会提交&#34;关于失去焦点的一个值 - 所以TextField
s,当用作较大控件(例如ComboBox
内部的编辑控件时,不会将值提交回父控件,除非用户按下输入。关于这个设计决定存在很多争议:但是这是做出的决定,如果我们要使用JavaFX,我们必须接受或者找到解决方法来获得我们想要的行为。
快速而肮脏&#34;方法是挖掘文本字段并从中获取文本,如@ Ajeetkumar的回答:
selected.setText(emailComboBox.getEditor().getText());
这种方法的问题在于它使应用程序处于不一致状态:标签中显示给用户的值不是组合框模型中保存的值:换句话说emailComboBox.getValue()
返回与标签中显示的值不同的值(因为文本字段中的值从未提交到组合框)。在某些时候,您的应用程序将需要处理显示的数据,程序员(或团队的其他成员)将在组合框的模型中寻找数据的自然位置:即他们将期望数据到在emailComboBox.getValue()
。更好的方法是确保组合框的值在您需要时更新,然后只使用预期的emailComboBox.getValue()
来获取数据。
例如,您可以在文本字段失去焦点时更新值:
emailComboBox.getEditor().focusedProperty().addListener((obs, wasFocused, isNowFocused) -> {
if (! isNowFocused) {
emailComboBox.setValue(emailComboBox.getEditor().getText());
}
});
然后自然:
b.setOnAction(e -> {
selected.setText(emailComboBox.getValue());
});
使用这种方法,应用程序始终处于一致状态:即标签显示组合框的值,这比以后直接从文本字段设置标签的可能性更小。
另一种变体是在编辑器中的文本发生更改后立即更新组合框值:
emailComboBox.getEditor().textProperty().addListener((obs, oldText, newText) -> {
emailComboBox.setValue(newText);
});
请注意,如果您愿意,使用此版本您可以完全免除按钮,只需将标签的文字直接绑定到组合框的值:
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Label;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;
public class Comparator extends Application {
@Override
public void start(Stage stage) {
stage.setTitle("ComboBoxSample");
Scene scene = new Scene(new Group(), 450, 250);
ComboBox<String> emailComboBox = new ComboBox<>();
emailComboBox.getItems().addAll("A","B","C","D","E");
emailComboBox.setEditable(true);
emailComboBox.getEditor().textProperty().addListener((obs, oldText, newText) -> {
emailComboBox.setValue(newText);
});
GridPane grid = new GridPane();
grid.setVgap(4);
grid.setHgap(10);
grid.setPadding(new Insets(5, 5, 5, 5));
Label to = new Label("To: ");
Label selected = new Label();
grid.add(to, 0, 0);
grid.add(emailComboBox, 1, 0);
grid.add(selected, 2, 0);
selected.textProperty().bind(emailComboBox.valueProperty());
Group root = (Group) scene.getRoot();
root.getChildren().add(grid);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
强烈建议保持数据的完整性,以保持应用程序的一致性并使其不太可能在以后引入错误,因此强烈建议更新组合框value
包含要表示的值的属性,然后引用该值。用作编辑器的文本字段实际上是组合框的实现细节,它只应用于修改组合框编辑过程的行为:在此示例中,它用于修改更新行为 - 您还可以在它上面设置一个格式化程序等等。它不应该被用作模型的代理,因为这会使以后的生活变得困难。
答案 1 :(得分:1)
我得到了答案。
emailComboBox.getEditor()。gettext的()
我们在可编辑的ComboBox中键入的textField称为ComboBox的编辑器。它是一个普通的TextField对象。要访问该对象,您需要使用方法 ComboBox.getEditor()。这样您就可以使用TextField类的方法。
答案 2 :(得分:0)
当您更改编辑器值
时,这将更改列表pluginConfig.getEditor().textProperty().addListener((obs, oldText, newText) -> {
if (pluginConfig.getSelectionModel().getSelectedIndex() >= 0)
pluginConfig.getItems().set(pluginConfig.getSelectionModel().getSelectedIndex(),newText);
});
答案 3 :(得分:-1)
您可以使用以下代码行在ComboBox
中获取所选值,并在Label
上设置:
selected.setText(emailComboBox.getValue());
由于您正在使用字符串,因此您还应设置ComboBox
的参数化类型,如下所示:
ComboBox<String> emailComboBox = new ComboBox<>();
答案 4 :(得分:-1)
试试这个:
String surName=cmbSurName.getSelectionModel().getSelectedItem().toString();
System.out.println(surName);