java - Set the button "background" of a Nimbus button -
i'm working on app using nimbus , feel. there's table , 1 column contains buttons (using table button column rob camick). work, result isn't had expected. have tried fix look, no avail.
so question is: how change "background" (the area outside rounded rectangle) of nimbus button? preferably in non-hacky way :-)
using default table column button, result looks this:
as can see, background (and mean area outside button's rounded rectangle) wrong odd (white) rows. code produces output is:
public component gettablecellrenderercomponent( jtable table, object value, boolean isselected, boolean hasfocus, int row, int column) { if (isselected) { renderbutton.setforeground(table.getselectionforeground()); renderbutton.setbackground(table.getselectionbackground()); } else { renderbutton.setforeground(table.getforeground()); renderbutton.setbackground(table.getbackground()); } if (hasfocus) { renderbutton.setborder( focusborder ); } else { renderbutton.setborder( originalborder ); } // <snip code> renderbutton.setopaque(true); return renderbutton; }
the renderbutton
instance of default jbutton
. i've tried messing background color of button, didn't work out expected @ first:
color alternate = (color)lookandfeel.getdesktoppropertyvalue("table.alternaterowcolor", color.lightgray); color normal = (color)lookandfeel.getdesktoppropertyvalue("table.background", color.white); if (row % 2 == 0) { renderbutton.setbackground(normal); } else { renderbutton.setbackground(alternate); }
this produces:
so time buttons alright in first image bad , vice versa. button's inner backgrounds (the areas inside rounded rectangles) seem have correct color according background color property (which what's modified setbackground()
call). area outside wrong. alright, let's combine 2 :
color alternate = table.getbackground(); color normal = (color)lookandfeel.getdesktoppropertyvalue("table.background", color.white); if (row % 2 == 0) { renderbutton.setbackground(normal); } else { renderbutton.setbackground(alternate); }
the result:
so "background" correct, buttons don't nimbus buttons more. how make "background" have correct color while still looking nimbus buttons?
do not set background jbutton. use jpanel wrap jbutton , set background jpanel. obvious if used more buttons in 1 jtable column.
to set correct background color of jpanel did (you should):
- keep reference original renderer
- let original renderer render own component (for every rendering)!
- use background of rendered component set background of jpanel (for every rendering)!
this way don't have choose correct color yourself
also have override paintcomponent correctly paint white background of jpanel:
@override protected void paintcomponent(graphics g) { color background = getbackground(); setbackground(new color(background.getrgb())); super.paintcomponent(g); }
edit: @kleopatra suggests don't have override paintcomponent, set background color not-uiresource (shown in complete example)
here complete example:
import java.awt.color; import java.awt.component; import java.awt.graphics; import javax.swing.jbutton; import javax.swing.jframe; import javax.swing.jpanel; import javax.swing.jtable; import javax.swing.uimanager; import javax.swing.uimanager.lookandfeelinfo; import javax.swing.table.tablecellrenderer; public class test { public static void main(string[] args) throws throwable { (lookandfeelinfo info : uimanager.getinstalledlookandfeels()) { if ("nimbus".equals(info.getname())) { uimanager.setlookandfeel(info.getclassname()); break; } } string[] columnnames = new string[]{"c1"}; object[][] data = new object[4][1]; data[0][0] = "first"; data[1][0] = "second"; data[2][0] = "third"; data[3][0] = "fourth"; jtable table = new jtable(data, columnnames){ @override public javax.swing.table.tablecellrenderer getcellrenderer(int row, int column) { final tablecellrenderer ori = super.getcellrenderer(row, column); final tablecellrenderer mine = new tablecellrenderer() { @override public component gettablecellrenderercomponent(jtable table, object value, boolean isselected, boolean hasfocus, int row, int column) { component c = ori.gettablecellrenderercomponent(table, value, isselected, hasfocus, row, column); jpanel p = new jpanel(); if(value == null){ value = ""; } p.add(new jbutton(value.tostring())); p.setbackground(new color(c.getbackground().getrgb())); return p; } }; return mine; }; }; table.setrowheight(50); jframe f = new jframe(); f.add(table); f.setvisible(true); f.pack(); } }
result:
Comments
Post a Comment