在 MetalLookAndFeel 的两个实例之间切换
Changing between two instances of MetalLookAndFeel
是否可以有两个不同的 MetalLookAndFeel
实例并在运行时在它们之间切换?我正在为一个名为 MARS(MIPS Assembly IDE) 的 IDE 设计一个主题引擎,我要么需要一个自定义的外观,让我能够操纵每个组件的颜色,要么我将使用默认 MetalLookAndFeel
与 UIManager
更改颜色。
我查看了 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);
}
是否可以有两个不同的 MetalLookAndFeel
实例并在运行时在它们之间切换?我正在为一个名为 MARS(MIPS Assembly IDE) 的 IDE 设计一个主题引擎,我要么需要一个自定义的外观,让我能够操纵每个组件的颜色,要么我将使用默认 MetalLookAndFeel
与 UIManager
更改颜色。
我查看了 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);
}