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:

buttons incorrect background

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:

also incorrect button background

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:

still incorrect buttons

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):

  1. keep reference original renderer
  2. let original renderer render own component (for every rendering)!
  3. 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:

result


Comments

Popular posts from this blog

ios - UICollectionView Self Sizing Cells with Auto Layout -

node.js - ldapjs - write after end error -

DOM Manipulation in Wordpress (and elsewhere) using php -