Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 更改外观会更改JTextPane的颜色吗?_Java_Swing_Colors_Look And Feel_Nimbus - Fatal编程技术网

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