2016-02-29 33 views
1

所以我有一个JListJLabel有一个图像和一些文字附加到他们的对象。如何让我的JLabel图标在我的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

所以我有一个JLabel的一个JList对象

你不应该使用的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方法吗? - 正确的,当需要呈现一个Object时,JList会为你调用这个方法。 – camickr

+0

感谢您的解释! JList也有它自己的Action Listener?所以我可以从单击对象中获取文本。 – chewbapoclypse

相关问题