Как сбросить ComboBox и отобразить PromptText? - PullRequest
0 голосов
/ 28 мая 2018

Примечание: Я расширяю дублирующий вопрос здесь , поскольку он не включает 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);
    }

}

Нажатие кнопки «Очистить» установит выбранное значение на null и очистит выбор ComboBox, но текст подсказки не отображаетсяснова.Это не похоже на нормальное ожидаемое поведение.

Я пробовал clearSelection(), а также setPromptText() в кнопке onAction, и, похоже, ничего не работает, чтобы вернуть текст приглашения.

1 Ответ

0 голосов
/ 28 мая 2018

Согласно документации , текст подсказки здесь вообще не должен отображаться:

Текст подсказки отображается не при всех обстоятельствах, он зависит от подклассов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);
            }
        }
    });

Обратите внимание, что вам кажется также необходимо установить текст приглашения, как в коде в вопросе, чтобы текст отображался изначально.Я предполагаю, что это из-за той же ошибки (я предполагаю, что код библиотеки изначально неправильно устанавливает текст ячейки кнопки в текст подсказки; если текст подсказки не задан, текст устанавливается на 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);
        }
    }
}

итогда просто

cboSelection.setButtonCell("Select Subject");
cboSelection.setButtonCell(new PromptButtonCell<>("Select Subject"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...