2

我正在扩展 ComboBox 并尝试自定义按钮图形,使其根据是否选择了列表中的项目来显示选中/未选中状态。默认情况下没有选择任何值,所以它只是显示提示文本,我希望它显示“未选中”图形,但在用户选择一个值之前,我似乎无法显示任何类型的图形,哪种方式违背了拥有图形的目的......

public class ComponentComboBox extends ComboBox<String> {

    String promptText;
    boolean promptAsPrefix = true; // keeps the prompt as a prefix to the selected item
    final ImageView checked = new ImageView( new Image( Main.actions.getClass().getResourceAsStream( "res/checked.png" ) ) );
    final ImageView unchecked = new ImageView( new Image( Main.actions.getClass().getResourceAsStream( "res/unchecked.png" ) ) );

    public ComponentComboBox( String promptText, boolean promptAsPrefix, int maxWidth ) {
        init( promptText, promptAsPrefix, maxWidth );
    }

    private void init( final String promptText, final boolean promptAsPrefix, int maxWidth ) {
        this.promptText = promptText;
        this.promptAsPrefix = promptAsPrefix;
        setPromptText( promptText );
        setMaxWidth( maxWidth );
        setPrefWidth( maxWidth );
        Callback<ListView<String>,ListCell<String>> cb = new Callback<ListView<String>,ListCell<String>>() {
            @Override public ListCell<String> call( ListView<String> p ) {
                ListCell<String> ret = new ListCell<String>() {
                    @Override protected void updateItem( String item, boolean empty ) {
                        super.updateItem( item, empty );
                        if ( item == null || empty ) {
                            setGraphic( unchecked );
                        } 
                        else {
                            setGraphic( checked );
                            if ( promptAsPrefix ) {
                                setText( promptText + " " + item );
                            }
                        }
                    }
                };
                ret.setGraphic( unchecked );
                return ret;
            }
        };
        setButtonCell( cb.call( null ) );
    }
}

当没有选择任何值时,甚至可以显示自定义图形吗?

4

1 回答 1

1

以下对我有用:

setButtonCell( cb.call( null ) );
Platform.runLater(new Runnable() {
        @Override
        public void run() {
            getButtonCell().updateIndex(0);
        }
    });
于 2016-09-08T12:59:12.033 回答