3

我有JTextPane一个不同的背景和前景颜色。现在当 L&F 更改为 Nimbus L&F 时,我JTextPane的颜色发生了变化。怎么会?只有这个类有这样的问题。而其他人工作得很好。有什么问题?

这就是我改变 L&F 的方式:

for (javax.swing.UIManager.LookAndFeelInfo info : 

javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(PlayBackVoice.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(PlayBackVoice.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(PlayBackVoice.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(PlayBackVoice.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }

另一方面,在设置此 L&F 之前,颜色变化非常好。或者这些陈述运作良好:

     jtp.setBackground(Color.BLACK);
     jtp.setForeground(Color.WHITE);

知道有什么问题吗?

4

2 回答 2

4

Swing 组件将它们的外观和感觉委托给ComponentUI对象。作为 Swing 的一部分,为每个组件定义了接口:ButtonUI它们JButton委托给、LabelUIfor JLabelTextUIforJTextPane等。

每个 Swing 外观都包含每个接口的实现。例如。MetalButtonUI, MetalLabelUI, 等等,它们以外观和感觉想要的方式绘制该组件。

当您调用UIManager.setLookAndFeel它时,它会在该组实现中进行交换。

一切都非常聪明,但令人讨厌的是,每种外观都不必尊重您的任何前景/背景/边框等设置。

幸运的是,Nimbus 将其所有颜色定义为 UIManager 键。

所以,你可以做这样的事情来覆盖它的默认颜色:

UIManager.put("nimbusBase", Color.BLACK);

完整列表请参见此处:

http://www.ce.unipr.it/people/poggi/teaching/docs/javaSE7.0Tutorial/uiswing/lookandfeel/_nimbusDefaults.html

更新

虽然,这么说来,看起来 Nimbus 玩起来一点都不好!有些人很幸运地用这个覆盖了 Nimbus 颜色:

Color bgColor = new Color("99999");
UIDefaults defaults = new UIDefaults();
defaults.put("EditorPane[Enabled].backgroundPainter", bgColor);
jeditorpane.putClientProperty("Nimbus.Overrides", defaults);
jeditorpane.putClientProperty("Nimbus.Overrides.InheritDefaults", true);
jeditorpane.setBackground(bgColor);
于 2013-03-05T16:18:41.027 回答
3

这是对 Spoon 先生更新的轻微更新。其实代码

defaults.put("EditorPane[Enabled].backgroundPainter", bgColor);

错误,因为 put 调用的第二个参数应该是实现 Painter 接口的对象。

正确的代码序列(选择 Nimbus LAF)是

UIDefaults defaults = UIManager.getLookAndFeelDefaults();
defaults.put("TextPane[Enabled].backgroundPainter", 
    new javax.swing.plaf.nimbus.AbstractRegionPainter() {

        @Override
        protected AbstractRegionPainter.PaintContext getPaintContext() {
            return new AbstractRegionPainter.PaintContext(null, null, false);
        }

        @Override
        protected void doPaint(Graphics2D g, JComponent c, 
                int width, int height, Object[] extendedCacheKeys) {
            g.setColor(bgColor);
            g.fillRect(0, 0, width, height);
        }
    });
jtxtPane.putClientProperty("Nimbus.Overrides", defaults);
jtxtPane.putClientProperty("Nimbus.Overrides.InheritDefaults", false);
于 2013-09-25T08:19:57.883 回答