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

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
Post a Comment