BlackBox-Framework - Plugin Programmierung

coree

Mitglied
Hallo,

ich habe für eine Aufgabe in der Uni ein Programm geschrieben, welches verschiedene Features besitzt.
In der aktuellen Aufgabe sollen diese Features in Plugins "ausgelagert" und zum Programmstart geladen werden (also kein Nachladen während das Programm läuft).

Relativ unproblematisch sind so einfache Dinge wie Buttons etc. zur GUI hinzuzufügen. Sprich Plugin wird geladen, Button wird an entsprechender Stelle in die GUI gesetzt.

Probleme habe ich bei der Funktionalität. Denn mein Programm besitzt Methoden, welche in der Regel immer die gleichen sind, jedoch verändert ein Feature diese Methode leicht. Und hier fehlt mir im Moment der Ansatz das vernünftig um zu setzen.
Ich kann mir nicht vorstellen, dass es Sinn und Zweck ist im Interface diese Methode zur Verfügung zu stellen und somit jedes Plugin diese Methode quasi mit gleichem Inhalt zu überschreiben (Ausnahme das Plugin mit der kleinen Änderung).

Ebenso weiß ich leider auch nicht so recht, wie ich Abhängigkeiten zwischen Plugins realisieren kann. Sprich ein Plugin benötigt unbedingt ein anderes um geladen werden zu können. Wobei man hier wohl ne einfache Abfrage machen könnte, ob das benötigte Plugin geladen wurde oder nicht. Eine Liste aller Plugins besitze ich ja.

Also wenn mir jemand bei meiner Denkblockade bzgl. der Funktionalität weiterhelfen kann, wäre ich dafür sehr dankbar.

Wenn nötig kann ich auch gewisse Codeteile posten.

PS: Die Plugins werden per Hand über die Mainmethode geladen (PluginLoader ist nicht gefordert).
 
Zuletzt bearbeitet:

coree

Mitglied
Ich habe mich glaube ich auch recht umständlich ausgedrückt.

Also so sieht bisher das Programm in etwa aus:


Java:
public class Player extends JFrame{

    private Actions actions = new Actions(this);
    private MP3Player mp3player = new MP3Player(this);

    public static void main(String[] args){
        new Player().setVisible(true);
    }
        
    private Player()  {
        ...
        volumeCtrl = new JSlider(SwingConstants.HORIZONTAL,0,100,50);
        volumeCtrl.addChangeListener(new ChangeListener(){
            @Override
                public void stateChanged(ChangeEvent arg0) {
                    FloatControl gainControl = 							(FloatControl)mp3player.getClip().getControl(FloatControl.Type.MASTER_GAIN);
                    double gain = volumeCtrl.getValue()/100.0;
                    float dB = (float)(20*Math.log(gain)/Math.log(10.0)); 
                    gainControl.setValue(dB);
                }
        });
    }
}

public class MP3Player {

    Player n;
    public MP3Player(Player n){
        this.n = n;
    }

    public void open(String filename) throws UnsupportedAudioFileException, IOException, LIneUnavailableException {
        
        [...]
        clip = AudioSystem.getClip();
        clip.open(stream);

//Dieser Teil wird derzeit mithilfe von FeatureIDE nur bei entsprechend ausgewähltem Feature kompiliert 
//und soll in das entsprechende VolumeControl-Plugin ausgelagert werden.
        //#if VolumeControl
			/*FloatControl gainControl = 
					(FloatControl)clip.getControl(FloatControl.Type.MASTER_GAIN);
			double gain = n.getVolumeCtrl().getValue()/100.0;
	        float dB = (float)(20*Math.log(gain)/Math.log(10.0)); 
	        gainControl.setValue(dB);*/

        //#endif

	}
    }
}

Bisher habe ich folgendes:
Java:
public class Player extends JFrame implements InputProvider{

    private Actions actions = new Actions(this);
    private MP3Player mp3player = new MP3Player(this);

    public JFrame getContentFrame(){
        return this;
    }
	
    public JPanel getLeftPanel(){
        return leftPanel;
    }

    private static String pluginName;
    private	List plugins;
	
    public static void main(String[] args){
        if (args.length == 0) System.out.println("Plugin name not specified");
        else {
            List pluginList = new ArrayList();
            try {
                for(int i = 0; i<args.length;i++){
                    pluginName = args[i];
                    Class<?> pluginClass = Class.forName(pluginName);
                    pluginList.add(pluginClass.newInstance());
                }
                new Player(pluginList).setVisible(true);
            } catch (Exception e) {
               System.out.println("Cannot load plugin " + pluginName +	 ", reason: " + e);
            }
        }
    }
    private Player(List plugins)    {		
        this.plugins=plugins;
        for	(Object plugin: plugins) {
            if (plugin instanceof GraphicalInterface){
                ((GraphicalInterface) plugin).setApplication(this);
                ((GraphicalInterface) plugin).addGraphicalElement();
            }
        }
    }
}

public interface InputProvider {

    JFrame getContentFrame();
    JPanel getLeftPanel();
    MP3Player getMP3Player();
}

public interface GraphicalInterface {
    void setApplication(InputProvider app);
    void addGraphicalElement();
}

public class VolumeControl implements GraphicalInterface{

    private InputProvider application;
    private JPanel volumePanel;
    private JSlider volumeCtrl;
    private JLabel volumeLabel;
	
    @Override
    public void setApplication(InputProvider app) {this.application = app;}

    @Override
    public void addGraphicalElement() {
    volumeCtrl = new JSlider(SwingConstants.HORIZONTAL,0,100,50);
    volumeCtrl.addChangeListener(new ChangeListener(){
        @Override
        public void stateChanged(ChangeEvent arg0) {
            FloatControl gainControl = 						(FloatControl)mp3player.getClip().getControl(FloatControl.Type.MASTER_GAIN);
            double gain = volumeCtrl.getValue()/100.0;
            float dB = (float)(20*Math.log(gain)/Math.log(10.0)); 
            gainControl.setValue(dB);
        }
    });
    application.getLeftPanel().add(volumeCtrl);
}
Also grafische Elemente, wie diesen Slider kann ich problemlos per Plugin meiner GUI hinzufügen. Nur reicht dies allein nicht, um die komplette Funktionalität des Features im Plugin unterzubringen. Für den auskommentierten Teil im oberen Programmausschnitt fehlt mir einfach der Ansatz bzw. die Idee, diesen entsprechend im Plugin zu verstauen. Bzw. wie ich hier den Hotspot am besten setzen könnte.

Solche kleinen Änderungen an einer Methode bei geladenem Feature habe ich leider an mehreren Stellen. Ich kann ja schlecht für jedes Plugin ein Interface schreiben, wessen Methode dann an genau dieser Stelle ausgeführt wird. Wäre ja nicht Sinn und Zweck eines Pluginsystems.

Ich hoffe das Ganze ist nun etwas klarer.
 
Zuletzt bearbeitet:

stg

Top Contributor
Ich versteh immer noch nicht ganz, was du genau machen willst, aber ich bin auch müde und hab gerade keine große Lust übermäßig viel nachzudenken... :oops:

Auf den ersten Blick hört sich das für mich aber nach einem Decorator-Problem an. Falls dir das nichts sagt, dann schau für einen ersten Überlick mal die entsprechende Wiki-Seite (Decorator ? Wikipedia) an. Vielleicht bringt dich das ja schon weiter...
 

Ruzmanz

Top Contributor
Einen groben Überblick zu dem Thema findest du in dieser Arbeit. Du musst deine Anforderung und Zeitaufwand präzisieren, sonst [STRIKE]kann[/STRIKE] will man dir keine Antwort geben ... das Thema kann man in 2 Sätzen abhandeln oder in 1000 Seiten.

Genau so wie du deine Buttons hinzufügst, kannst du auch neue Funktionalitäten hinzufügen. Habe mal schnell was zusammengetippt, evt. hilft es dir weiter.

Intern:
Java:
private HashMap<String, JComponent> components = new HashMap<>();
private JButton exit;

/* Wird einmal beim Programmstart aufgerufen */
public void init() {
    components = new HashMap<>();
     components.put("exit", exit);
    for(IPlugin plugin: plugins) {
      plugin.init(components);
   }
}

/* Wird jede Sekunden aufgerufen */
public void doLogic() {
    // XYZ-Code
    for(IPlugin plugin: plugins) {
      plugin.doLogic();
   }
   // ZYX-Code
}

Plugin (Button eigenschaften verändern und neuen Button hinzufügen):
Java:
public class MyPlugin extends IPlugin {
   public void init(HashMap<String, JComponent> components) {
      JButton button = (JButton) components.get("exit");
      if(exit != null) {
          // exit.addActionListener() ...
      }
      
       JButton newButton = new JButton("A");
       // aufs Panel setzen und andere Sachen mit dem Button machen.
       components.put("plugin3_hack", newButton);
   }
   public void doLogic() {}
}

Plugin (LSD-Blinker):
Java:
public class MyPlugin extends IPlugin {
   private HashMap<String, JComponent> components;

   public void init(HashMap<String, JComponent> components) {
      this.components = components;
   }

   // Ändert von allen Komponenten zufällig die Hintergrundfarbe. (Wird vom Hauptprogramm jede Sekunde aufgerufen.
   public void doLogic() {
      for(JComponent c: components.values()) {
         // c.setBackground(Random Color)
      }
   }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D JUNG Framework edge length Allgemeine Java-Themen 0
R Best Practice Erfahrungswerte für eine Migration von JSF nach Angular (oder anderes JS-Framework) Allgemeine Java-Themen 1
OnDemand PDF Erstellung / Reports Framework Allgemeine Java-Themen 3
OnDemand Pluginsystem Framework Allgemeine Java-Themen 8
Z Welches GUI Framework für Java ist aktuell? Allgemeine Java-Themen 16
S Interface Design von HookUp oder Callback Methoden für eigenes Framework Allgemeine Java-Themen 9
Kirby.exe Framework für Game Design Allgemeine Java-Themen 8
C Gutes Framework für ein Neuronales Netz Allgemeine Java-Themen 15
F Machine-learning Framework Allgemeine Java-Themen 0
D Library/Framework zum Umwandeln von Sound in Notenbilder Allgemeine Java-Themen 1
G Framework von nöten? Allgemeine Java-Themen 1
F Framework/Plugin für Tree-Darstellung in Graph Allgemeine Java-Themen 0
F Parser Framework/Plugin für Datei in Custom-Format Allgemeine Java-Themen 2
W Suche Framework zur Prüfung von IPv4 und IPv6 Allgemeine Java-Themen 2
J Interface Interface für Framework verwenden Allgemeine Java-Themen 4
M Suche Framework/API für Monitoring-Anwendung Allgemeine Java-Themen 3
S Android: SQLite Framework einbinden Allgemeine Java-Themen 2
B Experte Play Framework 1.2.5 Allgemeine Java-Themen 5
S OOP Problembereichsmodell: Bestehende Framework Klasse in eigene Klassenstruktur einbinden Allgemeine Java-Themen 9
darekkay (JUnit) Testdaten generieren - Framework? Allgemeine Java-Themen 2
S Framework für symetrische und asymetrische Verschlüsselung Allgemeine Java-Themen 3
W Framework für RichClient Anwendung? Allgemeine Java-Themen 4
A Framework für einen Web Service Allgemeine Java-Themen 6
D Frage zu Dependency Injection (mit Framework) Allgemeine Java-Themen 3
F Bildbearbeitung Framework Allgemeine Java-Themen 2
J Java Komponenten / Framework Allgemeine Java-Themen 5
L Web-Framework und Swing Framework o.ä Allgemeine Java-Themen 15
B Framework zum durchstöbern des classpath Allgemeine Java-Themen 2
B Was ist ein Framework? Allgemeine Java-Themen 36
E Java Media Framework Allgemeine Java-Themen 5
G Suche "richtiges" Framework/Library Allgemeine Java-Themen 14
M Swing Wünsche Feedback zu GUI-Framework Allgemeine Java-Themen 6
A 2D Framework für Java Allgemeine Java-Themen 2
N Graph mit JUNG-Framework erstellen Allgemeine Java-Themen 2
H Framework empfehlung / gute Anfängerbeispiele gesucht Allgemeine Java-Themen 12
T Lib/Framework zum Automatischen Aufruf von Methoden Allgemeine Java-Themen 2
T jmf Java Media Framework - Liste der unterstützten Medien? Allgemeine Java-Themen 11
X JAVA Framework für suspend and resume Allgemeine Java-Themen 2
D Banking Framework gesucht Allgemeine Java-Themen 5
G Swing Validierungs Framework Allgemeine Java-Themen 2
J Kleine Hilfe zum Framework Click Allgemeine Java-Themen 2
G Sehr gutes Java-Framework(Gui-Builder) auf XML-Basis gesucht Allgemeine Java-Themen 21
G Was ist ein Framework Allgemeine Java-Themen 4
C java media framework - Mikrofon wird nicht gefunden Allgemeine Java-Themen 18
J mp4 dateien mit dem Java Media Framework abspielen. Allgemeine Java-Themen 2
G Framework für Multi-Prozessor-Programmierung? Allgemeine Java-Themen 4
G Java Media Framework Allgemeine Java-Themen 8
ARadauer Java Desktop Framework Allgemeine Java-Themen 3
C JUNG Framework - einfacher Graph Allgemeine Java-Themen 7
H Java6 Scripting Framework. Allgemeine Java-Themen 3
N Was benötigt man fürs Java Media Framework? Allgemeine Java-Themen 12
J Problem mit Java Multimedia Framework Allgemeine Java-Themen 6
J Eure Meinung - Das JMF (Java Media Framework) Allgemeine Java-Themen 3
G Java Media Framework - Probleme Allgemeine Java-Themen 8
R Entsprechung von Stack() im Collections Framework...? Allgemeine Java-Themen 4
T Hilfe bei Programm. IDE: Eclipse mit EV3-Plugin, lejos Allgemeine Java-Themen 8
Meeresgott Best Practice MVC mit Plugin-Feature Allgemeine Java-Themen 4
J Application mit PLugin erweitern Allgemeine Java-Themen 2
T Eclipse IDE Plugin Error Log Allgemeine Java-Themen 0
S Java Plugin System (ohne OSGI) Allgemeine Java-Themen 10
S Maven Jars dynamisch laden / Plugin-Struktur erstellen Allgemeine Java-Themen 14
D Bradley Local Thresholding plugin imagej Allgemeine Java-Themen 6
A Best Practice Java - eine Art Plugin-Struktur Allgemeine Java-Themen 3
M eigenes Seekarten-Tool (oder PlugIn?) Allgemeine Java-Themen 2
J Java code "plugin" fähig machen Allgemeine Java-Themen 4
P Find Bugs plugin Allgemeine Java-Themen 2
Joew0815 Best Practice Wie am besten Plugin-System erstellen? Allgemeine Java-Themen 12
B Erste Schritte Plugin erkennen und Class Dateien anzeigen lassen Allgemeine Java-Themen 3
M ImageJ: Mit PlugIn Weichzeichnungsfilter schreiben Allgemeine Java-Themen 9
X Java Plugin Befehle Allgemeine Java-Themen 2
O Plugin perfomrant implementieren Allgemeine Java-Themen 12
Y PlugIn für ImageJ Allgemeine Java-Themen 2
B Java Plugin schreiben Allgemeine Java-Themen 11
U Realisierung einer "Plugin-Schnittstelle": Allgemeine Java-Themen 12
D Checkstyle Plugin Allgemeine Java-Themen 4
schlingel Plugin-Architektur - Welche nehmen? Allgemeine Java-Themen 6
partsch Eclipse UML - Plugin Allgemeine Java-Themen 2
agent47 Plugin System Verständnisfrage Allgemeine Java-Themen 6
P System.out im Eclipse plugin Allgemeine Java-Themen 4
A Start von Java Plugin Allgemeine Java-Themen 2
S URLClassLoader und Eclipse Plugin Allgemeine Java-Themen 4
S Intellisense nach SVN Subclipse Plugin Allgemeine Java-Themen 2
B maven 2 error bei plugin download Allgemeine Java-Themen 7
V plugin.jar in application aus jar Allgemeine Java-Themen 2
N Java Plugin? Allgemeine Java-Themen 2
M Plugin-System Allgemeine Java-Themen 4
N Argumente für Plugin-Architektur Allgemeine Java-Themen 5
S Plugin zur Generierung von Builds Allgemeine Java-Themen 7
J Java Plugin probleme beim Laden? Allgemeine Java-Themen 3
F Probleme mit eigenem Plugin-System Allgemeine Java-Themen 3
G AI als PlugIn Allgemeine Java-Themen 2
R Synthesizer-PlugIn Allgemeine Java-Themen 4
S java plugin in firefox/chroot_x86_32 integrieren Allgemeine Java-Themen 3
L Java6 update N bekommt neues Browser-Plugin, bitte testen. Allgemeine Java-Themen 7
G Plugin (Visual Editor) in Eclipse einfügen Allgemeine Java-Themen 2
F Plugin damit M$ Word Java syntax versteht? Allgemeine Java-Themen 12
V Relative Pfade in Eclipse RCP Plugin Allgemeine Java-Themen 14
G Java-Plugin für Vista (x64)? Allgemeine Java-Themen 3
N Plugin-System: Klassen über String laden Allgemeine Java-Themen 3
J Suse + Tomcat + Sysdeo Plugin: Tomcat als user starten Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben