Могу ли я удалить «морковь» (перевернутый треугольник), созданную ComboBoxListViewSkin? - PullRequest
0 голосов
/ 26 апреля 2019

При реализации класса Java ComboBoxListViewSkin для управления прослушивателем всплывающих окон моего ComboBox это добавляет «морковь» в верхний левый угол ComboBox (см. Ниже).Если я удаляю реализацию этого класса, она исчезает.Я использую прослушиватель всплывающих окон класса CombBoxListViewSkin, чтобы запретить [SPACE] выбирать и закрывать ComboBox при нажатии, что позволяет вводить символ [SPACE] как часть класса AutoComplete.

'Carrot' on the ComboBox

Это весь код, который используется для управления и позволяет [ПРОБЕЛУ] работать как часть класса AutoComplete - и отлично работает.Я пытался найти в классе ComboBoxListViewSkin методы или свойства, которые могут это предотвратить, но ничего не решает.Я подумал, что COMBO_BOX_STYLE_CLASS может предложить что-то, но на самом деле все управляет только отображением, добавлением или удалением элементов.Поскольку приведенный ниже код является минимальным необходимым для воссоздания проблемы, он не будет выполнять функцию автозаполнения, но демонстрирует, что удаление и повторная реализация класса ComboBoxListViewSkin вызывает проблему .... или, по-видимому,.

// Main method calling

public class Main extends Application{

    public static void main(String[] args) {
        launch();
    }

    public void start(Stage stage) throws Exception {

        ComboBox cmb = new ComboBox();
        cmb.getItems().setAll("One", "One Two", "One Two Three");
        new ComboBoxAutoComplete(cmb);
        Scene scene = new Scene(new StackPane(cmb));
        stage.setScene(scene);
        stage.setTitle("Test GUI");
        stage.setWidth(300);
        stage.setHeight(300);
        stage.show();
    }
}


// ComboBoxAutoComplete class with ComboBoxListViewSkin initialization
// Minimal of ComboBoxAutoComplete class constructor

import com.sun.javafx.scene.control.skin.ComboBoxListViewSkin;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.control.ComboBox;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;

import java.util.stream.Stream;

@SuppressWarnings("ALL")
public class ComboBoxAutoComplete<T> {

    private ComboBox<T> cmb;
    private String filter = "";
    private ObservableList<T> originalItems;

    private ComboBoxListViewSkin cbSkin;

    public ComboBoxAutoComplete(final ComboBox<T> cmb) {
        this.cmb = cmb;
        originalItems = FXCollections.observableArrayList(cmb.getItems());

        cbSkin = new ComboBoxListViewSkin(cmb);

// Aside from the variable declaration and initialization... this 
// is the only ComboBoxListViewSkin code to handle the [SPACE]

        cbSkin.getPopupContent().addEventFilter(KeyEvent.KEY_PRESSED, (event) -> {
            if (event.getCode() == KeyCode.SPACE) {
                filter += " ";
                event.consume();
            }
        });
    }
}

Я ожидаю, что ComboBox будет выглядеть как все остальные ComboBox в графическом интерфейсе приложения.Хотя это незначительная проблема, для пользователя, я полагаю, это может выглядеть как проблема с приложением.

1 Ответ

0 голосов
/ 26 апреля 2019

Решено: как предложил Фабиан выше, я добавил cmb.setSkin (cbSkin) после инициализации и до фильтрации событий, и это сработало.Думал, что опубликую, чтобы другие увидели, что это решено.

    cbSkin = new ComboBoxListViewSkin(cmb);
    cmb.setSkin(cbSkin);   // <-------------  ADDED

    cbSkin.getPopupContent().addEventFilter(KeyEvent.KEY_PRESSED, (event) -> {
        if (event.getCode() == KeyCode.SPACE) {
            filter += " ";
            event.consume();
        }
    });

ComboBox with No Carrot

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...