Swing组件使用JComboBox

JComboBox是一个多功能组合下拉框,多用来显示可选择数据。这个组件是数据和显示进行分离设计,Model用于数据更改,model中的更改会同步到JComboBox中。JComboBox来进行显示。用JComboBox来显示文本数据是很简单的,有时候我们想在JComboBox中显示图文结合的,比如下拉框带图片格式,这里要用到Swing中的渲染器ListCellRenderer。



代码:

package org.suju.swingdemo;

import java.awt.Component;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.DefaultComboBoxModel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JTextField;
import javax.swing.ListCellRenderer;
import javax.swing.SwingConstants;

public class JComboBoxImgDemo {
	/*
	 * boxmodel box数据模型,用于数据更改
	 * frame 显示窗体
	 * box JComboBox组件
	 * add 添加按钮
	 * del 删除按钮
	 * item1, item2 渲染器使用的标签
	 * findicon, helpicon 图标
	 */
	public DefaultComboBoxModel boxmodel;
	public JFrame frame;
	public JComboBox box;
	public JButton add;
	public JButton del;
	public JLabel item1;
	public JLabel item2;
	public ImageIcon findicon = new ImageIcon("img/find.png");
	public ImageIcon helpicon = new ImageIcon("img/help.png");
	
	/*
	 * 初始化
	 * boxmodel = new DefaultComboBoxModel(items);
	 * 创建一个model对象,数据类型为JLabel
	 * 
	 * box.setRenderer(new ImgBoxModel());
	 * 设置box组件的单元渲染器
	 */
	public void init()
	{
		item1 = new JLabel("delete", findicon, SwingConstants.LEFT);
		item2 = new JLabel("tomcat", helpicon, SwingConstants.LEFT);
		JLabel[] items = {item1, item2};
		boxmodel = new DefaultComboBoxModel(items);
		box = new JComboBox(boxmodel);
		box.setRenderer(new ImgBoxModel());
		frame = new JFrame();
		add = new JButton("add");
		del = new JButton("del");
		frame.setLayout(new FlowLayout());
		frame.add(box);
		frame.add(add);
		frame.add(del);
		
		frame.setTitle("JComboBoxDemo");
		frame.setBounds(500, 100, 300, 300);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		//actionlisten 增加按钮监听方法
		add.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				boxmodel.addElement(item1);//model中添加一个JLabel标签
			}
		});
		del.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				boxmodel.removeElementAt(0);//删除model中0位置的标签
			}
		});
	}
	
	//show
	public void show()
	{
		init();
		frame.setVisible(true);
	}
	public static void main(String[] args) {
		new JComboBoxImgDemo().show();
	}
	
	/*
	 * 自定义的image渲染器,继承ListCellRenderer接口和JLabel类。
	 */
	class ImgBoxModel extends JLabel implements ListCellRenderer
	{
		/**
		 * list - 正在绘制的 JList。
		 * value - 由 list.getModel().getElementAt(index) 返回的值。
		 * index - 单元格索引。
		 * isSelected - 如果选择了指定的单元格,则为 true。
		 * cellHasFocus - 如果指定的单元格拥有焦点,则为 true。
		 */
		private static final long serialVersionUID = 1L;
		@Override
		public Component getListCellRendererComponent(JList list, Object value,
				int index, boolean isSelected, boolean cellHasFocus) {
			
			JLabel label = (JLabel) value;	//value就是box组件中选中的JLabel对象
			setIcon(label.getIcon());		//设置图标
			setText(label.getText());		//设置文本
			if (isSelected) {				//更改背景颜色
	             setBackground(list.getSelectionBackground());
	             setForeground(list.getSelectionForeground());
	        } else {
	             setBackground(list.getBackground());
	             setForeground(list.getForeground());
	        }
			setOpaque(true);				//设置为不透明,这样能显示选中底色。
			return this;
		}		
	}
}
附件: 下载
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值