注意: 我正在扩展重复问题here,因为它不包含MCVE。我发现的其他几个类似的问题也不包括工作答案。
清除选择后,我无法找到ComboBox
显示PromptText
的方法。
这是MCVE:
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
final VBox root = new VBox(10);
root.setAlignment(Pos.TOP_CENTER);
root.setPadding(new Insets(10));
final ComboBox<String> cboSelection = new ComboBox<>();
final Button btnClear = new Button("Clear");
// Set ComboBox selections
final ObservableList<String> subjectsList = FXCollections.observableArrayList();
subjectsList.addAll("Software", "Math", "Physics");
// Setup the Subject selection
cboSelection.setPromptText("Select Subject");
cboSelection.setItems(subjectsList);
// Set action for "Clear" button
btnClear.setOnAction(e -> {
cboSelection.setValue(null);
});
root.getChildren().addAll(cboSelection, btnClear);
primaryStage.setTitle("ComboBox Demo");
primaryStage.setScene(new Scene(root, 200, 100));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
点击&#34;清除&#34;按钮会将所选值设置为null
并清除ComboBox
的选择,但提示文本不会再次显示。这似乎不是正常的预期行为。
我在按钮的clearSelection()
中尝试了setPromptText()
以及onAction
,似乎没有任何工作可以恢复提示文字。
答案 0 :(得分:1)
根据documentation,这里根本不应显示提示文字:
在所有情况下都不显示提示文本,它依赖于ComboBoxBase的子类来阐明何时显示promptText。例如,在大多数情况下,当组合框不可编辑时,永远不会显示提示文本(即,仅当通过文本输入允许用户输入时才显示提示文本。)
如果您想在选择为空时看到一些提示文本(并且您没有可编辑的组合框),请在组合框中使用自定义buttonCell
:
cboSelection.setPromptText("Select Subject");
cboSelection.setButtonCell(new ListCell<String>() {
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty) ;
if (empty || item == null) {
setText("Select Subject");
} else {
setText(item);
}
}
});
请注意,您似乎 需要设置提示文字,如问题中的代码所示,以便最初显示文本。我认为这是因为同样的错误(我猜测库代码错误地将按钮单元格的文本设置为最初的提示文本;如果没有设置提示文本,则文本设置为{{ 1}},显然在后调用按钮单元格的更新方法。)
显然,您可以通过创建null
的命名子类:
ListCell
然后只是
public class PromptButtonCell<T> extends ListCell<T> {
private final StringProperty promptText = new SimpleStringProperty();
public PromptButtonCell(String promptText) {
this.promptText.addListener((obs, oldText, newText) -> {
if (isEmpty() || getItem() == null) {
setText(newText);
}
});
setPromptText(promptText);
}
public StringProperty promptTextProperty() {
return promptText ;
}
public final String getPromptText() {
return promptTextProperty().get();
}
public final void setPromptText(String promptText) {
promptTextProperty().set(promptText);
}
@Override
protected void updateItem(T item, boolean empty) {
super.updateItem(item, empty);
if (empty || item == null) {
setText(getPromptText());
} else {
setText(item);
}
}
}