Java Swing: JList com o item selecionado ListCellRenderer altura diferente

Estou fazendo um ListCellRenderer personalizado. Eu sei que você pode ter dimensões diferentes para cada célula individual. Mas agora eu quero ter uma dimensão diferente para a célula selecionada. De alguma forma, o JList está armazenando em cache a dimensão para cada célula individual na primeira vez que ela tem que calcular os limites para cada célula. Este é o meu código:

public class Test {

    static class Oh extends JPanel {

        public Oh() {
            setPreferredSize(new Dimension(100, 20));
        }

        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.WHITE);
            g.fillRect(0, 0, getWidth(), getHeight());
        }
    }

    static class Yeah extends JPanel {
        private boolean isSelected;

        public Yeah(boolean isSelected) {
            setPreferredSize(new Dimension(100, 100));
            this.isSelected = isSelected;
        }

        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            //setSize(100, 100); // doesn't change the bounds of the component
            //setBounds(0, 0, 100, 100); // this doesn't do any good either.
            if (isSelected) g.setColor(Color.GREEN);
            else g.setColor(Color.BLACK);
            g.fillRect(0, 0, getWidth(), getHeight());
        }
    }

    public static void main(String[] args) {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        f.setSize(800, 500);
        Vector<Integer> ints = new Vector<Integer>();
        for (int i = 0; i < 100; i++) {
            ints.add(i);
        }
        JList list = new JList(ints);
        list.setCellRenderer(new ListCellRenderer() {
            public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
                if (isSelected || ((Integer) value) == 42) return new Yeah(isSelected);
                else return new Oh();
            }
        });
        //list.setPrototypeCellValue(null);
        //list.setFixedCellHeight(-1);
        f.add(new JScrollPane(list));
        f.setVisible(true);
    }
}

Nos comentários você pode ver o que eu já tentei.

Eu já pesquisei bastante e encontrei muitos artigos inúteis, alguns deles tocam na coisa de ListCellRenderer / dynamic height, mas eles só funcionam porque a altura permanece a mesma para as células individuais. Minhas alturas estão mudando, então como faço isso?

questionAnswers(7)

yourAnswerToTheQuestion