问题
I'm using the Nimbus Look & Feel within my Java Swing application. The L&F looks great, but i need to change some settings (Fonts, Colors, ... ) to fit the corporate identity of my firm.
The following code sets the L&F of the whole application:
try {
for( LookAndFeelInfo info : UIManager.getInstalledLookAndFeels() ) {
if( "Nimbus".equals( info.getName() ) ) {
UIManager.setLookAndFeel(info.getClassName());
customizeNimbusLaF();
break;
}
}
}
catch( Exception e ) {
LogUtility.warning( "cannot set application look and feel" );
LogUtility.warning( e.getMessage() );
}
The code does, what it is supposed to do (setting the Nimbus Look & Feel).
The problem is, that the customizeNimbusLaF()
does not work, as i expect it to do.
private final void customizeNimbusLaF() {
UIManager.put( "control" , UIConstants.GREY_LIGHT );
UIManager.put( "nimbusAlertYellow" , UIConstants.YELLOW );
UIManager.put( "nimbusBase" , UIConstants.GREY_DARK );
UIManager.put( "nimbusDisabledText" , UIConstants.GREY_DARK );
UIManager.put( "nimbusFocus" , UIConstants.BLUE_LIGHT );
UIManager.put( "nimbusGreen" , UIConstants.GREEN );
UIManager.put( "nimbusInfoBlue" , UIConstants.BLUE_MIDDLE );
UIManager.put( "nimbusRed", UIConstants.RED );
UIManager.put( "nimbusSelectionBackground",
UIConstants.BLUE_MIDDLE );
UIManager.put( "background" ,UIConstants.GREY_LIGHT );
UIManager.put( "controlDkShadow" , UIConstants.GREY_DARK );
UIManager.put( "controlShadow", UIConstants.GREY_MIDDLE );
UIManager.put( "desktop", UIConstants.BLUE_MIDDLE );
UIManager.put( "menu", UIConstants.GREY_LIGHT );
UIManager.put( "nimbusBorder", UIConstants.GREY_MIDDLE );
UIManager.put( "nimbusSelection", UIConstants.BLUE_MIDDLE );
UIManager.put( "textBackground", UIConstants.BLUE_LIGHT );
UIManager.put( "textHighlight", UIConstants.BLUE_LIGHT );
UIManager.put( "textInactiveText", UIConstants.GREY_MIDDLE );
// panel
UIManager.put( "Panel.background", UIConstants.GREY_LIGHT );
UIManager.put( "Panel.disabled", UIConstants.GREY_LIGHT );
UIManager.put( "Panel.font", UIConstants.DEFAULT_FONT );
UIManager.put( "Panel.opaque", true );
// button
UIManager.put( "Button.background", UIConstants.GREY_LIGHT );
UIManager.put( "Button.disabled", UIConstants.GREY_LIGHT );
UIManager.put( "Button.disabledText", UIConstants.BLUE_MIDDLE );
UIManager.put( "Button.font", UIConstants.DEFAULT_FONT );
// menu
UIManager.put( "Menu.background", UIConstants.GREY_LIGHT );
UIManager.put( "Menu.disabled", UIConstants.GREY_LIGHT );
UIManager.put( "Menu.disabledText", UIConstants.GREY_DARK );
UIManager.put( "Menu.font", UIConstants.MENU_FONT );
UIManager.put( "Menu.foreground", UIConstants.BLACK );
UIManager.put( "Menu[Disabled].textForeground",
UIConstants.GREY_MIDDLE );
UIManager.put( "Menu[Enabled].textForeground", UIConstants.BLACK );
UIManager.put( "MenuBar.background", UIConstants.GREY_LIGHT );
UIManager.put( "MenuBar.disabled", UIConstants.GREY_LIGHT );
UIManager.put( "MenuBar.font", UIConstants.MENU_FONT );
UIManager.put( "MenuBar:Menu[Disabled].textForeground",
UIConstants.GREY_MIDDLE );
UIManager.put( "MenuBar:Menu[Enabled].textForeground",
UIConstants.BLACK );
UIManager.put( "MenuItem.background", UIConstants.GREY_LIGHT );
UIManager.put( "MenuItem.disabled", UIConstants.GREY_LIGHT );
UIManager.put( "MenuItem.disabledText", UIConstants.GREY_MIDDLE );
UIManager.put( "MenuItem.font", UIConstants.MENU_FONT );
UIManager.put( "MenuItem.foreground", UIConstants.BLACK );
UIManager.put( "MenuItem[Disabled].textForeground",
UIConstants.GREY_MIDDLE );
UIManager.put( "MenuItem[Enabled].textForeground",
UIConstants.BLACK );
// tree
UIManager.put( "Tree.background", UIConstants.BLACK );
}
The datatypes of the constants in UIConstants
are either of type Color
of Font
depending of the attribute to be set.
The problem is, that only a few look & feel options change. Options like the background of the tree do not change according to the options on the look & feel. I am aware of this, that a few things only change, if I change the painter of a component. But e.g. JPanel does not have such a painter property, but makes problems too.
I have a second question concerning the look & feel: Aren't the painters of e.g. the menuBar supposed to use the colors, which are set in the primary color section, or do I need to implement my own painters for this use?
Can someone tell me where my problem is?
回答1:
1.set for changes is little bit hacky, have to set L&F, then after is possible to make any changes to instaled L&F
pseudocode
if( "Nimbus".equals( info.getName() ) ) {
UIManager.setLookAndFeel(info.getClassName());
UIManager.getLookAndFeelDefaults().put("Xxx", "Xxx")
UIManager.getLookAndFeelDefaults().put("Xxx", "Xxx")
break;
}
2.Font and part of Colors is stored as XxxUIResources for all Swings L&Fs, and XxxUIResources required another hack,
3.better could be to use UIManager Defaults by @camickr for list of instaled methods, rather than searching into NimbusDefaults
4.about Painter, you can to set own Painter (depends of type or value in UIDefaults) or to override XxxUIResources (depends of type, sometimes, somewere doesn't works, because development of Nimbus ended somwhere in 2nd. of quaters),
EDIT
5.Nothing better around, I think that @aephyr
participated of Nimbus development
or e.i. ???
回答2:
I've found the major problem.
I didn't call SwingUtilities.updateComponentTreeUI( window )
after putting all look & feel properties into the UIDefaults.
Now it performs the way I intended it to.
Another question: Is there a way to specify the preferred font of the whole application?
来源:https://stackoverflow.com/questions/12382143/set-look-and-feel-color