| |
默认的jcombobox无法在每个条目上显示图标、缩进等样式。但是swing的mvc设计结构为各种组件提供了无与伦比的可扩展性。为了实现这一点,我们可以创建一个新的renderer来负责每个条目的绘制。
首先我们新写一个类imagedcomboboxitem,它封装了一个下拉条目的信息,包括图标、文字、缩进等:
class imagedcomboboxitem { private icon icon = null; private string text = null; private int indent = 0;
imagedcomboboxitem(string text, icon icon, int indent) { this.text = text; this.icon = icon; this.indent = indent; }
public string gettext() { return text; }
public icon geticon() { return icon; }
public int getindent() { return indent; } }
然后新建jimagedcombobox类并从jcombobox继承。在构造函数中,新建一个defaultlistcellrenderer作为新的renderer,并覆盖其getlistcellrenderercomponent方法。在新的getlistcellrenderercomponent方法中,首先依旧调用父对象的该方法,以便完成普通条目的绘制;然后判断条目是否是imagedcomboboxitem实例。如果是,则显示imagedcomboboxitem的文字、图标,并显示缩进。为了更方便的显示左侧缩进,我们直接创建一个emptyborder并设置左侧缩进数量,并设置到defaultlistcellrenderer中。defaultlistcellrenderer从jlabel继承而来,所以可直接接受各种border。这里我们以每个缩进10象素为例。
好了,以下是完整代码:
import java.util.*;
import java.awt.*; import javax.swing.*;
public class jimagedcombobox extends jcombobox { public jimagedcombobox(vector values) { super(values); listcellrenderer renderer = new defaultlistcellrenderer() { public component getlistcellrenderercomponent( jlist list, object value, int index, boolean isselected, boolean cellhasfocus) { super.getlistcellrenderercomponent(list, value, index, isselected, cellhasfocus); if (value instanceof imagedcomboboxitem) { imagedcomboboxitem item = (imagedcomboboxitem) value; this.settext(item.gettext()); this.seticon(item.geticon()); if (ispopupvisible()) { int offset = 10 * item.getindent(); this.setborder(borderfactory.createemptyborder(0, offset, 0, 0)); } } return this; } }; this.setrenderer(renderer); }
public static void main(string[] args) { jframe frame = new jframe(); frame.setsize(400, 400); vector values = new vector(); icon openicon = new imageicon(jimagedcombobox.class.getresource("open16.gif")); icon newicon = new imageicon(jimagedcombobox.class.getresource("new16.gif")); for (int i = 0; i < 5; i++) { values.addelement(new imagedcomboboxitem("directory " + i, openicon, i)); } for (int i = 0; i < 5; i++) { values.addelement(new imagedcomboboxitem("image item " + i, newicon, 5)); } jimagedcombobox combobox = new jimagedcombobox(values); frame.getcontentpane().add(combobox, borderlayout.north); frame.show(); } }
class imagedcomboboxitem { private icon icon = null; private string text = null; private int indent = 0;
imagedcomboboxitem(string text, icon icon, int indent) { this.text = text; this.icon = icon; this.indent = indent; }
public string gettext() { return text; }
public icon geticon() { return icon; }
public int getindent() { return indent; } }
其中,两个图标在这里 :open16.gif,new16.gif
|
|