Java Swing: JList с выбранным элементом ListCellRenderer разной высоты

Я делаю свой собственный ListCellRenderer. Я знаю, что вы можете иметь разные размеры для каждой отдельной клетки. Но теперь я хочу иметь другое измерение для выбранной ячейки. Каким-то образом JList кэширует измерение для каждой отдельной ячейки при первом вычислении границ для каждой ячейки. Это мой код:

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 ints = new Vector();
        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);
    }
}

В комментариях вы можете увидеть, что яя уже пробовал.

Мы уже искали довольно долго и нашли много бесполезных статей, некоторые из них касаются функции ListCellRenderer / динамической высоты, но они работают только потому, что высота остается неизменной для отдельных ячеек. Мои высоты меняются, так как мне это сделать?

Ответы на вопрос(7)

Ваш ответ на вопрос