【问题标题】:Set look and feel color设置外观颜色
【发布时间】:2012-09-05 02:48:57
【问题描述】:

我在我的 Java Swing 应用程序中使用 Nimbus Look & Feel。 L&F 看起来不错,但我需要更改一些设置(字体、颜色、...)以适应我公司的企业形象。

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


代码做了,它应该做什么(设置 Nimbus 的外观和感觉)。 问题是,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 );      
}


UIConstants 中常量的数据类型是 ColorFont 类型之一,具体取决于要设置的属性。

问题是,只有少数外观选项发生了变化。诸如树背景之类的选项不会根据外观上的选项而改变。我知道这一点,如果我更改组件的画家,那么只有一些事情会改变。但是例如JPanel 没有这样的painter 属性,但也会产生问题。

我有第二个关于外观和感觉的问题: 不是例如画家吗? menuBar 应该使用在原色部分中设置的颜色,还是我需要为此使用自己的画家?

谁能告诉我问题出在哪里?

【问题讨论】:

    标签: java swing look-and-feel nimbus uimanager


    【解决方案1】:

    我发现了主要问题。 在将所有外观和感觉属性放入 UIDefaults 后,我没有调用 SwingUtilities.updateComponentTreeUI( window )

    现在它按我预期的方式执行。

    另一个问题: 有没有办法指定整个应用程序的首选字体?

    【讨论】:

    • 查看@aephyrs 代码库,有两种方法,从 xml 文件和通过在 Keys 中迭代,因为字体是从 JVM 全局定义的,并且使用 UIManager 可以仅更改一种字体,具体的JComponent
    【解决方案2】:

    1.set for changes有点hacky,必须设置L&F,然后可以对已安装的L&F进行任何更改

    伪代码

    if( "Nimbus".equals( info.getName() ) ) {
       UIManager.setLookAndFeel(info.getClassName());
       UIManager.getLookAndFeelDefaults().put("Xxx", "Xxx")
       UIManager.getLookAndFeelDefaults().put("Xxx", "Xxx")
       break;
    }
    

    2.Font 和部分颜色存储为所有 Swings L&F 的 XxxUIResources 和XxxUIResources required another hack

    3.更好的方法是使用@camickr 的UIManager Defaults 来获取已安装方法的列表,而不是搜索NimbusDefaults

    4.about Painter,您可以设置自己的 Painter(取决于 UIDefaults 中的类型或值)或覆盖 XxxUIResources(取决于类型,有时,有些不起作用,因为 Nimbus 的开发在 2nd.四分之一),

    编辑

    5.Nothing better around,我认为@aephyr 参与了Nimbus development 或e.i. ???

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-18
      • 1970-01-01
      • 2020-01-30
      • 1970-01-01
      相关资源
      最近更新 更多