是否可以有两个MetalLookAndFeel
的不同实例,并在运行时在它们之间进行更改?我正在为称为MARS(MIPS Assembly IDE)的IDE设计一个主题引擎,或者需要一种自定义外观,以便可以操纵每个组件的颜色,或者将默认MetalLookAndFeel
与{ {1}}更改颜色。
我查看了Java自己的UIManager
实现,但不知道该怎么做。如果要编写LookAndFeel
,就没有教程可循,因此我想出了一个解决方案。
是否可以有两个CustomLookAndFeel
实例,一个实例具有更改的颜色,另一个是默认的,并且可以在运行时在它们之间切换?如果没有,该怎么做才能完成我想做的事情?
答案 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);
}