注释很详细,直接上代码
新增内容
🍉1.使用ImageCellRenderer作为列表项绘制器
🍉2.使用getListCellRendererComponent返回已配置用于显示指定值的组件
🍉3.使用getPreferredSize设置单元项大小
🍉4.Icon的接口类ImageIcon的使用
package swing31_40;
import javax.swing.*;
import java.awt.*;
public class swing_test_39 {
//定义一个窗口
private JFrame jFrame = new JFrame("好友列表");
//定义好友列表名称
private String[] friends = {
"弄玉",
"李清照",
"苏格拉底",
"李白",
"虎头"
};
//定义一个JList对象
JList friendsList = new JList(friends);
//初始化方法
public void init() {
//设置JList使用ImageCellRenderer作为列表项绘制器
friendsList.setCellRenderer(new ImageCellRenderer());
//将JList添加到窗口中
jFrame.add(new JScrollPane(friendsList));
//设置窗口的关闭方式
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置窗口的大小自适应
jFrame.pack();
//设置窗口可见
jFrame.setVisible(true);
}
//主方法
public static void main(String[] args) {
//启动程序
new swing_test_39().init();
}
//定义一个JPanel对象,用于绘制列表项
class ImageCellRenderer extends JPanel implements ListCellRenderer {
//定义一个ImageIcon对象,用于绘制列表项
//为什么使用Icon的接口类ImageIcon?
//因为drawImage方法需要image类型的对象,而Icon没有获取为Image的方法
private ImageIcon icon;
//定义列表项的文本名字
private String name;
//定义绘制单元格的背景色
private Color background;
//定义绘制单元格的前景色
private Color foreground;
//重写getListCellRendererComponent方法
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
//获取好友头像
icon = new ImageIcon("img/" + value + ".gif");
//获取好友昵称
name = value.toString();
//获取列表项的背景色和前景色(系统决定的)
background = isSelected ? list.getSelectionBackground() : list.getBackground();
foreground = isSelected ? list.getSelectionForeground() : list.getForeground();
//返回当前JPanel对象,作为列表项绘制器
return this;
}
//重写paintComponent方法
@Override
protected void paintComponent(Graphics g) {
//获取好友头像的大小
int width = icon.getImage().getWidth(null);
int height = icon.getImage().getHeight(null);
//填充背景矩形
g.setColor(background);//设置背景色
g.fillRect(0,0,this.getWidth(),this.getHeight());//填充背景矩形
//设置前景色
g.setColor(foreground);
//绘制好友头像
//算式是为了居中对齐
g.drawImage(icon.getImage(),this.getWidth()/2-width/2,10,null);
//绘制好友昵称
g.setFont(new Font("SansSerif",Font.BOLD,18));//设置字体
g.drawString(name,this.getWidth()/2-name.length()*10,height+30);//绘制好友昵称
}
//重写getPreferredSize方法
@Override
public Dimension getPreferredSize() {
//设置列表项的大小
return new Dimension(60,80);
}
}
}
效果演示
素材链接
img-blog.csdnimg.cn/direct/00187776f46e47ac9b5d1a2a62f56310.gif
img-blog.csdnimg.cn/direct/0999283c268c4b09bf5f921d4cd1adf0.gif
img-blog.csdnimg.cn/direct/f32852cba2c84079915d8a5da1ace03a.gif
img-blog.csdnimg.cn/direct/7313d11bc8f24daaa3d541e03655f227.gif
img-blog.csdnimg.cn/direct/d825d59e75d6418aa0579dddaa34a7e1.gif