F
Florian S.
Gast
Hallo,
ich habe ein eigenes Pluginsystem für mein Programm geschrieben. Dabei wird die JAR-Datei, die das Plugin enthält über den ClassLoader geladen. Das funktioniert auch alles ganz schön - hat mich ja bisher auch schon viel Arbeit gekostet!
Jetzt habe ich allerdings das Problem, dass ich keine Icons mehr aus der JAR-Datei anzeigen kann, sondern nur aus dem Stammverzeichnis meines Programmes. Ich lade die Icons über die ImageIcon-Methode und in dem JAR ist ein Ordner namens "images", der die Icons enthält. Jetzt suche ich nach einer Lösung, dass ich die Icons aus dem JAR anzeigen kann.
Hier den Code meines Hauptprogrammes:
Und hier mein Plugin:
Über das Plugin auf die Ressourcen meines Hauptprogrammes zuzugreifen, geht wunderbar, nur eben auf die Ressourcen in dem JAR-File nicht!
Vielen Dank für eure Hilfe schon mal im Voraus!
Florian
ich habe ein eigenes Pluginsystem für mein Programm geschrieben. Dabei wird die JAR-Datei, die das Plugin enthält über den ClassLoader geladen. Das funktioniert auch alles ganz schön - hat mich ja bisher auch schon viel Arbeit gekostet!
Jetzt habe ich allerdings das Problem, dass ich keine Icons mehr aus der JAR-Datei anzeigen kann, sondern nur aus dem Stammverzeichnis meines Programmes. Ich lade die Icons über die ImageIcon-Methode und in dem JAR ist ein Ordner namens "images", der die Icons enthält. Jetzt suche ich nach einer Lösung, dass ich die Icons aus dem JAR anzeigen kann.
Hier den Code meines Hauptprogrammes:
Code:
package jdesktopTests;
import java.awt.BorderLayout;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.StringTokenizer;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
import javax.swing.SwingUtilities;
import javax.swing.filechooser.FileFilter;
public class JDesktopMain extends javax.swing.JFrame {
{
//Set Look & Feel
try {
javax.swing.UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
} catch(Exception e) {
e.printStackTrace();
}
}
private JLabel ueberschrift;
private JPanel jPanel1;
private JLabel jLabel1;
private JPanel centerPanel;
private JPanel eastPanel;
private JPanel westPanel;
/**
* Auto-generated main method to display this JFrame
*/
public static void main(String[] args) {
JDesktopMain inst = new JDesktopMain();
inst.setLocationRelativeTo(null);
inst.setVisible(true);
}
public JDesktopMain() {
super();
initGUI();
loadAllModules();
}
private void initGUI() {
try {
BorderLayout thisLayout = new BorderLayout();
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
getContentPane().setLayout(thisLayout);
{
ueberschrift = new JLabel();
getContentPane().add(ueberschrift, BorderLayout.NORTH);
ueberschrift.setText("JDesktopTestCenter");
}
{
jPanel1 = new JPanel();
BorderLayout jPanel1Layout = new BorderLayout();
jPanel1.setLayout(jPanel1Layout);
getContentPane().add(jPanel1, BorderLayout.CENTER);
{
centerPanel = new JPanel();
jPanel1.add(centerPanel, BorderLayout.CENTER);
}
}
pack();
setSize(400, 300);
} catch (Exception e) {
e.printStackTrace();
}
}
public void loadAllModules() {
//Alle Gadget-Dateien auslesen
/*
* Später noch allgemein schreiben
*/
File path = new File("C:\\Programme\\Eclipse\\workspace\\JDesktop\\jdesktopTests\\gadgets");
File[] files = path.listFiles(new JarFileFilter());
//Plugins reservieren
JPanel[] plugins = new JPanel[files.length];
//Plugins laden
for (int i = 0; i < files.length; i++) {
URL extLibUrl;
try {
extLibUrl = new URL("file", "localhost", files[i].getAbsolutePath());
URLClassLoader loader = new URLClassLoader(new URL[]{extLibUrl});
System.out.println(extLibUrl.getFile());
StringTokenizer filename = new StringTokenizer(extLibUrl.getFile(),"\\", false);
String file = null;
while (filename.hasMoreElements()) {
file = filename.nextToken();
}
System.out.println("Datei: "+file);
StringTokenizer ext = new StringTokenizer(file,".",false);
String klasse = ext.nextToken();
System.out.println("Klasse: "+klasse);
final Class extClass = loader.loadClass("gadget."+klasse);
plugins[i] = (JPanel) extClass.newInstance();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//Plugins anzeigen
for (int i = 0; i < plugins.length; i++) {
centerPanel.add(plugins[i]);
}
getContentPane().repaint();
}
}
Und hier mein Plugin:
Code:
package gadget;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class HelloWorld extends JPanel{
public HelloWorld() {
JLabel label = new JLabel("Hello World!");
label.setIcon(new ImageIcon(getClass().getClassLoader().getResource("images/logo.png")));
this.add(label);
}
}
Über das Plugin auf die Ressourcen meines Hauptprogrammes zuzugreifen, geht wunderbar, nur eben auf die Ressourcen in dem JAR-File nicht!
Vielen Dank für eure Hilfe schon mal im Voraus!
Florian