Ein Button stellt eine Schaltfläche zur Verfügung, die mit der Maus betätigt werden kann. Auf den meisten Systemen wirkt ein Button als hervortretende Fläche, die mit einem Mausklick versenkt werden kann. Ein Button ist kein Schalter, der an- und ausgeschaltet werden kann. Er ist vielmehr als eine Art Taster anzusehen, der nach Lösen der Maustaste wieder sein ursprüngliches Aussehen annimmt. So erzeugt ein Button noch keinen Event, wenn die Maustaste gedrückt wird. Erst das Lösen der Maustaste bewirkt eine entsprechende Nachricht an die Applikation.
Das folgende Beispiel erzeugt einen wachsenden und schrumpfenden Button:
/* Example button.c */ : if(j_start()<0) printf("can't connect to server\n"),exit(0); frame = j_frame("Growing Button"); menubar = j_menubar(frame); file = j_menu(menubar,"File"); quit = j_menuitem(file,"Quit"); button = j_button(frame,"increase"); j_setsize(button,80,20); j_setpos(button,88,138); j_setsize(frame,256,256); j_show(frame); while(1) { obj=j_nextaction(); if(obj==button) { if(!big) { for(i=0;i<=40;i++) { j_setsize(button,80+i*2,20+i*2); j_setpos(button,85-i,138-i); j_sync(); } big=1; j_settext(button,"shrink"); j_settext(frame,"Shrinking Button"); } else { for(i=40;i>=0;i--) { j_setsize(button,80+i*2,20+i*2); j_setpos(button,85-i,138-i); j_sync(); } big=0; j_settext(button,"increase"); j_settext(frame,"Growing Button"); } } if((obj==quit) || (obj ==frame)) break; } j_quit(); :
Zunächst wird ein Button erzeugt:
button = j_button(frame,"increase");
Ein Button benötigt als Parameter einen Titel, und ein Objekt, in dem er erscheinen soll. In diesem Beispiel wird der Button in dem Frame angezeigt. Der Titel bestimmt auch die Größe eines Buttons. Ein Button ist immer so groß, daß er seinen Titel darstellen kann. Daher ist ein in der Regel nicht nötig, einem Button eine spezielle Größe zuzuweisen. Im Beispiel wird dem Button dennoch eine initiale Größe von 80x20 Pixeln zugewiesen:
j_setsize(button,80,20);
Zudem wird der Button mit der Funktion:
j_setpos(button,88,138);
an einen festen Platz innerhalb des umgebenden Objektes zugewiesen. Bezugspunkt ist die linke obere Ecke des Buttons. Durch diese Anweisung soll der Button zentriert im Frame erscheinen. Dazu muß jedoch auch dem Frame eine Größe zugewiesen werden. Da der Button ''wachsen'' soll, muss der Frame groß genug sein, um auch den ''großen'' Button noch anzeigen zu können. Daher wird der Frame mit der folgenden Anweisung ausreichend dimensioniert:
j_setsize(frame,256,256); j_show(frame);
In der Event Loop wird nun bei Anklicken des Buttons zunächst ein Flag 'big' abgefragt, das anzeigt, ob der Button z.Z. klein oder groß dargestellt ist. Hat er eine kleine Form, so wird in der 'for' Schleife:
for(i=0;i<=40;i++) { j_setsize(button,80+i*2,20+i*2); j_setpos(button,85-i,138-i); j_sync(); }
Größe und Position des Button so verändert, daß er zu wachsen scheint. Mit der anschließenden Anweisung:
j_sync();
veranlassen wir eine Syncronisierung der beiden Prozesse. Die Applikation wartet an dieser Stelle solange, bis der JAPI Server alle vorherigen Anweisungen vollzogen hat. Ohne diese Syncronisierung würde der Button schlagartig seine Größe ändern. Auf schnellen Systemen kann es zudem sinnvoll sein, eine weitere Bremse einzubauen. Dazu steht eine Funktion j_sleep(int msecs) zur Verfügung, bei der die Applikation für einige Millisekunden schlafen gelegt werden kann.
Ist die Schleife beendet, wird das Flag 'big' entsprechend umgesetzt. Anschließend werden mit den Anweisungen
j_settext(button,"shrink"); j_settext(frame,"Shrinking Button");
dem Frame eine neue Überschrift gegeben. Weiterhin bekommt der Button einen neuen Titel. Diese Funktion zeigt, daß eine Funktion durchaus auf verschiedene graphische Elemente angewendet werden kann. Welche Funktion auf welche Elemente anwendbar ist, ist im Reference Teil dieser Anleitung in jeder Funktion beschrieben.
Der else Zweig der Flagabfrage bewirkt ein Schrumpfen des Buttons auf die ursprüngliche Größe und benutzt dieselben Funktionen wie zuvor.
Auch graphische Buttons sind unter der Japilib möglich. Die entsprechende JAPI Funktion lautet:
j_graphicbutton(int frame, char* filename);
Im Unterschied zu einem normalen Button, erwartet der graphische Button keinen Titel, sondern einen Filenamen, der ein Bild enthält, das der Button anzeigen soll. Der Filenamen muss dabei auf ein File verweisen, daß eine Graphik Datei in GIF oder JPEG Format enthält.
Auch dieser Button ist in seiner Größe veränderbar. Er besitzt zwar zunächst eine Größe, die durch das Bild vorgegeben ist, kann jedoch jederzeit mit der nun bereits bekannten Funktion j_setsize() scaliert werden.
Das folgende Beispiel baut mit sechs Button einen Buttonbar auf, die unter den Windows Systemen weit verbreitet ist:
/* Example graphicbutton.c */ : if(j_start()<0) printf("can't connect to server\n"),exit(0); frame = j_frame("Graphic Buttons"); j_flowlayout(frame,J_HORIZONTAL); gbutton = j_graphicbutton(frame,"../images/open.gif"); gbutton = j_graphicbutton(frame,"../images/new.gif"); gbutton = j_graphicbutton(frame,"../images/save.gif"); gbutton = j_graphicbutton(frame,"../images/cut.gif"); gbutton = j_graphicbutton(frame,"../images/copy.gif"); gbutton = j_graphicbutton(frame,"../images/paste.gif"); j_pack(frame); j_show(frame); while(1) { if(j_nextaction()==frame) break; } :
Auf die noch unbekannte Funktion j_flowlayout() soll hier nur sehr kurz eingegangen werden. Sie wird im Kapitel 3 ausführlicher erläutert. Sie sorgt in diesem Beispiel dafür, das die Buttons gleichmäßig nebeneinander angeordnet werden, ohne das sich der Programmierer um eine Positionierung kümmern muß.
Da keiner der Button in der Eventloop abgefragt wird, werden allen Elementern dieselbe Variable gbutton zugeordnet. Das Beispiel erzeugt eine Oberfläche, die in der Abbildung 2.11 zu sehen ist.