简体   繁体   English

Nimbus Look&Feel 刷新 Painter

[英]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&FUIManagerColors价值保持不变

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.

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