Wie PlugIn Funktion für eigene Anwendung programmieren?

ArneKDO

Grünschnabel
Habe schon ein Tutorial zum Theme PlungIn auf dieser Seite dazu gelesen, aber
damit konnte ich nichts anfangen.

Mein Vorhaben:

1 - Ich habe ein JavaProgramm (Frame), mit einem Panel.

2 - Ich habe ein neues Projekt mit einem Panel, auf dem ein Button und etwas Text ist (panel.class).

Nun möchte ich, dass mein JavaProgramm(1) zur Laufzeit die Datei panel.class
öffnet und das Panel(2) darin in das Panel meines JavaProgramms(1) lädt.
So als PlugIn Variante eben.

Wie mache ich das? Gibt es da irgendwo ein Beispiel zu?

Danke und Gruß,

Arne Eckhoff
 
Wenn die Klasse von Panel abgeleitet ist es ganz einfach:

meinFrame.add(myPanel);

oder im Konstruktor (voraussetzung abgeleitet von Frame)
add(myPanel);
wenn du es zu einem anderen Panel hinzufüngen möchtest

panel.add(myPanel);

add(panel);

etc.

mfg
 
Zuletzt bearbeitet:
...das ist schon klar, nur wie bekomme ich das myPanel?

Ich habe mein Programm. In meinem Programmordner gibt es einen
Unterordner mit sagen wir mal 4 .class Dateien. Das Programm weiss nur,
dass das Panels sind in den .class Dateien. Wie kann ich jetzt das Panel aus
der .class Datei in mein Panel im Programm laden? Irgendwie muss ich ja die
Datei öffnen und da das Panel rausziehen.
Hintergrund ist, dass ich beliebig viele .class Dateien in diesen Unterordner
stecken möchte, die man dann in das Panel im Hauptprogramm laden kann,
ohne den Code des Hauptprogrammes zu ändern.
Danke und Gruß,

Arne
 
Also als erster musst du die Klasse Importieren.

Korrigiert mich wenn ich mich irre:

import Unterordner.Klasse;

So dann musst du ein neues Objekt von dieser Klasse erzeugen.
Das sieht dann,wo auch immer, die folgende Zeile in deinem Code steht.

Klasse myPanel=new Klasse(Parameter1,Parameter2,...);

und dann wie oben beschrieben fortfahren.

mfg
 
Ich glaube nicht das er das will.
er möchte lediglich sein Panel aus einem Unterordner,
zu seinem Frame hinzufügen.

wie eine Lib.

also ein package erstellen worin Klassen vorhanden sind auf die dann jeder zugreifen kann.

nehme ich mal an.
 
Simpleste Methode:

ClassLoader c = new URLClassLoader("pfadzumveerzeichnis");
Class c = c.loadClass("de.dings.blub.Bla");
Interface o = (Interface) c.newInstance();

Hierbei fallen zwei Dinge auf:
a) er muß dafür Sorge tragen den Leuten zu sagen das diese ?Plugins? dem einen gemeinsamen Interface entsprechen

und
b) eventuell muß er zuvor diesen Pfad rekursiv durchsuchen um damit den full qualified Classname für alle dort abgelegten .class Dateien herauszufinden. Denn diese landen dann ja in einer schleife die mit c.loadClass(fullQualified); diese Klassen laden.

achja: Exceptions fangen und auch eventuell zuvor prüfen ob c wirklich vom genannten Interface erbt. Also c.getInterfaces(); liefert ein Array mit Class elementen. Diese iterieren und in der Art zuvor mit dem Interface vergleichen: if(c[1] == Interface.class) { jetzt funktioniert der cast nach newInstance() }

Fallstricke gibts in dem Falle allerdings noch immer genügend ;o) (Wenn doch nur der eigene PluginLoader so einfach umzusetzen wäre :/ )

cybi
 
Original geschrieben von Trespasser
Ich glaube nicht das er das will.
er möchte lediglich sein Panel aus einem Unterordner,
zu seinem Frame hinzufügen.

wie eine Lib.

also ein package erstellen worin Klassen vorhanden sind auf die dann jeder zugreifen kann.

nehme ich mal an.

Du magst recht haben - dann wäre es allerdings kein Plug-In. Vielleicht hat sich sein Problem ja durch unsere Antworten gelöst - oder aber er präzisiert seine Fragestellung.
 
Original geschrieben von Cybernd
ClassLoader c = new URLClassLoader("pfadzumveerzeichnis");
Class c = c.loadClass("de.dings.blub.Bla");
Interface o = (Interface) c.newInstance();

Das wars. Hab da noch ein bischen nach gegoogelt und es funktioniert.
Ich ermittel nun alle .class Dateien, die mit "plugin_" anfangen aus dem
unterverzeichnis /plugins und zeige diese in einer Listbox an. Dann kann man
einen Eintrag auswählen und das Panel aus der externen Datei wird in das
Hauptpanel meines Programmes geladen :)
Hier der Code:

Code:
[COLOR=darkblue]
void list1_actionPerformed(ActionEvent e) {
    // Aus der Liste wurde ein Element ausgewählt
    // Panel leeren... 
    this.pnl_Main.removeAll();
    this.pnl_Main.updateUI();
    
    // .class Datei laden und eine Instanz davon erzeugen... 
    String pfad = "C:\\jbproject\\TestContainer\\plugIns";
    String klassename;
    // Klassenname = Name des Listitems zusammen
    klassename = list1.getSelectedItem().toString().replaceAll(".class","");
    Object testObject = null;

    // Pfad und Klasse laden 
    URL url = null;
    try {
      url = new File(pfad).toURL();
    }
    catch (MalformedURLException ex) { }
    
    URLClassLoader cl = new URLClassLoader( new URL[]{ url } );
    Class c = null;
    
    // Klasse laden 
    try {
      c = cl.loadClass(klassename);
    }
    catch (ClassNotFoundException ex1) {}
    
    // Instanz von der Klasse erzeugen (Panel) 
    try {
      testObject = c.newInstance();
    }
    catch (IllegalAccessException ex2) {}
    catch (InstantiationException ex2) {}

    // Das ganze als Component Konvertieren, da mein ein Object nicht ins Panel laden kann 
    Component myPlugIn = (Component) testObject;

    // Component (Panel aus externer .class Datei) in das Haupt-Panel laden 
    this.pnl_Main.add(myPlugIn);
    this.pnl_Main.updateUI();
  }

Danke und Gruß,

Arne
 
Zwei klitzekleine Hinweise:

a)
igitt igitt: "pfad\\subpfad"

sollte wohl ein

"pfad" + File.separatorChar + "subpfad"
werden

b)
Toll wie du deine Exceptions ungelesen wegwirfst ;o) Wäre es nicht angebrachter sie rudimentär zu behandeln? Und wenn es nur ein stacktrace im Logfile wird ..

cybi
 
Zurück