简体   繁体   English

设置外观颜色

[英]Set look and feel color

I'm using the Nimbus Look & Feel within my Java Swing application. 我在Java Swing应用程序中使用Nimbus外观。 The L&F looks great, but i need to change some settings (Fonts, Colors, ... ) to fit the corporate identity of my firm. L&F看起来不错,但我需要更改一些设置(字体,颜色等)以适合我公司的企业标识。

The following code sets the L&F of the whole application: 以下代码设置整个应用程序的L&F:

 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). 该代码可以执行应做的事情(设置Nimbus外观)。 The problem is, that the customizeNimbusLaF() does not work, as i expect it to do. 问题是, customizeNimbusLaF()无法正常工作,正如我期望的那样。

 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. UIConstants中的常量的数据类型取决于要设置的属性,其类型为“ Font Color ”。

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 eg JPanel does not have such a painter property, but makes problems too. 但是,例如,JPanel不具有这样的painter属性,但是也会产生问题。

I have a second question concerning the look & feel: Aren't the painters of eg 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? 我还有关于外观的第二个问题:menuBar的画家是否不应该使用在原色部分中设置的颜色,还是我需要为此目的实现自己的画家?

Can someone tell me where my problem is? 有人可以告诉我我的问题在哪里吗?

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 1.设置更改有点麻烦,必须设置L&F,然后才可以对已安装的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 , 2.字体和部分Colors存储为所有Swings L&F的XxxUIResources ,而XxxUIResources需要另一个hack

3.better could be to use UIManager Defaults by @camickr for list of instaled methods, rather than searching into NimbusDefaults 3.更好的办法是使用@camickr的UIManager Defaults作为安装方法的列表,而不是搜索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), 4. 关于Painter ,您可以设置自己的Painter(取决于UIDefaults中类型或值)或覆盖XxxUIResources(取决于类型,有时某些方法不起作用,因为Nimbus的开发在第二个季度中就已经结束了),

EDIT 编辑

5. Nothing better around , I think that @aephyr participated of Nimbus development or ei ??? 5. 周围没有更好的事情 ,我认为@aephyr参与了Nimbus development或ei ???

I've found the major problem. 我发现了主要问题。 I didn't call SwingUtilities.updateComponentTreeUI( window ) after putting all look & feel properties into the UIDefaults. 将所有外观属性放入UIDefaults之后,我没有调用SwingUtilities.updateComponentTreeUI( window )

Now it performs the way I intended it to. 现在,它执行了我想要的方式。

Another question: Is there a way to specify the preferred font of the whole application? 另一个问题:是否可以指定整个应用程序的首选字体?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM