Swing Look And Feel z pliku

0

W Internecie można ściągnąć wiele pakietów "look and feel" do Swinga, są to pliki *.jar

Udało mi się opanować Tworzenie obiektu z klasy z zewnętrznego pliku.

Poniżej kod klasy do obsługi pakietów klas z zewnątrz:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package CommonAPI;

import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;

/**
 *
 * @author User
 */
public class ExternalClass
{
    private URLClassLoader L;
    
    private ArrayList<URL> JarUrl = new ArrayList<URL>();
    
    public void ClearJars()
    {
        JarUrl.clear();
    }
    
    public void AddJar(String s)
    {
        File f = new File(s);
        AddJar(f);
    }

    public void AddJar(File f)
    {
        try
        {
            AddJar(f.toURI().toURL());
        }
        catch (Exception e)
        {
        }
    }

    public void AddJar(URL u)
    {
        JarUrl.add(u);
    }
    
    public void LoadJars()
    {
        URL[] T = new URL[JarUrl.size()];
        for (int i = 0; i < JarUrl.size(); i++)
        {
            T[i] = JarUrl.get(i);
        }
        L = new URLClassLoader(T);
    }
    
    public Object CreateObject(String ClassName)
    {
        try 
        {
            return Class.forName(ClassName, true, L).newInstance();
        }
        catch (Exception e)
        {
            return null;
        }
    }
}

Na przykład weźmy look and feel o nazwie "Napkin"

Jak załączam plik JAR do projektu, to ten wyglad mozna ustawic w ten sposób:

        try
        {
            javax.swing.UIManager.setLookAndFeel("napkin.NapkinLookAndFeel");
            SwingUtilities.updateComponentTreeUI(this);
            this.pack();
        }
        catch (Exception e)
        {
        }

Potem zamiast nazwy klasy wskazuję na obiekt klasy wczytanej z zewnątrz:

        ExternalClass C = new ExternalClass();
        C.AddJar("D:\\Java\\__Swing\\_LookAndFeel\\napkinlaf-alpha001.jar");
        C.LoadJars();
        Object X = C.CreateObject("napkin.NapkinLookAndFeel");
        LookAndFeel LAF = (LookAndFeel)X;
        try
        {
            //javax.swing.UIManager.setLookAndFeel(LAF);
            SwingUtilities.updateComponentTreeUI(this);
            this.pack();
        }
        catch (Exception e)
        {
        }

Po tej zmianie również działa prawidłowo.

Potem usuwam plik jar z plików załączanych do projektu (libraries) i po uruchomieniu aplikacji już nie działa. ale nie rzuca wyjątku, tylko rzuca taki wyjątek, ale nie w try/catch, tylko jakby w osobnym wątku pokazując:
UIDefaults.getUI() failed: no ComponentUI class for: javax.swing.JRootPane
Komunikat jest powtórzony dla kazdego elementu okna, tylko zamianst JRootPane jest nazwa klasu danego elementu

Gdzie leży problem? Czy da się dołączyć i ustawić LAF z zewnętrznego pliku podczas pracy programu?

0

Ostatni kod powinien wyglądać tak:

        ExternalClass C = new ExternalClass();
        C.AddJar("D:\\Java\\__Swing\\_LookAndFeel\\napkinlaf-alpha001.jar");
        C.LoadJars();
        Object X = C.CreateObject("napkin.NapkinLookAndFeel");
        LookAndFeel LAF = (LookAndFeel)X;
        try
        {
            javax.swing.UIManager.setLookAndFeel(LAF);
            SwingUtilities.updateComponentTreeUI(this);
            this.pack();
        }
        catch (Exception e)
        {
        }

1 użytkowników online, w tym zalogowanych: 0, gości: 1