java - 如何让我的 JLabel 图标在我的 JList 中呈现?

标签 java swing jlabel embedded-resource

所以我有一个 JListJLabel 对象,这些对象附加了图像和一些文本。

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;
    } 

最佳答案

So I have a JList of JLabel objects

您不应该在 JList 中使用 JLabel 对象。 Swing 组件使用渲染器来提高效率。

相反,您应该创建一个具有 2 个属性的自定义对象:文本、图标。然后,在渲染代码中,您只需使用自定义对象中的值设置渲染器的文本和图标(默认情况下是 JLabel)。

I have seen a post about overriding DefaultListCellRenderer, but I have no idea what I am supposed give it for 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;
}

关于java - 如何让我的 JLabel 图标在我的 JList 中呈现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35705814/

相关文章:

java - 制作 JPanel 来刷新或重画

java - JLabel图片错误

java - 显示抄袭结果

java - 如何在电子表格 controlsfx 的 GridBase 的 setCellValue 方法中迭代 List<String> 中的值?

java - 如何通过 POST 在 Angular/Spring 中注销

java - 将 List<ClassName> 转换为数组对象以设置为 JComboBoxModel

c# - Lucene 作为数据存储

java - 当 CardLayout 更改时,从另一个面板获取 JTextField 的焦点

java - JLabel重叠

java - 面板顶部的图形