Java 如何获得给定外观的可用主题?

Java 如何获得给定外观的可用主题?,java,swing,look-and-feel,Java,Swing,Look And Feel,我可以在 UIManager.LookAndFeelInfo[] lafInfo = UIManager.getInstalledLookAndFeels(); 但是,我如何获得主题列表,例如金属外观和感觉? 我真的不想硬编码DefaultMetal、Ocean和Test。如果你选择正确的方法,你必须迭代LaFs并选择你想要的 l、 getName返回主题名 示例代码: public static void main(String[] args) { LookAndFeelInfo[]

我可以在

UIManager.LookAndFeelInfo[] lafInfo = UIManager.getInstalledLookAndFeels();
但是,我如何获得主题列表,例如金属外观和感觉?
我真的不想硬编码DefaultMetal、Ocean和Test。

如果你选择正确的方法,你必须迭代LaFs并选择你想要的

l、 getName返回主题名

示例代码:

public static void main(String[] args) {
    LookAndFeelInfo[] installedLookAndFeels = UIManager.getInstalledLookAndFeels();
    for(LookAndFeelInfo l : installedLookAndFeels){
        System.out.println(l.getName());
        if(l.getName().equals("Metal")){
            try {
                UIManager.setLookAndFeel(l.getClassName());
            } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e) {
                e.printStackTrace();
            }
            break;
        }
    }
}

编辑:您可以尝试使用反射查找MetalTheme的所有子类,但我认为这是一个糟糕的选择。

我认为这是不可能的。如本教程所示,无法获得可用的主题列表。如果您看一看这个类,有几个静态方法,但不同于:

public static MetalTheme[] getAvailableThemes(){...}

我认为这将是一个非常有用的功能。无论如何,您最好的机会是对名称进行编码,因为确定一个类是否是Metal外观主题的唯一方法是询问它是否是的一个实例,但这几乎无法实现您的目标。

是的,但在这之后,如何获得Metal支持的主题列表?主题并不意味着LAF的。它的意思类似于颜色方案:金属支持默认金属、海洋和测试。它们由例如MetalLookAndFeel.setCurrentThemenew OceanTheme设置;我想你做不到像MetalLookAndFeel.setCurrentThemenewOceanTheme;那样的事。但您可以设置LaF并通过下一种方式更改其颜色方案UIManager.putinbusbase,new color。。。;UIManager.Putinumbus蓝灰色,新颜色。。。;和其他颜色方案键。我的意思是你不能列出我找到的所有主题MetalLookAndFeel.setCurrentThemenew OceanTheme;在关于LAF的oracle swing教程中。但他们没有说如何列举可用的主题。看,我知道,但如果你看NimbusLook,感觉它有不同的方法。我认为这取决于它们的执行情况。而且你只能手动设置方案,没有自动搜索。这是个坏消息。。。我的目标是在我的设置对话框中创建一个带有两个组合框的选项卡。用户在第一个框中选择L&F,然后刷新第二个框,并提供所选L&F支持的主题选择。我在许多工具中都看到了这一点。你认为他们对主题选择框进行了硬编码吗?事实上,很抱歉:他们可以硬编码主题,或者很好地使用反射。但是最后一种方法非常昂贵,并且不是一种很好的实践,因为这意味着迭代整个类路径,寻找从类扩展而来的类或实现接口的类。我认为在你的情况下,最好是硬编码我们正在讨论的3个类@马库斯。