swing快速入门(四十一)改变列表外观

发布时间:2024年01月08日

注释很详细,直接上代码

新增内容
🍉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

文章来源:https://blog.csdn.net/m0_73756108/article/details/135436995
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。