2016-02-29 6 views
1

Так что у меня есть JList из JLabel объектов, у которых есть изображение и некоторый текст, прикрепленный к ним.Как получить мои JLabel Icons для рендеринга в моем JList?

Results

Все выглядит хорошо для того, что значки не отображаются изображения, за исключением.

public static void createIcons(){ 
    char[] extension = new char[4]; 
    Image img; 
    try { 
     for(int i = 0; i < FtpClient.FilesOnServer.length; i++) { 
      for(int j = 0; j < 4; j++) { 
       extension[3 - j] = FtpClient.FilesOnServer[i].charAt(FtpClient.FilesOnServer[i].length() - (j+1)); 
       if(j == 3) { 
        System.out.println(extension); 
        String fileType = new String(extension); 
        JLabel iconLabel = new JLabel(); 
        switch (fileType){ 
        case ".pdf": 
         iconLabel.setIcon(new ImageIcon(FtpWindow.class.getResource("icons\\text.png"))); 
         break; 
        case ".png": 
         iconLabel.setIcon(new ImageIcon(FtpWindow.class.getResource("icons\\picture.png"))); 
         break; 
        case ".jpg": 
         iconLabel.setIcon(new ImageIcon(FtpWindow.class.getResource("icons\\picture.png"))); 
         break; 
        case ".txt": 
         iconLabel.setIcon(new ImageIcon(FtpWindow.class.getResource("icons\\text.png"))); 
         break; 
        default: 
         iconLabel.setIcon(new ImageIcon(FtpWindow.class.getResource("icons\\default.png"))); 
         break; 
        } 
        iconLabel.setText(FtpClient.FilesOnServer[i]); 
        iconLabel.setVerticalTextPosition(SwingConstants.BOTTOM); 
        iconLabel.setVerticalAlignment(SwingConstants.BOTTOM); 
        model.addElement(iconLabel); 
       } 
      } 
     } 
     T_FileLayout = new JList(model); 
    } catch(Exception ex){ 
     ex.printStackTrace(); 
    } 
} 

public static void BuildFtpWindow(){ 
    P_FilesOnServer = new JPanel(); 
    B_UPLOAD.setBounds(10, 9, 110, 25); 
    B_UPLOAD.setText("UPLOAD"); 
    B_DOWNLOAD.setBounds(10, 39, 110, 25); 
    B_DOWNLOAD.setText("DOWNLOAD"); 
    P_FilesOnServer.setBounds(130, 9, 320, 288); 
    P_FilesOnServer.setBackground(new Color(255, 255, 255)); 
    createIcons(); 
    P_FilesOnServer.add(T_FileLayout); 
    ServerBrowser.add(P_FilesOnServer); 
    ServerBrowser.add(B_DOWNLOAD); 
    ServerBrowser.add(B_UPLOAD); 
} 

Я видел сообщение о перекрывая DefaultListCellRenderer, но я понятия не имею, что я должен дать его стоимости объекта. Я просто пытаюсь отобразить значок и текст, которые идут с ним. Я чувствую, что я рядом, но просто не могу понять, почему он не ведет себя.

Получение аналогичного поведения, как и раньше, похоже, дает ссылку на объект вместо его рендеринга. New Result

Вот класс, который я создал (он находится в собственном файле класса и не вставлен против кода после него). И вызовы вместе с переопределенной функцией.

import java.awt.Image; 
import javax.swing.ImageIcon; 

public class ServerFileIcon{ 

    public ImageIcon Image; 
    public String Text; 

    public void setImage(String path){ 
     Image = new ImageIcon(getClass().getResource(path)); 
    } 

    public void setText(String text){ 
     Text = text; 
    } 

    public ImageIcon getIcon(){ 
     return Image; 
    } 

    public String getText(){ 
     return Text; 
    } 
} 

ServerFileIcon iconLabel = new ServerFileIcon(); 
       switch (fileType){ 
        case ".pdf": 
        iconLabel.setImage("icons\\text.png"); 
        break; 
        case ".png": 
        iconLabel.setImage("icons\\picture.png"); 
        break; 
        case ".jpg": 
        iconLabel.setImage("icons\\picture.png"); 
        break; 
        case ".txt": 
        iconLabel.setImage("icons\\text.png"); 
        break; 
        default: 
        iconLabel.setImage("icons\\default.png"); 
        break; 
       } 
       iconLabel.setText(FtpClient.FilesOnServer[i]); 
       model.addElement(iconLabel); 
      } 
      } 
     } 
     T_FileLayout = new JList(model); 
    }catch(Exception ex){ 
     ex.printStackTrace(); 
    } 
    } 

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

     ServerFileIcon customObject = (ServerFileIcon)value; 

     setText(customObject.getText()); 
     setIcon(customObject.getIcon()); 

     return this; 
    } 
+0

Спасибо за редактирование не знало, что вы могли бы сделать, что – chewbapoclypse

+0

Вы можете вставлять изображения в вашем вопросе, если у вас есть достаточно репутаций (минимум 10 IIRC). Другие люди могут редактировать его, хотя, вот что я сделал. –

+0

@TT этот вопрос все еще виден? все еще ищет какую-то помощь – chewbapoclypse

ответ

1

Так у меня есть JList из JLabel объектов

Вы не должны использовать объекты JLabel в вашем JList. Компоненты Swing используют средства визуализации для повышения эффективности.

Вместо этого вы должны создать пользовательский объект, который имеет 2 свойства: текст, значок. Затем в коде рендеринга вы просто устанавливаете текст и значок рендерера (который по умолчанию является JLabel) со значениями из вашего пользовательского объекта.

Я видел сообщение об переопределении DefaultListCellRenderer, но я понятия не имею, что я должен дать ему для Object Value.

Значением объекта будет пользовательский объект, упомянутый выше.

Так что основной код будет что-то вроде:

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

    MyCustomObject customObject = (MyCustomObject)value; 

    setText(customObject.getText()); 
    setIcon(customObject.getIcon()); 

    return this; 
} 
+0

Итак, сделайте так класс, который имеет две вещи: Изображение и некоторый текст, а затем два метода оценки. Создайте те объекты, которые я делал с ярлыками. Сохраните эти объекты в Vector. Передайте вектор в список. а затем переопределить эту функцию. Как только я переопределю эту функцию (я уже расширил свой класс до DefaultListCellRenderer), мне не нужно правильно вызывать метод getListCellRendererComponent? – chewbapoclypse

+0

@chewbapoclypse, 'Мне не нужно правильно обращаться к методу getListCellRendererComponent?' - Правильно, JList вызывает этот метод для вас всякий раз, когда ему нужно визуализировать объект. – camickr

+0

Спасибо за объяснение !! У JList также есть свой собственный приемник действий? Поэтому я могу получить текст от объекта по щелчку. – chewbapoclypse