Avatar billede Slettet bruger
21. oktober 2003 - 13:26 Der er 1 løsning

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());
    }
}
Avatar billede Slettet bruger
21. oktober 2003 - 14:21 #1
OK, jeg løste selv problemet ved at "stykke komponenten sammen" i en constructor (som jeg oprettede), og så nøjedes jeg bare med at skifte værdierne i JLabels/JTextArea i getListCellRendererComponent-metoden. Det hjalp :-) Nå, det betyder vel at jeg lukker spørgsmålet :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester