Hallo,
in meiner Swing anwendung benutzt ich das Kunststoff Look And Feel von incors, hab das jar file runtergeladen und in meinem classpath kopiert, also das gleiche verzeichnis wie die class dateien. wenn ich das programm aber starte kann er das look and feel nicht laden. wenn ich beim kompilieren versuche das package im jar file zu importieren geht's auch nicht. wenn ich dir jar allerdings entpacke funktionierts. muss ich da irgendwas einstellen oder so, damit es funktioniert? dann könnte ich die tablelayout klassen auch in seinem jar file lassen. ich hab keinen bopck das alles in ein großes jar-file zu packen
bin mir jetzt nicht sicher, aber ich glaube du musst das jar in das ext(erne) Verzeichnis des jre kopieren. Zumindest hab ich das so mit dem zusätzliches TableLayout gemacht und dann gings.
also bei mir wäre das
Code:
C:\j2sdk1.4.1_01\jre\lib\ext
und dann musst du noch die bibloethek zu deinem Projekt hinzufügen.
P.S.: sieht nicht schlecht aus dieses LookAndFeel, jetzt muss man nur noch schauen wo es das als Open Source gibt
www.incors.org is das look and feel zum runterladen und der source gleich mit...
hmja wenn ich das in das jre/lib/ext verzeichnis packe, dann wird es zwar gefunden, aber wie ist es dann wenn ich das woanders starten möchte? kann ich die kunststoff.jar dann auch in das gleiche verzeichnis legen wie die meinProgramm.jar ?
Hm ich dachte das war nur ne Trialversion. Muss vielleicht doch mal richtig lesen
Roar hat gesagt.:
hmja wenn ich das in das jre/lib/ext verzeichnis packe, dann wird es zwar gefunden, aber wie ist es dann wenn ich das woanders starten möchte? kann ich die kunststoff.jar dann auch in das gleiche verzeichnis legen wie die meinProgramm.jar ?
Ich weis nicht wie das mit diesen jars läuft. Aber ich denke mal wenn du dein Prog auf einem anderen Rechner laufen lassen willst musst du das jar-File auch dort in die jre\lib\ext kopieren. Aber wie gesagt, da kenn ich mich nicht aus (bin grad dabei ein jar zu packen und das haut irgendwie nicht hin)
edit: Ich wollte diese Alloy-LookAndFeel haben. Das kostet leider was
Um ein Jar-File zu laden, kannst du einen eigenen ClassLoader benützen.
Damit kannst du ein einzelnes Object laden, und benützen. Leider musst du dann oft mit dem Reflection-Zeugs arbeiten, da die Projekte eigentlich nichts voneinander wissen.
(P.S. wenn eines geladen ist, wird der ClassLoader gespeichert, und alle anderen werden automatisch geladen. Ist noch ganz praktisch :wink: )
(Was Du versuchen kannst: das Look And Feel im ext-Ordner zu speichern, dein Programm schreiben, und anschliessend das Look And Feel wieder aus dem ext-Ordner löschen. Dann musst du einfach den ClassLoader möglichst früh initialisieren. Graue Theorie, aber wer weiss... )
Code:
/*
* Created on 09.01.2004
*/
package fightSimulator.plugin.io;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.jar.Attributes;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.jar.Manifest;
/**
* @author Benjamin Sigg
*/
public class JarFileClassLoader extends ClassLoader {
private JarFile file;
public JarFileClassLoader( JarFile file ){
this.file = file;
}
public JarFileClassLoader( File file ) throws IOException{
this.file = new JarFile( file );
}
public Class findClass(String name) throws ClassNotFoundException {
byte[] b = loadClassData(name);
if( b == null )
throw new ClassNotFoundException( "Can't find class " + name );
return defineClass(name, b, 0, b.length);
}
private byte[] loadClassData(String name) {
JarEntry entry = searchEntryFor( name );
if( entry != null ){
try {
InputStream in = file.getInputStream( entry );
int size = (int)entry.getSize();
byte[] input = new byte[ size ];
int readed = 0;
while( readed < size ){
int newRead = in.read( input, readed, size-readed );
if( newRead <= 0 )
throw new IOException( "Klassendatei kann nicht gelesen werden, 0 Bytes erhalten, file=" + file.getName() + ", class=" + name );
else
readed += newRead;
}
in.close();
return input;
}
catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
private JarEntry searchEntryFor( String className ){
String fileName = className.replace( '.', '/' ) + ".class";
return file.getJarEntry( fileName );
}
}
Und eine Klasse kannst du folgendermassen laden:
Code:
JarFileClassLoader loader = new JarFileClassLoader( file ); // irgend eine jar-Datei
String className = "packageX.ClassY"; // Irgend ein Name
Class clazz = loader.loadClass( className );
Object obj = clazz.newInstance();
ClassY clazzY = (ClassY)obj;
Wieder einmal danke an Beni für diesen Tip mit dem Classloader (wieder mal was sinnvolles gelernt).
Jetzt habe ich aber noch eine Frage:
Ich hab mir bei sun ein jar-File mit gif-bildchen runtergeladen und weis jetzt nicht wie ich auf diese Bilder zugreifen kann, da es ja keine Klassen sind und entpacken wäre ja auch nicht im sinne der erfindung (die anleitung bei sun hat mir auch nicht wirklich geholfen)[/url]
import javax.swing.ImageIcon;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.Vector;
import java.io.IOException;
import java.io.InputStream;
import java.io.ByteArrayOutputStream;
/**
* class IconFactory
* Liest alle icons aus dem gegebenem JarFile
*/
/**
* @author Janni Kovacs
*/
class IconFactory
{
static Vector icons = new Vector();
/**
* liest die icons.
* @throws IOException wenn die Datei nicht gefunden wurde, oder sie nicht geladen werden konnte.
*/
public static void loadIcons(String fileName) throws IOException
{
JarFile iconsFile = new JarFile(fileName);
int c;
for(int i=0;i<iconsFile.size();i++){
ByteArrayOutputStream os = new ByteArrayOutputStream();
InputStream is = iconsFile.getInputStream(new JarEntry(iconsFileNames[i]));
while((c = is.read()) >= 0){
os.write(c); }
icons.add(new ImageIcon(os.toByteArray())); c=0; }
}
}
ich hab die jetzt mal ein bisschen verändert, so das man es besser nachvollziehen kann.