在MetalLookAndFeel

时间:2018-06-28 00:40:01

标签: java swing user-interface look-and-feel

是否可以有两个MetalLookAndFeel的不同实例,并在运行时在它们之间进行更改?我正在为称为MARS(MIPS Assembly IDE)的IDE设计一个主题引擎,或者需要一种自定义外观,以便可以操纵每个组件的颜色,或者将默认MetalLookAndFeel与{ {1}}更改颜色。

我查看了Java自己的UIManager实现,但不知道该怎么做。如果要编写LookAndFeel,就没有教程可循,因此我想出了一个解决方案。

是否可以有两个CustomLookAndFeel实例,一个实例具有更改的颜色,另一个是默认的,并且可以在运行时在它们之间切换?如果没有,该怎么做才能完成我想做的事情?

1 个答案:

答案 0 :(得分:1)

成为白痴,不了解继承的工作原理会导致一些问题...解决方案很简单。子类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);
}