1

我在我的挥杆应用程序中使用 Nimbus 外观。

UIDefaults我设置了外观的主要和次要属性。颜色是对的。现在我有一个问题,组件的画家使用颜色,这些颜色是在更新颜色主题之前定义的。

有没有办法更新所有组件的画家以使用新颜色,还是我需要为每个属性实现一个自定义画家?

SwingUtilities.updateComponentTreeUI(window)在设置属性后我已经调用了UIDefaults.

编辑:

以下代码设置整个应用程序的 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() );
}


代码做了,它应该做什么(设置 Nimbus 的外观和感觉)。问题是,Painters菜单和其他组件使用旧颜色。
以下代码设置颜色:

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 );      
}


中的常量的数据UIConstants类型ColorFont取决于要设置的属性的类型。

有人可以告诉我我的问题在哪里吗?

问候迈克尔

4

3 回答 3

4

不知道你尝试了什么,因为

  • UImanager在创建Swing GUI和启动之前设置所有设置AWT Thread

  • 您必须SwingUtilities.updateComponentTreeUI(window)在所有Swing GUI可见的情况下调用,并且您需要在运行时更改 L&F

  • 单独的问题可能与XxxUIResources,但不知道没有看到您的SSCCE

  • 为了获得更好的帮助,请尽快发布SSCCE证明您的问题Nimbus L&F、价值UIManagerColors保持不变

于 2012-09-12T12:16:38.023 回答
0

将这些位置更改为代码行

       UIManager.setLookAndFeel(info.getClassName());
       customizeNimbusLaF();

       customizeNimbusLaF();
       UIManager.setLookAndFeel(info.getClassName());
于 2021-12-19T16:31:31.127 回答
0

我想为这里提出的这种方法添加一个替代方法。

特别是下期描述的所有与UIManager相关的问题,都通过Material Theming System概念的material-ui-swing库解决。

Material Theme System 提供了设置您的颜色和样式决定的可能性,例如带/不带边框、带圆角的边框或不包含在包中记录mdlaf.themes单个类中。

使用示例如下

  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();
  }

您还可以保留主题,进行自定义更改以及阅读时调用SwingUtilities.updateComponentTreeUI(window)

于 2021-12-26T10:50:59.667 回答