2015-04-19 3 views
0

J'essaye de faire un JList fait sur commande, qui montre une liste de tâches, où chaque tâche est représentée comme suit - type: représenté par 3 icônes différentes, statut par 2 icônes et nom comme chaîne simple.Java Swing Cust ListCellRenderer

Mon problème est que, dans un premier temps, le CellRenderer personnalisé n'utiliserait pas les icônes appropriées pour un élément de la liste avant d'avoir mis en surbrillance l'élément. Maintenant, je l'ai changé un peu et il utilise toujours la même icône (task_small.png) Je suis sûr que je passe dans les bonnes données.

Aussi, si vous avez des conseils/critiques sur la façon d'améliorer ce code d'autres façons, je serai heureux de l'entendre. Je ne suis pas sûr si l'utilisation de JPanel est le bon choix.

//imports... 

class TaskListCellRenderer extends JPanel implements ListCellRenderer { 
    private ClassLoader cl = this.getClass().getClassLoader(); 
    private JLabel statusAndName = new JLabel(); 
    private JLabel icon; 

     public TaskListCellRenderer() { 
     setOpaque(true); 
     setLayout(new BorderLayout()); 
     setBorder(new EmptyBorder(5,5,5,5)); 
     } 

     public Component getListCellRendererComponent(JList list, Object value, 
      int index, boolean isSelected, boolean cellHasFocus) { 
     Task entry = (Task) value; 

     if (entry.isStatus()) 
      statusAndName.setIcon(new ImageIcon(cl.getResource("finished.png"))); 
     else 
      statusAndName.setIcon(new ImageIcon(cl.getResource("unfinished.png"))); 
     statusAndName.setText(entry.getName()); 

     statusAndName.setBorder(new EmptyBorder(0,15,0,0)); 
     int type = entry.getType(); 
     System.out.println(type); 
     if (type == 1) 
      icon = new JLabel(new ImageIcon(cl.getResource("task_small.png"))); 
     else if (type == 2) 
      icon = new JLabel(new ImageIcon(cl.getResource("issue_small.png"))); 
     else if (type == 3) 
      icon = new JLabel(new ImageIcon(cl.getResource("request_small.png"))); 


     //My attempts to make this work- at first I had 3 pre-made Icons which I made icon = to; 
     remove(statusAndName); 
     remove(icon); 
     add(icon, BorderLayout.WEST); 
     add(statusAndName, BorderLayout.CENTER); 
     revalidate(); 
     repaint(); 
     if (isSelected) { 
      setBackground(Constants.blue); 
      setForeground(Constants.black); 
     } else { 
      setBackground(Constants.lightGrey); 
      setForeground(Constants.black); 
     } 
     return this; 
     } 
    } 
+2

'statusAndName.setIcon (nouvelle ImageIcon (cl.getResource ("finished.png")))' Un générateur ne doit pas essayer de charger des ressources dans la méthode 'getListCellRendererComponent'! Au lieu de cela, établissez ces ressources en tant qu'attributs de classe et chargez-les une fois dans le constructeur. Plus généralement: Pour une meilleure aide plus rapidement, postez un [MCVE] (http://stackoverflow.com/help/mcve) (Exemple vérifiable complet minimal) ou [SSCCE] (http://www.sscce.org/) , Autonome, exemple correct). –

+0

'ajouter (icône, BorderLayout.WEST); add (statusAndName, BorderLayout.CENTER); 'Attends .. quoi?!? Un moteur de rendu ne doit pas ajouter de nouveaux composants dans la méthode de rendu. Cette méthode pourrait être appelée 100s ou milliers de fois .. –

+0

Oh je viens de réaliser quelque chose ... – CluelessStudent

Répondre

1

Ceci a résolu mes problèmes et est probablement beaucoup plus efficace. Merci tout le monde!

class TaskListCellRenderer extends JPanel implements ListCellRenderer { 
    private ClassLoader cl = this.getClass().getClassLoader(); 
    private JLabel statusAndName = new JLabel(); 
    private JLabel icon = new JLabel(); 
    private Icon finishedIcon = new ImageIcon(cl.getResource("finished.png")); 
    private Icon unfinishedIcon = new ImageIcon(cl.getResource("unfinished.png")); 
    private Icon taskIcon = new ImageIcon(cl.getResource("task_small.png")); 
    private Icon requestIcon = new ImageIcon(cl.getResource("request_small.png")); 
    private Icon issueIcon = new ImageIcon(cl.getResource("issue_small.png")); 

     public TaskListCellRenderer() { 
     setOpaque(true); 
     setLayout(new BorderLayout()); 
     setBorder(new EmptyBorder(5,5,5,5)); 
     add(icon, BorderLayout.WEST); 
     add(statusAndName, BorderLayout.CENTER); 
     } 

     public Component getListCellRendererComponent(JList list, Object value, 
      int index, boolean isSelected, boolean cellHasFocus) { 
     Task entry = (Task) value; 

     if (entry.isStatus()) 
      statusAndName.setIcon(finishedIcon); 
     else 
      statusAndName.setIcon(unfinishedIcon); 

     statusAndName.setText(entry.getName()); 
     statusAndName.setBorder(new EmptyBorder(0,15,0,0)); 

     int type = entry.getType(); 
     System.out.println(type); 
     if (type == 1) 
      icon.setIcon(taskIcon); 
     else if (type == 2) 
      icon.setIcon(issueIcon); 
     else if (type == 3) 
      icon.setIcon(requestIcon); 

     if (isSelected) { 
      setBackground(Constants.blue); 
      setForeground(Constants.black); 
     } else { 
      setBackground(Constants.lightGrey); 
      setForeground(Constants.black); 
     } 
     return this; 
     } 
    }