⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iconcombox.java

📁 电子工业出版社出版的《java2应用开发指南》配套光盘源代码
💻 JAVA
字号:
//IconCombox.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;

public class IconCombox extends JComboBox
{
	//构造方法
	public IconCombox(ImageIcon[] img, String[] strText)
	{	
		//获取两个数组的大小的最小值,防止二者不一致,导致越界
		int nItemCount=Math.min(img.length,strText.length);
		ItemData[] objList=new ItemData[nItemCount];
		for( int i=0; i< nItemCount; i++ ){
			objList[i]=new ItemData(img[i],strText[i]);
		}
		
		//设置数据模型
		this.setModel(new DefaultComboBoxModel(objList));
		//设置定制单元绘制器
		this.setRenderer(new IconComboRenderer());
	}
	
	/*
	*  封装列表单元项包括图标和显示字符串
	*/
	class ItemData
	{
	    private ImageIcon   img;
	    private String strText;
	    
	    //构造函数,直接继承父类
	    public ItemData(ImageIcon icon, String text)
	    {
			img=icon;
			strText=text;
	    }
	
	    
	    //获取显示名
	    public String getText( )
	    {
	        return strText;
	    }
	
	    //获取图标对象
	    public Icon getIcon()
	    {
			return img;
	    }
	    //类字符串化
	    public String toString()
	    {
	    	return strText;
	    }
	}
	
	/**
	 * <pre>
	 * 用于绘制ComboBox的单元项,该绘制器对应的Model的每一项是一个对象数组,包括String和Icon.
	 * </pre>
	 */
	class IconComboRenderer extends JLabel implements ListCellRenderer
	{
	    //获得和失去焦点时绘制器使用的border.
	    private Border lineBorder = BorderFactory.createLineBorder(Color.red, 4);
	    private Border emptyBorder = BorderFactory.createEmptyBorder(2,2,2,2);
	
	    //构造函数,设置为透明.
	    public IconComboRenderer()
	    {
			setOpaque(true);
	    }
	
	    //实现该方法,控制单元的绘制
	    public Component getListCellRendererComponent(JList list,Object value,int index,boolean isSelected,boolean cellHasFocus)
	    {
	        //绘制列表单元项的文本
	        setText(((ItemData)value).getText());
	        //绘制列表单元项的图标
			this.setIcon(((ItemData)value).getIcon());
	
	        //根据选择状态的不同,对前、背景进行选择设置
			if(isSelected)
			{
		  	    setForeground(list.getSelectionForeground());
			    setBackground(list.getSelectionBackground());
			}
			else
			{
			    setForeground(list.getForeground());
			    setBackground(list.getBackground());
			}
		
			//根据焦点状态的不同,对边框进行设置
		    if(cellHasFocus) setBorder(lineBorder);
			else    setBorder(emptyBorder);
		
			return this;
	    }
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -