如何重置ComboBox并显示PromptText?

时间:2018-05-28 15:12:54

标签: java javafx combobox

注意: 我正在扩展重复问题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,似乎没有任何工作可以恢复提示文字。

1 个答案:

答案 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);
        }
    }
}