java - Not Editable JComboBox Border -


i using metal l&f. want make jcombobox, has 1 pixel border. not problem, long cb editable. corresponds first cb in picture named "editable".

cb.seteditable(true); ((jtextcomponent) (cb.geteditor().geteditorcomponent())).setborder(borderfactory.creatematteborder(1, 1, 1, 0, color)); 

but when cb.seteditable(false), additional border occurs inside box (changed red in picture "dropdown", see original color in picture named "fixed"). although tried set border , tried use own cellrenderer, border still gets painted. seems me, unwanted border not come cellrenderer. when try manipulate border cb (see comment //), adds/removes additional outer border. editorcomponent seems not responsible me.

cb.setrenderer(new cbcellrenderer()); //cb.setborder(borderfactory.creatematteborder(1, 1, 1, 1, color)); //cb.setborder(borderfactory.createemptyborder());  class cbcellrenderer implements listcellrenderer {      protected defaultlistcellrenderer defaultrenderer = new defaultlistcellrenderer();      @override     public component getlistcellrenderercomponent(jlist list, object value, int index, boolean isselected, boolean cellhasfocus) {         jlabel renderer = (jlabel) defaultrenderer.getlistcellrenderercomponent(list, value, index, isselected, cellhasfocus);         renderer.setborder(borderfactory.createemptyborder());         return renderer;     }         } 

i tried out ui variables ones below without taking affect on border.

uimanager.setlookandfeel("javax.swing.plaf.metal.metallookandfeel"); uimanager.put("combobox.selectionforeground", color.green); uimanager.put("combobox.disabledbackground", color.green); ... 

image: http://upload.mtmayr.com/dropdown_frame.png (link broken)

complete code testing:

import java.awt.*; import java.util.vector; import javax.swing.*; import javax.swing.plaf.basic.basiccombopopup;  public class combotest {      private vector<string> listsomestring = new vector<string>();     private jcombobox editablecombobox = new jcombobox(listsomestring);     private jcombobox noneditablecombobox = new jcombobox(listsomestring);     private jframe frame;     public final static color color_border = new color(122, 138, 153);      public combotest() {         listsomestring.add("row 1");         listsomestring.add("row 2");         listsomestring.add("row 3");         listsomestring.add("row 4");          editablecombobox.seteditable(true);         editablecombobox.setbackground(color.white);         object child = editablecombobox.getaccessiblecontext().getaccessiblechild(0);         basiccombopopup popup = (basiccombopopup) child;         jlist list = popup.getlist();         list.setbackground(color.white);         list.setselectionbackground(color.red);         jtextfield tf = ((jtextfield) editablecombobox.geteditor().geteditorcomponent());         tf.setborder(borderfactory.creatematteborder(1, 1, 1, 0, color_border));          noneditablecombobox.seteditable(false);         noneditablecombobox.setborder(borderfactory.createemptyborder());         noneditablecombobox.setbackground(color.white);         object childnoneditable = noneditablecombobox.getaccessiblecontext().getaccessiblechild(0);         basiccombopopup popupnoneditable = (basiccombopopup) childnoneditable;         jlist listnoneditable = popupnoneditable.getlist();         listnoneditable.setbackground(color.white);         listnoneditable.setselectionbackground(color.red);          frame = new jframe();         frame.setlayout(new gridlayout(0, 1, 10, 10));         frame.add(editablecombobox);         frame.add(noneditablecombobox);         frame.setdefaultcloseoperation(jframe.exit_on_close);         frame.setlocation(100, 100);         frame.pack();         frame.setvisible(true);     }      public static void main(string[] args) {          swingutilities.invokelater(new runnable() {              @override             public void run() {                 combotest ct = new combotest();             }         });     } } 

  • how override metalcomboboxui#paintcurrentvaluebackground(...)
    • using jdk 1.7.0_17, windows 7

enter image description here

import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.text.*; import javax.swing.plaf.*; import javax.swing.plaf.basic.*; import javax.swing.plaf.metal.*;  public class comboboxuidemo {   private static color border = color.gray;   public jcomponent makeui() {     //uimanager.put("combobox.foreground", color.white);     //uimanager.put("combobox.background", color.black);     //uimanager.put("combobox.selectionforeground", color.cyan);     //uimanager.put("combobox.selectionbackground", color.black);      //uimanager.put("combobox.buttondarkshadow", color.white);     //uimanager.put("combobox.buttonbackground", color.gray);     //uimanager.put("combobox.buttonhighlight", color.white);     //uimanager.put("combobox.buttonshadow", color.white);     //uimanager.put("combobox.editorborder", borderfactory.createlineborder(color.red));      box box = box.createverticalbox();      uimanager.put("combobox.border", borderfactory.createemptyborder());     for(int i=0; i<2; i++) { // defalut       jcombobox<string> cb = new jcombobox<>(makemodel());       if(i%2==0) seteditable(cb);       setpopupborder(cb);       box.add(cb);       box.add(box.createverticalstrut(10));     }      {       // override metalcomboboxui#paintcurrentvaluebackground(...)       jcombobox<string> cb = new jcombobox<>(makemodel());       cb.setui(new metalcomboboxui() {         @override public void paintcurrentvaluebackground(         graphics g, rectangle bounds, boolean hasfocus) {           //if (metallookandfeel.usingocean()) {           if(metallookandfeel.getcurrenttheme() instanceof oceantheme) {             g.setcolor(metallookandfeel.getcontroldarkshadow());             g.drawrect(bounds.x, bounds.y, bounds.width, bounds.height - 1);             //commentout>>>             //g.setcolor(metallookandfeel.getcontrolshadow());             //g.drawrect(bounds.x + 1, bounds.y + 1, bounds.width - 2,             //           bounds.height - 3);             //<<<commentout             if (hasfocus && !ispopupvisible(combobox) && arrowbutton != null) {               g.setcolor(listbox.getselectionbackground());               insets buttoninsets = arrowbutton.getinsets();               if (buttoninsets.top > 2) {                 g.fillrect(bounds.x + 2, bounds.y + 2, bounds.width - 3,                            buttoninsets.top - 2);               }               if (buttoninsets.bottom > 2) {                 g.fillrect(bounds.x + 2, bounds.y + bounds.height -                            buttoninsets.bottom, bounds.width - 3,                            buttoninsets.bottom - 2);               }             }           } else if (g == null || bounds == null) {             throw new nullpointerexception(               "must supply non-null graphics , rectangle");           }         }       });       setpopupborder(cb);        box.add(cb);       box.add(box.createverticalstrut(10));     }      uimanager.put("combobox.border", borderfactory.createlineborder(border));     for(int i=0; i<2; i++) { // basiccomboboxui       jcombobox<string> cb = new jcombobox<>(makemodel());       if(i%2==0) seteditable(cb);       cb.setui(new basiccomboboxui());       setpopupborder(cb);       box.add(cb);       box.add(box.createverticalstrut(10));     }      jpanel p = new jpanel(new borderlayout());     p.setborder(borderfactory.createemptyborder(10,20,10,20));     p.add(box, borderlayout.north);     return p;   }   private static void seteditable(jcombobox cb) {     cb.seteditable(true);     comboboxeditor editor = cb.geteditor();     component c = editor.geteditorcomponent();     if(c instanceof jtextfield) {       jtextfield tf = (jtextfield)c;       tf.setborder(borderfactory.creatematteborder(1,1,1,0,border));     }   }   private static void setpopupborder(jcombobox cb) {     object o = cb.getaccessiblecontext().getaccessiblechild(0);     jcomponent c = (jcomponent)o;     c.setborder(borderfactory.creatematteborder(0,1,1,1,border));   }   private static defaultcomboboxmodel<string> makemodel() {     defaultcomboboxmodel<string> m = new defaultcomboboxmodel<>();     m.addelement("1234");     m.addelement("5555555555555555555555");     m.addelement("6789000000000");     return m;   }   public static void main(string[] args) { //     oceantheme theme = new oceantheme() { //       @override protected coloruiresource getsecondary2() { //         return new coloruiresource(color.red); //       } //     }; //     metallookandfeel.setcurrenttheme(theme);      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 comboboxuidemo().makeui());     f.setsize(320, 240);     f.setlocationrelativeto(null);     f.setvisible(true);   } } 

Comments

Popular posts from this blog

authentication - Mongodb revoke acccess to connect test database -

r - Update two sets of radiobuttons reactively - shiny -

ios - Realm over CoreData should I use NSFetchedResultController or a Dictionary? -