Java 在MetalLookAndFeel的两个实例之间更改
是否可能有两个不同的Java 在MetalLookAndFeel的两个实例之间更改,java,swing,user-interface,look-and-feel,Java,Swing,User Interface,Look And Feel,是否可能有两个不同的MetalLookAndFeel实例,并在运行时在它们之间进行更改?我正在为一个名为MARS(MIPS Assembly IDE)的IDE设计一个主题引擎,我要么需要一个自定义的外观,让我可以操纵每个组件的颜色,要么使用默认的MetalLookAndFeel和UIManager来更改颜色 我看了Java自己的LookAndFeel实现,但不明白如何实现。如果想编写一个CustomLookAndFeel,没有教程可供遵循,所以我想出了这样一个解决方案 是否可以有两个MetalL
MetalLookAndFeel
实例,并在运行时在它们之间进行更改?我正在为一个名为MARS(MIPS Assembly IDE)的IDE设计一个主题引擎,我要么需要一个自定义的外观,让我可以操纵每个组件的颜色,要么使用默认的MetalLookAndFeel
和UIManager
来更改颜色
我看了Java自己的LookAndFeel
实现,但不明白如何实现。如果想编写一个CustomLookAndFeel
,没有教程可供遵循,所以我想出了这样一个解决方案
是否可以有两个
MetalLookAndFeel
实例,一个具有更改的颜色,一个是默认值,并在运行时在它们之间切换?如果没有,我能做些什么来完成我想做的事情呢?作为一个白痴,不理解继承实际上是如何工作的,这会导致一些问题。。。解决办法很简单。子类MetalLookAndFeel
并使用UIManager.setLookAndFeel(字符串类名称)
在原始MetalLookAndFeel
和子类CustomLookAndFeel
之间切换
子类CustomLookAndFeel
:
import javax.swing.plaf.metal.MetalLookAndFeel;
public class CustomMetalLookAndFeel extends MetalLookAndFeel {
private static final long serialVersionUID = -5415261270648192921L;
}
Main方法
(需要InvokeLater
等等,但我太懒了):
谢谢,听到这个消息真是太好了。但我想问的是:有可能有两个相同的
LookAndFeel
实例并在它们之间切换吗?你链接的程序在不同的LookAndFeel
s之间切换,这不完全是我想要的。是的,我的错。我看不见森林,看不见树木PPlus one不仅用于解决问题,还用于报告。
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);
}