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?