Java 更改外观会更改JTextPane的颜色吗?
我有一个Java 更改外观会更改JTextPane的颜色吗?,java,swing,colors,look-and-feel,nimbus,Java,Swing,Colors,Look And Feel,Nimbus,我有一个JTextPane有一个不同的背景和前景颜色。现在当L&F更改为Nimbus L&F时,我的JTextPane的颜色改变了。为什么?只有这个类有这样的问题。而其他类工作正常。问题是什么 这是我如何更改L&F的: for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { if ("Nimbus".equals(
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);
知道怎么回事吗?Swing组件将其外观委托给
组件UI
对象。作为Swing的一部分,为每个组件定义了接口:ButtonUI
,它将JButton
委托给,LabelUI
用于JLabel
,TextUI
用于JTextPane
,等等
每个Swing外观都包含这些接口的实现。例如,MetalButtonUI
,MetalLabelUI
,等等,它们以外观和感觉想要的方式绘制该组件
当您调用UIManager.setLookAndFeel
时,它将交换该组实现
所有这些都非常聪明,但令人恼火的是,每个外观都不必遵循任何前景/背景/边框等设置
幸运的是,Nimbus将其所有颜色定义为UIManager键
因此,您可以执行以下操作来覆盖其默认颜色:
UIManager.put("nimbusBase", Color.BLACK);
有关完整列表,请参见此处:
更新
尽管如此,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);
这是对Spoon先生的更新的轻微更新。实际上是代码
defaults.put("EditorPane[Enabled].backgroundPainter", bgColor);
错误,因为put调用的第二个参数应该是实现Painter接口的对象
正确的代码顺序(选择了Nimbus LAF)为
啊,那次更新很有帮助+1..worked.Thaks感谢你的努力。:)但还有一件事。我不需要在我的其他课程中遵循这些东西…不知道为什么要在这一节课上使用这些东西?Nimbus玩得不好,是不是忽略了
UIResource
。本质上,因为Swing非常混乱,所以有人试图查看是否是PL&F设置了一个属性。这是通过让值也实现UIResource
标记接口(如果它来自PL&F)来实现的。有一些方便类,例如UIColor
,它扩展了Color
,并实现UIResource
。显然,这不适用于boolean
、String
、enum
s或仔细编写的值类型。我刚刚实现了这一功能,但不需要在paint方法中添加任何内容。bgColor无论如何都不可用。我不确定这是否有什么不同。
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);