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;
}
}
}
附件:
下载