Java 如何从文件中选择LookAndFeel

Java 如何从文件中选择LookAndFeel,java,look-and-feel,windowbuilder,Java,Look And Feel,Windowbuilder,我正在使用JTatto更改我的应用程序外观。我知道如何设置任何可用的皮肤,但现在我希望用户能够选择其中任何一种。一个带有LAF的字符串保存在一个文件中,因此每次运行程序时,它都应该读取该文件,并根据您的选择设置外观 我已经在GUI前显示了一个JDialogBox,只是为了显示文件是否被正确读取,并且它是正确的 这是有效的: UIManager.setLookAndFeel("com.jtattoo.plaf.aluminium.AluminiumLookAndFeel"); 但这不是: UIM

我正在使用JTatto更改我的应用程序外观。我知道如何设置任何可用的皮肤,但现在我希望用户能够选择其中任何一种。一个带有LAF的字符串保存在一个文件中,因此每次运行程序时,它都应该读取该文件,并根据您的选择设置外观

我已经在GUI前显示了一个JDialogBox,只是为了显示文件是否被正确读取,并且它是正确的

这是有效的:

UIManager.setLookAndFeel("com.jtattoo.plaf.aluminium.AluminiumLookAndFeel");
但这不是:

UIManager.setLookAndFeel(chooseSkin());
有什么想法吗

PS:文件中的字符串是正确的,我已经检查了一百万次,我试过用引号括起来,没有引号。。。我不知道现在该怎么办

编辑: 请注意,没有名为chooseSkin()的方法,它只是一个简单的引用,真正的方法称为readFile()

Skins.java

public static String readFile() {
        String content = "";
           File file = new File("skins.txt");
           try {
               FileReader reader = new FileReader(file);
               char[] chars = new char[(int) file.length()];
               reader.read(chars);
               content = new String(chars);
               reader.close();
           } catch (IOException e) {
               e.printStackTrace();
           }
           System.out.println(content); // ---> returns: "com.jtattoo.plaf.aluminium.AluminiumLookAndFeel"
           return content;
    }
public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    System.out.println(Skins.readFile() =="com.jtattoo.plaf.aluminium.AluminiumLookAndFeel"); // ---> returns false
                    UIManager.setLookAndFeel(Skins.readFile());                    
                    MainGUI frame = new MainGUI();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
}
Main.java

public static String readFile() {
        String content = "";
           File file = new File("skins.txt");
           try {
               FileReader reader = new FileReader(file);
               char[] chars = new char[(int) file.length()];
               reader.read(chars);
               content = new String(chars);
               reader.close();
           } catch (IOException e) {
               e.printStackTrace();
           }
           System.out.println(content); // ---> returns: "com.jtattoo.plaf.aluminium.AluminiumLookAndFeel"
           return content;
    }
public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    System.out.println(Skins.readFile() =="com.jtattoo.plaf.aluminium.AluminiumLookAndFeel"); // ---> returns false
                    UIManager.setLookAndFeel(Skins.readFile());                    
                    MainGUI frame = new MainGUI();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
}

Chooseskin必须返回一个字符串,该字符串等于存在的有效look and feel类的有效路径,例如“com.etc…AlumumLookAndFeel”。您需要检查读取文件的代码以及字符串的值。调试器或println csn br用于此操作。

嗯,文件中可能有额外的空间或新行或其他内容,有很多调试技巧,例如打印字符串的长度

String laf = "com.jtattoo.plaf.aluminium.AluminiumLookAndFeel";
System.out.println(Skins.readFile().length() + " , " + laf.length())
如果长度不同,则需要确保正确写入文件。它的结尾可能包含换行符“\n”

有一种称为“equals”的方法,它将严格比较字符序列。例如:

Skins.readFile().equals("com.jtattoo.plaf.aluminium.AluminiumLookAndFeel") 
应该返回true

UIManager是否也会引发异常?(例如java.lang.ClassNotFoundException)如果不能加载LookAndFeel,它应该抛出一个异常。如果仍然无法使其工作,请尝试使用:

Skins.readFile().intern();

它将根据'equals'方法返回等于它的字符串。(字符序列相等时)

1)确保chooseSkin()是返回类型为“String”的方法,并包含代码,以便我们帮助您。2) 在设置LookAndFeel之前,请尝试以下操作:
System.out.println(chooseSkin())
您也可以尝试这样做:
System.out.println(chooseSkin()=“com.jattoo.plaf.aluminal.alumniumlookandfeel”)(如果正确,应打印“true”)打印变量对于调试非常有用。或者,您可以尝试使用
chooseSkin().toString(),在某些情况下它会工作。我不知道
System.out.println(chooseSkin()=“com.jattoo.plaf.aluminal.aluminaumlookandfeel”)将返回真或假,我刚刚尝试过,它返回假。。。我正在编辑问题以向您显示代码。谢谢你的回答,但我找不到错误。。。但是多亏了它,我可以看到弦是不相等的。例如,我发现我可以使用if来检查字符串是否包含“aluminal”,然后创建一个switch(),在该switch()中,我返回不同的字符串,并对其进行挂起。。。很混乱,但这是唯一的办法。好吧,很高兴我能帮上忙。但从你所说的来看,你的文件似乎真的有错误。您是否尝试过手动将字符串放入skins.txt?我运行了您的代码,它使用了“nimbus外观和感觉”。因此,如果它通过在文件中放入精确的字符串来工作,那么它可能与如何写入文件有关。这也可能是你读取文件的方式,向外检查。。。我现在觉得自己很愚蠢,我正在尝试在我的.txt编辑器中打开“skins.txt”文件的应用程序。。。这就是它不起作用的原因。谢谢你告诉我我的代码有效:)你知道原因吗?现在我想知道为什么如果我打开文件,它就不工作了。字符串是一样的,没有改变。@Mr.Koala好吧,我想你在txt编辑器中打开了一个缓存验证,在这种情况下,它不能保证等于你磁盘上的txt文件。但听起来很奇怪。。