2011-07-30 4 views
1

J'ai un JList qui est rempli à travers un ArrayList de chaînes quelque part, je veux pour la même liste maintenant afficher un ImageIcon enregistré dans mon répertoire quelque part. Pour l'instant, je veux afficher la même icône pour tout élément ajouté à la liste (ou tous les éléments actuellement dans la liste).Affichage d'un ImageIcon dans un JList qui utilise un objet différent pour charger les données JList

Ma liste devrait ressembler à ceci: ICON ÉLÈVE NOM ... ICON ÉLÈVE NOM

Le problème (L'icône de l'image montre la bonne hauteur et il est capturé, mais ne montre pas dans la liste à run-time

Voici mon écouteur d'action qui ajoute les données à la liste.

public class StudentListener implements ActionListener{ 

    private Main_Menu menu; 
    private ArrayList<String> arrayList = new ArrayList<String>();; 
    Iterator iterator = arrayList.iterator(); 
    JList sList; 
    Map<Object, Icon> icons = new HashMap<Object, Icon>();   
    /** 
    * 
    * @param menu the referenced menu from our main menu 
    */ 
    public StudentListener(Main_Menu menu){ 
    this.menu = menu;  
    } 

    @Override 
    public void actionPerformed(ActionEvent ae) { 

    Icon iCon = new ImageIcon("/Project/src/Images/1312046124_picture.png"); // icons 
    int iHeight = iCon.getIconHeight(); 
     icons.put("name", iCon);   
     //add all the students to our List 
      try { 
       StudentModel = new Student_Model(); 
      } catch (SQLException ex) { 
       Logger.getLogger(Student_Controller.class.getName()).log(Level.SEVERE, null, ex); 
      } 
    //arrayList = StudentModel.getStudents(); // modify to use an arrayList of string 
    arrayList.add("John"); 
    arrayList.add("Smith"); 
    iterator = arrayList.iterator(); 
    while(iterator.hasNext()){   
     System.out.println(iterator.next().toString()); 
    } 
    sList = this.menu.getStudentList(); 
    sList.setListData(arrayList.toArray()); 
    sList.setFont(new Font("Arial", Font.BOLD, 14)); 
    System.out.println("height of icon " + iHeight); // displays the correct height 
    sList.setCellRenderer(new IconListRenderer(icons));  
    } 
    } 

IconListCellRenderer

public class IconListRenderer 
extends DefaultListCellRenderer { 

private Map<Object, Icon> icons = null; 

public IconListRenderer(Map<Object, Icon> icons) { 
    this.icons = icons; 
} 

@Override 
public Component getListCellRendererComponent(
    JList list, Object value, int index, 
    boolean isSelected, boolean cellHasFocus) { 

    // Get the renderer component from parent class 

    JLabel label = 
     (JLabel) super.getListCellRendererComponent(list, 
      value, index, isSelected, cellHasFocus); 

    // Get icon to use for the list item value 

    Icon icon = icons.get(value); 

    // Set icon to display for value 

    label.setIcon(icon); 
    return label; 
} 
    } 
+2

Vous avez pas encore posté un SSCCE! Nous n'avons pas accès à StuentModel ou à l'IconListRenderer. Nous n'avons même pas besoin du StudentModel pour un SSCCE. Tout ce que vous avez à faire est de nommer certains noms d'élèves dans votre ArrayList. Je suppose que le problème est rendu. ** Publiez un SSCCE approprié si vous voulez de l'aide **. Je suis fatigué de vous rappeler chaque fois que vous postez une question. – camickr

+0

Je suis d'accord avec camickr: il est vraiment impossible de deviner pourquoi votre code ne fonctionne pas sans un petit exemple de travail. C'est à vous de décider si vous souhaitez fournir un SSCCE - combien avez-vous besoin de notre aide? –

+0

@Camickr, pas besoin d'être animé J'étais vraiment proche de résoudre ce problème et pensé peut-être que je n'utilisais pas la propriété ListCellRenderer correctement, c'est pourquoi j'ai posté le code de référence. Je vais mettre à jour mon post pour avoir une meilleure réponse. – Warz

Répondre