默认
发表评论 1
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
JList渲染图片和文字一起的列表时有问题
阅读(18353) | 评论(1 收藏 淘帖
JList渲染图片和文字一起的列表时有问题,图片和文字是左右排列的,如下图:
JList渲染图片和文字一起的列表时有问题_微信截图_20190724141738.png
该头像是75*75的正方形的图,并且程序中是使用了ListCellRenderer的。代码如下:
package cn.itechyou.chat.swing;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.InputStream;
import java.net.URL;

import javax.swing.BorderFactory;
import javax.swing.DefaultListCellRenderer;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.SwingConstants;

import org.jim.common.packets.User;
 
/**
 * DefaultListCellRenderer是Swing JList的渲染器
 * ImageCellRender继承DefaultListCellRender,DefaultListCellRender继承于JLabel,所以只要将图片赋给JLabel就可以更改显示样式
 * @author Silly
 *
 */
public class ImageCellRender extends DefaultListCellRenderer {
	private static final long serialVersionUID = 1L;
	
	/**
	 * 重写【ListCellRenderer】的getListCellRendererComponent()方法
	 * JList<? extends Object> list:表示JList中ListModel中存放的对象可以是任何引用类型(从JList的源码得知这个泛型是控制ListModel中对象类型的)
	 * Object value:由list.getModel().getElementAt(index)返回的值,也就是当前正在绘制的对象
	 * index:当前选择的单元格下标
	 * isSelected:单元格被选择的状态(这个被选择是发生在选择单元格改变时,如果选了A再选A返回是false,如果选了A选B再选A才为true)
	 * cellHasFocus:和isSelected的效果一样 不过没有用到这个参数 不知道有什么作用
	 */
	@Override
	public Component getListCellRendererComponent(JList<? extends Object> list,
			Object value, int index, boolean isSelected, boolean cellHasFocus){
		super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
		if(value instanceof User){
			User user = (User) value;
			try{
				URL url = new URL(user.getAvatar());
				ImageIcon icon = new ImageIcon("d:/3_qq_40064948.jpg");
				
				icon.setImage(icon.getImage().getScaledInstance(30, 30, Image.SCALE_DEFAULT));
				int iconWidth = icon.getIconWidth();
				int iconHeight = icon.getIconHeight();
				
				setIcon(icon);
				setText(user.getNick());
				setIconTextGap(10);
				setSize(iconWidth, iconHeight);
				setForeground(new Color(36, 27, 48));
				if(cellHasFocus){
					setForeground(new Color(255, 255, 255));
					setBackground(new Color(36, 27, 48));
				}else {
					setForeground(new Color(36, 27, 48));
					setBackground(new Color(255, 255, 255));
				}
				setVerticalTextPosition(SwingConstants.CENTER);
				setHorizontalTextPosition(SwingConstants.RIGHT);
				setBorder(BorderFactory.createMatteBorder(5, 5, 5, 5, new Color(255, 255, 255)));
			}catch(Exception e){
				e.printStackTrace();
			}
		}
		return this;
	}
}

package cn.itechyou.chat.swing;

import java.util.ArrayList;
import java.util.List;

import javax.swing.AbstractListModel;

import org.jim.common.packets.User;

public class FriendListModel extends AbstractListModel<User> {
	private static final long serialVersionUID = 1L;
	private List<User> users = new ArrayList<User>();

	public void addElement(User file) {
		this.users.add(file);
	}

	public int getSize() {
		return users.size();
	}

	public User getElementAt(int index) {
		return users.get(index);
	}
	
	public boolean contains(User u) {
		for (User user : users) {
			if(user.getId().equals(u.getId())) {
				return true;
			}
		}
		return false;
	}

}


即时通讯网 - 即时通讯开发者社区! 来源: - 即时通讯开发者社区!

上一篇:menuItem前面的空白如何去掉(红色标注)?下一篇:JTable网格显示问题
推荐方案
评论 1
或是大家告诉我因为什么图片显示不全?需要怎么设置?
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部