1 Erweiterung durch eigene Java-Klassen 1.1 Einführung Java ist eine moderne, imperative objektorientierte Programmiersprache. Da PXLab in Java geschrieben ist kann man es auch relativ einfach mit Hilfe von Java erweitern oder den eigenen Bedürfnissen anpassen. Eine Auswahl an Literatur zum erlernen von Java ist am Ende dieses Kapitels aufgelistet, umfassende Einführungen sind hierbei [2] und [3], [1] bietet ein gute Einführung in die Sprache ohne Berücksichtigung von weitergehenden Techniken z.B. zur GUI-Programmierung, [4] ist die ozielle Spezikation der Sprache. 1.2 PXLab-Terminologie Display, alle weiteren Elemente eines ExperiContext-, Procedure oder Trial-Knoten sind Instanzen der Klasse DisplayList. besteht ein Display-Objekt aus DisplayElement-Objekten, dies sind einzelne Teile Die gemeinsame Oberklasse für alle Stimuli ist ments wie Weiterhin des Stimulus wie z.B. grasche Ausgaben. Man kann nun PXLab erweitern, indem man das System um weitere Display-Klassen ergänzt. 1.3 Beispiel: Klasse zum Zeichnen von Polygonzügen In diesem Kapitel wollen wir eine Display-Klasse zum zeichnen des Hauses vom Nikolaus ent- wickeln. Dabei steht der Name Haus des Nikolaus für folgenden Streckenzug. Und dieser soll durch unsere Klasse dargestellt werden können. 1 Schön wäre es wenn man unsere Klasse folgendermaÿen in ein Experiment einbinden könnte. Trial() { NikolausHaus() { Size = 100; Timer = RESPONSE_TIMER; } } Unsere Klasse soll also den Namen NikolausHaus.java NikolausHaus haben, dazu legen wir eine Datei mit Namen an in welcher der Quelltext gespeichert wird. Da unsere Klasse zum PXLab-Standardsuchpfad für Displayklassen gehören soll, müssen wir eine entsprechende Paketdeklaration an den Anfang unserer Datei stellen. package de.pxlab.pxl.display; 1 Eigentlich wird mit Haus des Nikolaus auch das Rätsel bezeichnet, diesen Streckenzug ohne abzusetzen zu zeichnen, mit diesen Rätsel hat unsere Klasse allerdings nichts zu tun, es soll diesen Streckenzug wirklich nur anzeigen und nicht etwa eine Versuchsperson das Rätsel lösen lassen. 1 Weiterhin möchten wir Zugri auf alle durch das System bereits zur Verfügung gestellten Klassen, insbesondere Display und ExPar, hierzu müssen wir die entsprechenden Pakete importieren. import de.pxlab.pxl.*; import java.awt.Polygon; Die Polygon-Klasse, welche Teil der Klassenbibliothek von Java ist, wurde gleich mit eingebun- den, da sie später noch benötigt wird. Damit unsere Klasse in ein Experiment eingebunden werden kann, muss sie von Display abge- leitet werden. public class NikolausHaus extends Display { // ... } Diese Klasse stellt zwei abstrakte Methoden zur Verfügung, die natürlich überschrieben werden müssen und folgende Aufgaben haben. create Einstellung der Zeitzähler (Timing-Parameter) und der Stimuli-Elemente (DisplayElements). computeGeometry Berechnung der Anzeigeelemente (Gröÿe, Farbe, Position etc.). Weiterhin muss natürlich auch ein öentlicher Konstruktor bereitgestellt werden. Damit hat unsere Datei jetzt schematisch folgenden Inhalt. package de.pxlab.pxl.display; import de.pxlab.pxl.*; import java.awt.Polygon; public class NikolausHaus extends Display { // ... public NikolausHaus() { setTitleAndTopic("House of the Nikolaus", DEMO); } private int polyElement; protected int create() { // ... } } protected void computeGeometry() { // ... } 2 Mit der setTitleAndTopic wird eine Beschreibung und eine Kategorie für unsere Klasse festgelegt, Parameter DEMO legt fest, dass diese Klasse nur zu Demonstrationszwecken dient und nicht für ernsthafte Experimente gedacht ist. Unsere Klasse sollte auch durch Parameter steuerbar sein, sinnvolle Parameter wären z.B. Farbe, Position und Gröÿe. Diese erhält unsere Klassen dadurch, dass wir ihr Felder des Typen ExPar hinzufügen, für jeden Parameter ist ein Feld notwendig. Folgender Quelltext muss unserer Klasse hinzugefügt werden. /** Color of the house. */ public ExPar Color = new ExPar(COLOR, new ExParValue( new ExParExpression(ExParExpression.LIGHT_GRAY)), "Color of the house"); /** Horizontal position of the house. */ public ExPar LocationX = new ExPar(HORSCREENPOS, new ExParValue(0), "Horizontal location of the house"); /** Vertical position of the house. */ public ExPar LocationY = new ExPar(VERSCREENPOS, new ExParValue(0), "Vertical location of the house"); /** The horizontal and vertical size of the house. */ public ExPar Size = new ExPar(SCREENSIZE, new ExParValue(40), "Size of the house"); Das erste Argument von ExPar ist ein Typbezeichner, der zweite ein Standardwert, der genau dann angenommen wird, wenn dieser Parameter nicht in der Design-Datei gesetzt wird. Das letzte Argument ist eine Beschreibung des Parameters. Nun kann man z.B. mit Size = 100; in der Designdatei den Wert der Variablen Size setzen. computeGeometry an. Unser Haus soll als Polygonzug gezeichnet werden, hierfür bietet PXLab die Klasse PolyLine an. Diese soll als DisplayElement unserer Klasse hinzugefügt werden, weiterhin soll unsere KlasSchauen wir uns nun die Implementierung der beiden Methoden create und se das Standard-Timing-Verhalten aufweisen, dass heiÿt der Benutzer unserer Klasse kann über den Parameter Timer in der Designdatei den Zeitzähler einstellen z.B. auf RESPONSE_TIMER. Dies defaultTiming. Unsere Methode hat damit folgende erreicht man durch Aufruf der Methode Gestalt. protected int create() { Polygon p = new Polygon(); } polyElement = enterDisplayElement(new PolyLine(Color), group[0]); defaultTiming(); return polyElement; Der Bezeicher polyElement ist dabei ein Attribut unserer Klasse vom Typ int und dient als DisplayElement. Man hätte hier auch direkt eine Referenz auf das Referenz auf das erzeugte 3 erzeugte PolyLine-Objekt speichern können, aber zu Demonstrationszwecken wurde das hier nicht gemacht. computeGeometry muss das Polygon entsprechend gesetzt und die Parameter Size, LocationX und LocationY ausgelesen werden. In protected void computeGeometry() { PolyLine el = (PolyLine)getDisplayElement(polyElement); Polygon p = new Polygon(); int s = Size.getInt(); p.addPoint(+s, p.addPoint(-s, p.addPoint(-s, p.addPoint(+s, p.addPoint(+s, p.addPoint(-s, p.addPoint( 0, p.addPoint(+s, p.addPoint(-s, } +s); +s); -s); +s); -s); -s); -s - s/2); -s); +s); el.setPolygon(p); el.setTranslation(LocationX.getInt(), LocationY.getInt()); Die komplette Klasse ist damit durch folgenden Quelltext gegeben. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 package de.pxlab.pxl.display; import de.pxlab.pxl.*; import java.awt.Polygon; public class NikolausHaus extends Display { /** Color of the house. */ public ExPar Color = new ExPar(COLOR, new ExParValue( new ExParExpression(ExParExpression.LIGHT_GRAY)), "Color of the house"); /** Horizontal position of the house. */ public ExPar LocationX = new ExPar(HORSCREENPOS, new ExParValue(0), "Horizontal location of the house"); /** Vertical position of the house. */ public ExPar LocationY = new ExPar(VERSCREENPOS, new ExParValue(0), "Vertical location of the house"); /** The horizontal and vertical size of the house. */ public ExPar Size = new ExPar(SCREENSIZE, 4 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 } new ExParValue(40), "Size of the house"); public NikolausHaus() { setTitleAndTopic("House of the Nikolaus", DEMO); } private int polyElement; protected int create() { Polygon p = new Polygon(); } polyElement = enterDisplayElement(new PolyLine(Color), group[0]); defaultTiming(); return polyElement; protected void computeGeometry() { PolyLine el = (PolyLine)getDisplayElement(polyElement); Polygon p = new Polygon(); int s = Size.getInt(); p.addPoint(+s, p.addPoint(-s, p.addPoint(-s, p.addPoint(+s, p.addPoint(+s, p.addPoint(-s, p.addPoint( 0, p.addPoint(+s, p.addPoint(-s, } +s); +s); -s); +s); -s); -s); -s - s/2); -s); +s); el.setPolygon(p); el.setTranslation(LocationX.getInt(), LocationY.getInt()); Eine Beispiel-Design-Datei zur Benutzung der Klasse. 1 Experiment() { 2 Context() { 3 AssignmentGroup() { SubjectCode = "pxlab"; } 4 Trial() { 5 NikolausHaus() { 6 Size = 100; 7 Timer = RESPONSE_TIMER; 8 } 5 9 10 11 12 13 14 15 16 17 18 } } } Procedure() { Session() { Block() { Trial(); } } } Literatur [1] K. Arnolds, J. Gosling, D. Holmes: [2] G. Krüger: Handbuch der Java-Programmierung, 4.Auage (www.javabuch.de) [3] C. Ullenboom: [4] J. The Java Programming Language, 4.Ed. Gosling, Java ist auch eine Insel (http://galileocomputing.de/openbook/javainsel6/) B. Joy, G. Bracha: The Java Language Specication, (http://java.sun.com/docs/books/jls/third_edition/html/j3TOC.html) 6 3.Ed.