如何让我的 JLabel 图标呈现在我的 JList 中?
How to get my JLabel Icons to render in my JList?
所以我有 JList
个 JLabel
个对象,这些对象附有图像和一些文本。
一切看起来都不错,除了图标没有显示图像。
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
的 post,但我不知道应该为对象值赋予什么。我只是想显示图标和随之而来的文本。我觉得我很亲密,但就是想不通为什么它不正常。
获得与以前类似的行为,它似乎是在提供对对象的引用而不是渲染它们。New Result
这是我创建的 class(它在自己的 class 文件中,并没有与它后面的代码相抵触)。以及调用以及被覆盖的函数。
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;
}
所以我有 JList
个 JLabel
个对象,这些对象附有图像和一些文本。
一切看起来都不错,除了图标没有显示图像。
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
的 post,但我不知道应该为对象值赋予什么。我只是想显示图标和随之而来的文本。我觉得我很亲密,但就是想不通为什么它不正常。
获得与以前类似的行为,它似乎是在提供对对象的引用而不是渲染它们。New Result
这是我创建的 class(它在自己的 class 文件中,并没有与它后面的代码相抵触)。以及调用以及被覆盖的函数。
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;
}