1 Erweiterung durch eigene Java

Werbung
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.
Herunterladen