多亏了Rastislav Komara,我得以轻松解决此问题:
我创建了一个扩展BasicListUI的内部类,并创建了在ListSelectionListener.valueChanged上调用的公共方法:
private class MyRenderer implements ListCellRenderer { public int listSelectedIndex = -1; public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { if (index == listSelectedIndex) return new Yeah(isSelected); else return new Oh(); }}MyRenderer lcr = new MyRenderer();private class MyListUI extends BasicListUI { public void triggerUpdate() { lcr.listSelectedIndex = list.getSelectedIndex(); updateLayoutState(); list.revalidate(); }}JList高度更改时,通常会触发updateLayoutState方法。我在这里所做的唯一“疯狂”的事情是我的渲染器需要知道所选索引是什么。这是因为updateLayoutState方法在高度计算中不使用选定的索引。以某种方式在getListCellRendererComponent中使用list.getSelectedIndex()效果不佳。
编辑:
也检查nevster和kleopatra的分析器,它们看起来更聪明,请首先尝试…



