[英]Nimbus Look&Feel refresh Painter
I'm using the Nimbus look & feel in my swing application.我在我的 Swing 应用程序中使用了 Nimbus 的外观和感觉。
I set the primary and secondary properties of the UIDefaults
of the look & feel.我设置了外观的
UIDefaults
的主要和次要属性。 The colors are right.颜色是对的。 Now i have the problem, that the painter of the components use the colors, which were defined before updating the color theme.
现在我遇到了问题,组件的画家使用了在更新颜色主题之前定义的颜色。
Is there a way, to update the painters of all components to use the new colors, or do I need to implement a custom painter for each property?有没有办法更新所有组件的画家以使用新颜色,或者我是否需要为每个属性实现自定义画家?
I already call SwingUtilities.updateComponentTreeUI(window)
after setting the properties in the UIDefaults
.在
UIDefaults
设置属性后,我已经调用了SwingUtilities.updateComponentTreeUI(window)
。
EDIT:编辑:
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(); SwingUtilities.updateComponentTreeUI( appWindow ); 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
Painters
of the Menu and other components work with the old colors.问题是,菜单的
Painters
和其他组件使用旧颜色。
The following code sets the colors:以下代码设置颜色:
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
类型,具体取决于要设置的属性。
Can someone tell me where my problem is?有人能告诉我我的问题出在哪里吗?
Greets Michael问候迈克尔
no idea what did you tried, because 不知道你尝试了什么,因为
set all setting for UImanager
before creating an Swing GUI
and starting AWT Thread
在创建
Swing GUI
并启动AWT Thread
之前设置UImanager
所有设置
you have to call SwingUtilities.updateComponentTreeUI(window)
in all cases that Swing GUI
is visible and you needed to change L&F on runtime 你必须在
Swing GUI
可见的所有情况下调用SwingUtilities.updateComponentTreeUI(window)
并且你需要在运行时更改L&F
separated issue could be with XxxUIResources
, but no idea without seeing your SSCCE 分离的问题可能是
XxxUIResources
,但没有看到你的SSCCE也不知道
for better help sooner post an SSCCE demonstrated your issue about Nimbus L&F
, value for UIManager
and Colors
stays unchanged 为了更好的帮助,在SSCCE上发布了关于
Nimbus L&F
, UIManager
和Colors
价值保持不变
Change place on these to lines of code将这些位置更改为代码行
UIManager.setLookAndFeel(info.getClassName());
customizeNimbusLaF();
to到
customizeNimbusLaF();
UIManager.setLookAndFeel(info.getClassName());
I would like to add an alternative to this method proposed here.我想为这里提出的这种方法添加一个替代方法。
In particular, all the problems related to the UIManager described in the following issue are solved by the material-ui-swing library with the concept of Material Theming System.尤其是下期描述的UIManager相关的所有问题,都由material-ui-swing库以Material Theming System的概念解决。
Material Theme System gives the possibility to set up your colors and style decision like with/without border, the border with round corner or not in a single class that is documented here under the package mdlaf.themes
.材料主题系统给予设置你的颜色和风格决定像的可能性/无边框,带圆角或不被记录的单一类的边界在这里包下
mdlaf.themes
。
An example of usage can be the following one使用示例可以是以下一个
try {
JDialog.setDefaultLookAndFeelDecorated(true);
JFrame.setDefaultLookAndFeelDecorated(false);
MaterialTheme theme = new MaterialLiteTheme();
// here your custom config theme.setXXX();
MaterialLookAndFeel material = new MaterialLookAndFeel(theme);
UIManager.setLookAndFeel(material);
} catch (UnsupportedLookAndFeelException e) {
e.printStackTrace();
}
You can keep around also the Theme, makes your custom change and when you are read call SwingUtilities.updateComponentTreeUI(window)
您也可以保留主题,进行自定义更改,并在阅读时调用
SwingUtilities.updateComponentTreeUI(window)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.