Java Swing: JList avec ListCellRenderer élément sélectionné la taille différente

Je suis en train de faire un custom ListCellRenderer. Je sais que vous pouvez avoir des dimensions différentes pour chaque cellule individuelle. Mais maintenant, je veux avoir une autre dimension de la cellule sélectionnée. En quelque sorte, la JList est la mise en cache de la dimension pour chaque cellule la première fois, elle doit calculer les limites de chaque cellule.
C'est mon code:

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);
}
}

Dans les commentaires, vous pouvez voir ce que j'ai déjà essayé.

J'ai déjà cherché assez longtemps et trouvé beaucoup de nombreux articles inutiles, certains d'entre eux touchent le ListCellRenderer/dynamique de la hauteur de chose, mais ils ne fonctionnent que parce que la hauteur reste la même pour les cellules individuelles. Mon hauteurs sont en train de changer, alors comment puis-je faire cela?

OriginalL'auteur Jaap | 2009-08-15