我一直在努力为ComboBox
创建自定义渲染器,这样我就可以在每个单元格中都有一个包含JLabel
的可点击Icon
。
我遇到的问题是,MouseEvent
似乎无法到达JList
内BasicComboPopup
内部的组件。
这是返回应该呈现的Component的组件:
@Override
public Component getListCellRendererComponent( final JList<? extends E> list, final @Nullable E value, final int index,
final boolean isSelected, final boolean cellHasFocus )
{
final Component plafComponent = plafRenderer.getListCellRendererComponent( list, value, index, isSelected, cellHasFocus );
if ( value instanceof String && value.equals( BasicComboBox.SEPARATOR ) )
{
return new JSeparator( SwingConstants.HORIZONTAL );
}
final JPanel panel = new JPanel( new MigLayout( new LC().fill().flowX().insetsAll( "0" ) ) );
final Optional<JLabel> cast = Optionals.cast( plafComponent, JLabel.class );
cast.ifPresent( label ->
{
label.setText( converter.apply( value ) );
panel.add( label, new CC().growX().pushX() );
panel.setBackground( label.getBackground() );
} );
if ( decideIfShowIcon.apply( value ) )
{
final IconLabelWithAction<E> iconLabel = new IconLabelWithAction<>( icon, onClickIconConsumer, value );
panel.add( iconLabel, new CC().alignX( "center" ).gapRight( "5" ) );
iconLabel.addMouseListener( new MouseAdapter()
{
@Override
public void mouseReleased( final MouseEvent e )
{
System.out.println( "Never happens" );
}
} );
}
return panel;
}
绘制图标工作正常,它们只是不可点击,我不确定为什么。
我也尝试在JList
上捕捉事件,甚至没有效果。