Stackoverflow i custom CellRenderer til JList
Hejsa eksperter,jeg er ved at lave en custom CellRenderer, og jeg får igen og igen og igen en stackoverflow, da min GUI bliver ved med at repainte JList'en (og kalder renderen rimeligt tit), jeg har selv forsøg at implementere en cache'ing funktionalitet, men der bliver aldrig hentet en renderer fra cachen... Har i noget bud på hvad jeg gør galt ?.... Her er koden i hvert fald:
import java.awt.event.*;
import java.util.*;
import java.text.SimpleDateFormat;
import javax.swing.*;
import commonServices.domain.*;
public class ResultItem extends JPanel implements ListCellRenderer
{ private JLabel cat;
private JTextArea descProb;
private JLabel date;
private JLabel hasMecSol;
private int time = 0;
private HashMap rendererComponents = new HashMap();
public synchronized Component getListCellRendererComponent(JList list,
Object value, int index, boolean isSelected, boolean cellHasFocus) {
System.out.println ("Painting for #"+(++time));
if (value != null && value instanceof Solution) {
// --- First check if component to display value has been created ---
Component toRenderFrom = (Component)rendererComponents.get(value);
if (toRenderFrom != null) {
System.out.println ("Painting from existing component");
return toRenderFrom;
}
// --- Else create a new component ---
System.out.println ("Painting from new component");
Solution sol = (Solution)value;
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
// The solutions Catagory-placement
Cat1 cat3 = sol.getCat3();
String catToDisplay = cat3.getCat1Name()+" > "+cat3.getCat2()[0].getCat2Name()+
" > "+(cat3.getCat2()[0]).getCat3()[0].getCat3Name();
cat = new JLabel(catToDisplay);
cat.setFont(new Font("Dialog", Font.BOLD, 14));
cat.setBackground(Color.white);
cat.setForeground(Color.blue);
cat.setOpaque(true);
add(cat);
// Display the last-changed property and if has MecSolution-attached to it
JPanel doubleInfo = new JPanel(new FlowLayout(FlowLayout.LEFT));
JLabel temp = new JLabel("Sidst rettet:");
temp.setBackground(Color.white);
temp.setForeground(Color.black);
temp.setFont(new Font("Dialog", Font.BOLD, 12));
doubleInfo.add(temp);
temp = new JLabel(new SimpleDateFormat("dd/MM-yyyy - HH:mm:ss").format(sol.getSolDate()));
temp.setBackground(Color.white);
temp.setForeground(Color.gray);
temp.setFont(new Font("Dialog", Font.PLAIN, 12));
doubleInfo.add(temp);
temp = new JLabel("Har mekaniker-løsning:");
temp.setBackground(Color.white);
temp.setForeground(Color.black);
temp.setFont(new Font("Dialog", Font.BOLD, 12));
doubleInfo.add(temp);
temp = new JLabel(sol.getMecSol() == null ? "Nej" : "Ja");
temp.setBackground(Color.white);
temp.setForeground(Color.gray);
temp.setFont(new Font("Dialog", Font.PLAIN, 12));
doubleInfo.add(temp);
// The problem (display two lines);
descProb = new JTextArea(sol.getProblem(), 2, 20);
descProb.setEditable(false);
descProb.setLineWrap(true);
descProb.setPreferredSize(new Dimension(
list.getPreferredSize().width, descProb.getPreferredSize().height));
descProb.setBorder(BorderFactory.createEmptyBorder(1,1,1,1));
descProb.setBackground(Color.white);
descProb.setForeground(Color.black);
descProb.setFont(new Font("Dialog", Font.PLAIN, 12));
descProb.setOpaque(true);
add(descProb);
rendererComponents.put(value, this);
return this;
}
return new JLabel(value.toString());
}
}
