java - How can I extend JComboBox to allow user to remove list items by clicking an x button, like an Internet browser tab? -
i trying create object resembles jcombobox, want user able remove item list. imagine each list element has right x icon or button find on tab in internet browser, clicking on x delete corresponding list item.
i have been trying extend jcombobox new editors , renderers, trying add button beside each label, , have had little success. decent way of going this?
all tutorials , examples have found extend jcombobox seem involve jlabel functionality, appears prevent button functionality need.
thanks help!
check out this example. may helps...

import java.awt.*; import java.awt.event.*; import java.util.*; import javax.accessibility.*; import javax.swing.*; import javax.swing.plaf.basic.*; public final class removebuttonincomboitemtest { public jcomponent makeui() { final jcombobox<string> c = new removebuttoncombobox<>( new defaultcomboboxmodel<>(new string[] {"aaaaa", "bbb", "cc", "d", "eeee"})); c.setprototypedisplayvalue("mmmmmmmmmmmmmmmmmm"); jpanel p = new jpanel(); p.add(c); p.add(new jbutton(new abstractaction("add") { @override public void actionperformed(actionevent e) { mutablecomboboxmodel<string> m = (mutablecomboboxmodel<string>) c.getmodel(); m.insertelementat(new date().tostring(), m.getsize()); } })); p.setborder(borderfactory.createemptyborder(20, 0, 0, 0)); return p; } public static void main(string... args) { eventqueue.invokelater(new runnable() { @override public void run() { createandshowgui(); } }); } public static void createandshowgui() { jframe f = new jframe(); f.setdefaultcloseoperation(windowconstants.exit_on_close); f.getcontentpane().add(new removebuttonincomboitemtest().makeui()); f.setsize(320, 240); f.setlocationrelativeto(null); f.setvisible(true); } } class removebuttoncombobox<e> extends jcombobox<e> { private transient cellbuttonsmouselistener cbml; public removebuttoncombobox(comboboxmodel<e> amodel) { super(amodel); } @override public void updateui() { if (objects.nonnull(cbml)) { jlist<?> list = getlist(); if (objects.nonnull(list)) { list.removemouselistener(cbml); list.removemousemotionlistener(cbml); } } super.updateui(); setrenderer(new buttonsrenderer<e>(this)); jlist<?> list = getlist(); if (objects.nonnull(list)) { cbml = new cellbuttonsmouselistener(); list.addmouselistener(cbml); list.addmousemotionlistener(cbml); } } protected jlist<?> getlist() { accessible = getaccessiblecontext().getaccessiblechild(0); if (a instanceof basiccombopopup) { return ((basiccombopopup) a).getlist(); } else { return null; } } } class cellbuttonsmouselistener extends mouseadapter { private int previndex = -1; private jbutton prevbutton; private static void listrepaint(jlist list, rectangle rect) { if (objects.nonnull(rect)) { list.repaint(rect); } } @override public void mousemoved(mouseevent e) { jlist list = (jlist) e.getcomponent(); point pt = e.getpoint(); int index = list.locationtoindex(pt); if (!list.getcellbounds(index, index).contains(pt)) { if (previndex >= 0) { rectangle r = list.getcellbounds(previndex, previndex); listrepaint(list, r); } index = -1; prevbutton = null; return; } if (index >= 0) { jbutton button = getbutton(list, pt, index); buttonsrenderer renderer = (buttonsrenderer) list.getcellrenderer(); if (objects.nonnull(button)) { renderer.rolloverindex = index; if (!button.equals(prevbutton)) { rectangle r = list.getcellbounds(previndex, index); listrepaint(list, r); } } else { renderer.rolloverindex = -1; rectangle r = null; if (previndex == index) { if (previndex >= 0 && objects.nonnull(prevbutton)) { r = list.getcellbounds(previndex, previndex); } } else { r = list.getcellbounds(index, index); } listrepaint(list, r); previndex = -1; } prevbutton = button; } previndex = index; } @override public void mousepressed(mouseevent e) { jlist list = (jlist) e.getcomponent(); point pt = e.getpoint(); int index = list.locationtoindex(pt); if (index >= 0) { jbutton button = getbutton(list, pt, index); if (objects.nonnull(button)) { listrepaint(list, list.getcellbounds(index, index)); } } } @override public void mousereleased(mouseevent e) { jlist list = (jlist) e.getcomponent(); point pt = e.getpoint(); int index = list.locationtoindex(pt); if (index >= 0) { jbutton button = getbutton(list, pt, index); if (objects.nonnull(button)) { buttonsrenderer renderer = (buttonsrenderer) list.getcellrenderer(); button.doclick(); rectangle r = list.getcellbounds(index, index); listrepaint(list, r); } } } @override public void mouseexited(mouseevent e) { jlist list = (jlist) e.getcomponent(); buttonsrenderer renderer = (buttonsrenderer) list.getcellrenderer(); renderer.rolloverindex = -1; } @suppresswarnings("unchecked") private static jbutton getbutton(jlist list, point pt, int index) { container c = (container) list.getcellrenderer().getlistcellrenderercomponent( list, "", index, false, false); rectangle r = list.getcellbounds(index, index); c.setbounds(r); //c.dolayout(); pt.translate(-r.x, -r.y); component b = swingutilities.getdeepestcomponentat(c, pt.x, pt.y); if (b instanceof jbutton) { return (jbutton) b; } else { return null; } } } class buttonsrenderer<e> extends jpanel implements listcellrenderer<e> { private static final color even_color = new color(230, 255, 230); private final removebuttoncombobox<e> combobox; private jlist list; private int index; public int rolloverindex = -1; private final jlabel label = new defaultlistcellrenderer(); private final jbutton deletebutton = new jbutton(new abstractaction("x") { @override public void actionperformed(actionevent e) { mutablecomboboxmodel m = (mutablecomboboxmodel) list.getmodel(); if (m.getsize() > 1) { m.removeelementat(index); combobox.showpopup(); } } }) { @override public dimension getpreferredsize() { return new dimension(16, 16); } }; public buttonsrenderer(removebuttoncombobox<e> combobox) { super(new borderlayout(0, 0)); this.combobox = combobox; label.setopaque(false); setopaque(true); add(label); deletebutton.setborder(borderfactory.createemptyborder()); deletebutton.setcontentareafilled(false); add(deletebutton, borderlayout.east); } @override public component getlistcellrenderercomponent( jlist<? extends e> list, e value, int index, boolean isselected, boolean cellhasfocus) { label.settext(objects.tostring(value, "")); this.list = list; this.index = index; if (isselected) { setbackground(list.getselectionbackground()); label.setforeground(list.getselectionforeground()); } else { setbackground(index % 2 == 0 ? even_color : list.getbackground()); label.setforeground(list.getforeground()); } mutablecomboboxmodel m = (mutablecomboboxmodel) list.getmodel(); if (index < 0 || m.getsize() - 1 <= 0) { setopaque(false); deletebutton.setvisible(false); label.setforeground(list.getforeground()); } else { setopaque(true); boolean f = index == rolloverindex; deletebutton.setvisible(true); deletebutton.getmodel().setrollover(f); deletebutton.setforeground(f ? color.white : list.getforeground()); } return this; } }
Comments
Post a Comment