Ein Label stellt einen einzeiligen Text beliebiger Länge dar. Dieser ist nicht vom Benutzer editierbar, sondern kann nur von der Applikation verändert werden. Ein Label bietet daher keine Interaktionsmöglichkeit, sondern dient nur der Infornationsweitergabe. Folgendes Beispielprogramm läßt ein Label im Applikationsfenster wandern:
/* Example label.c */ : if(j_start()<0) printf("can't connect to server\n"),exit(0); frame = j_frame("Moving Label"); menubar = j_menubar(frame); file = j_menu(menubar,"File"); doit = j_menuitem(file,"Start"); quit = j_menuitem(file,"Quit"); label = j_label(frame,"Hello World"); j_setpos(label,10,120); j_setsize(frame,256,256); j_show(frame); width = j_getwidth(label); height = j_getheight(label); dx=2; dy=1; while(1) { if(run) obj=j_getaction(); else obj=j_nextaction(); if(obj==doit) { if(!run) { run=1; j_settext(doit,"Stop"); } else { run=0; j_settext(doit,"Start"); } } if(run) { j_getpos(label,&x,&y); if((x+width >= j_getwidth(frame)) || (x<1)) dx = -dx; if((y+height >= j_getheight(frame)) || (y<1)) dy = -dy; j_setpos(label,x+dx, y+dy); j_sync(); j_sleep(1000); } if((obj==quit) || (obj == frame)) break; } j_quit(); :
Diese Programmzeilen:
label = j_label(frame,"Hello World"); j_setpos(label,10,120); width = j_getwidth(label); height = j_getheight(label);
erzeugen ein Label mit der Inschrift ''Hello World'', setzen seine Position fest, und ermitteln die initiale Höhe und Breite, die durch den Text festgelegt werden. Ein Label verhält sich genauso wie ein Button. Wird dem Element keine spezielle Größe mit j_setsize() zugeordnet, so wird seine Größe durch den Schriftinhalt festgelegt. Diese Größe kann vom Japi Server jedoch erst dann ermittelt werden, wenn das Element bereits angezeigt ist, da auch der eingestellte Bildsschirmfont die Größe beeinflusst. Aus diesem Grund sollte der umgebende Frame bereits mit j_show() sichtbar gemacht worden sein, bevor der Aufruf j_getwidth() oder j_getheight() erfolgt. Wird eine Größe festgelegt, ist diese Einschränkung nicht zu beachten.
Die Eventloop enthält kaum neue Funktionen. In dem if-Statement:
if(run) { j_getpos(label,&x,&y); if((x+width >= j_getwidth(frame)) || (x<1)) dx = -dx; if((y+height >= j_getheight(frame)) || (y<1)) dy = -dy; j_setpos(label,x+dx, y+dy); j_sync(); j_sleep(1000); }
wird mit j_getpos(label,x,y) die aktuelle Position des Labels ermittelt. Die Parameter x bzw. y enthalten nach dem Aufruf die Koordinatenpunkte der linken oberen Ecke des Elements. In den beiden folgenden If Statements wird die Lage des Elements mit der Größe des Fensters verglichen. Erreicht das Label den Rand des Fensters so wird seine Bewegungsrichtungen invertiert. Durch einen erneuten Aufruf von j_setpos() wird das Label auf die neue Position verschoben. Bei der Lageberechnung werden jedesmal Hoehe und Breite des Frames ermittelt. Dadurch funktioniert die Animation auch dann, wenn das Fenster mit der Maus vergrößert oder verkleinert wurde. Allerdings ist diese permantente Größenermittlung sehr ineffizient. Daher ist die Animation auch sehr zäh in der Bewegung. Wir werden später auf dieses Beispiel noch zurückgreifen, um eine effizientere Implementierung vorzustellen.
Läßt man die Animation eine Weile laufen, so stellt man fest, daß das Label hinter der Menubar verschwindet. Da die Menubar in dem Frame liegt, ist dies eigentlich nicht weiter verwunderlich. Nun könnte man dies recht einfach abfangen, indem man annimmt, daß eine Menübar eine Höhe von ungefähr 50 Pixeln besitzt, und das Label eben umkehren muß, wenn es diese Grenze überschreitet. Problematisch gestaltet sich die Sache dann, wenn dieselbe Applikation auf verschiedenen Plattformen laufen soll. Dort haben Menubars unterschiedliche Höhe, sodaß man den Beginn des sichtbaren Bereich des Frames nicht eindeutig festlegen kann. Auch auf die Lösung dieses Problems wird später noch einmal eingegangen.
Will man mehrere Labels gleicher Größe untereinander darstellen, so stellt man fest, daß der Text innerhalb der Label mittig dargestellt wird. Dies läst sich mit der Anweisung:
j_setalignment(int label, int alignment)
ändern. Zulässige Werte für alignment sind dabei die vordefinierten Konstanten J_LEFT für linksbündige Ausrichtung, J_CENTER für mittige Ausrichtung und J_RIGHT für rechtsbündige Ausrichtung.
Analog zu den Button gibt es auch grahische Labels. Die Funktion zum Erzeugen dieser Label ist mit denen der Button identisch:
j_graphiclabel(int frame,char* filename);
Auch hier wird statt einem String zur Labelbeschriftung ein String mit einem Filenamen übergeben, der das Bild enthält, das angezeigt werden soll. Das Bild muß im GIF oder JPEG Format vorliegen. Das folgende Beipiel erzeugt aus einem GIF Bild drei Labels unterschiedlicher Größe (siehe Abbildung 2.13):
/* Example graphiclabel.c */ : if(j_start()<0) printf("can't connect to server\n"),exit(0); frame = j_frame("Graphic Labels"); j_show(frame); label = j_graphiclabel(frame,"mandel.gif"); j_setpos(label,10,30); j_setsize(label,50,50); label = j_graphiclabel(frame,"mandel.gif"); j_setpos(label,70,30); j_setsize(label,150,240); label = j_graphiclabel(frame,"mandel.gif"); j_setpos(label,230,30); while(j_getaction() != frame); :