首页 > 解决方案 > 我可以删除 ComboBoxListViewSkin 创建的“胡萝卜”(倒三角形)吗?

问题描述

当实现 java ComboBoxListViewSkin 类来管理我的 ComboBox 的弹出侦听器时,这会在 ComboBox 的左上角添加一个“胡萝卜”(见下文)。如果我删除此类实现,它就会消失。我正在使用 CombBoxListViewSkin 的类弹出侦听器来防止 [SPACE] 在按下时选择和关闭 ComboBox,这允许将 [SPACE] 字符作为 AutoComplete 类的一部分输入。

组合框中的“胡萝卜”

这是管理和允许 [SPACE] 作为 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 看起来像应用程序 GUI 中的所有其他 ComboBoxes。虽然这是一个小问题,但对于用户来说,我相信它可能看起来像是应用程序的问题。

标签: comboboxjavafx-8skin

解决方案


已解决:正如上面 Fabian 建议的那样,我在初始化之后和事件过滤之前添加了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();
        }
    });

没有胡萝卜的组合框


推荐阅读