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...

enter image description here

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

Popular posts from this blog

IF statement in MySQL trigger -

c++ - What does MSC in "// appease MSC" comments mean? -

javascript - Blogger related post gadget image Resize s72-c [ Need Expert Help ] -