在 MetalLookAndFeel 的两个实例之间切换

Changing between two instances of MetalLookAndFeel

是否可以有两个不同的 MetalLookAndFeel 实例并在运行时在它们之间切换?我正在为一个名为 MARS(MIPS Assembly IDE) 的 IDE 设计一个主题引擎,我要么需要一个自定义的外观,让我能够操纵每个组件的颜色,要么我将使用默认 MetalLookAndFeelUIManager 更改颜色。

我查看了 Java 自己对 LookAndFeel 的实现,但不明白我该怎么做。如果有人想写一个 CustomLookAndFeel,那里没有教程可以遵循,所以我想出了一个这样的解决方案。

是否可以有两个 MetalLookAndFeel 的实例,一个改变颜色,一个是默认颜色,并在运行时在它们之间切换?如果没有,可以做些什么来完成我想做的事情?

作为一个白痴而不了解继承的实际工作原理会导致一些问题...解决方案很简单。子类 MetalLookAndFeel 并使用 UIManager.setLookAndFeel(String className) 在原始 MetalLookAndFeel 和子类 CustomLookAndFeel 之间切换。

子类CustomLookAndFeel

import javax.swing.plaf.metal.MetalLookAndFeel;

public class CustomMetalLookAndFeel extends MetalLookAndFeel {

    private static final long serialVersionUID = -5415261270648192921L;
}

Main Method(需要InvokeLater之类但我太懒了):

public static void main(String[] args) {
    UIManager.installLookAndFeel("CustomMetal", "laf.CustomMetalLookAndFeel");
    try {
        UIManager.setLookAndFeel("laf.CustomMetalLookAndFeel");
    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e1) {
        e1.printStackTrace();
    }
    UIManager.getLookAndFeelDefaults().put("Panel.background", new ColorUIResource(Color.RED));

    JFrame f = new JFrame();
    JPanel p = new JPanel();
    JButton j = new JButton("100000");
    j.addActionListener(e -> {
        try {
            UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e1) {
            e1.printStackTrace();
        }
        SwingUtilities.updateComponentTreeUI(f);
    });
    p.add(j);
    f.add(p);
    f.pack();
    f.setVisible(true);
}