Java AWT alles wird transportabel?
|
|
- Mareke Kneller
- vor 8 Jahren
- Abrufe
Transkript
1 Java AWT alles wird transportabel? Axel-Tobias Schreiner, Universität Osnabrück Zu Java gehört das Abstract Window Toolkit zur Programmierung grafischer Ober flächen mit dem look and feel der jeweiligen Plattform. Dieser dritte Ar tikel in der Java-Serie gibt an einem einfachen Beispiel einen kleinen Eindruck davon, wie man mit dem AWT mehr oder weniger portabel arbeitet. Die Aufgabe Abbildung 1 zeigt, wie man Temperaturen von Celsius in Fahrenheit umwandeln könnte: 1 import java.io.*; 2 3 public class a { 4 public static void main (String args []) { 5 try { 6 DataInputStream in = new DataInputStream(System.in); 7 String line; 8 while ((line = in.readline())!= null) { 9 double celsius = new Double(line).doubleValue(); 10 System.out.println("\t" + (9./5. * celsius + 32.)); 11 } 12 } catch(exception e) { 13 e.printstacktrace(system.err); 14 } 15 } 16 } Abbildung 1: Umwandlung von Celsius in Fahrenheit In der Hauptschleife liest man eine Textzeile als String (1-8), wandelt ihren Inhalt in einen double-wert um (1-9), berechnet aus dieser Celsius-Angabe einen Fahrenheit- Wert und gibt ihn aus (1-10). Eingabe und Umwandlung als double können zu einer Exception führen, für die dann der Kontext ausgegeben wird (1-13). In diesem Artikel wird schrittweise ein Programm mit grafischer Oberfläche entwickelt, das derartige Umwandlungsprobleme ebenfalls löst. Dabei kommen eine Reihe grafischer Elemente aus dem AWT zum Einsatz, und es wird versucht, möglichst Java-gerecht und portabel zu arbeiten. Model, View, Controller Will man sehr objekt-orientiert vorgehen, verteilt man die Lösung auf mehrere Objekte. Model ist ein Interface, das die Idee einer Umwandlung als Funktion einer einzigen Variablen beschreibt. Linear ist eine Klasse von Umwandlungen, nämlich linearen Transformationen, die zum Beispiel für verschiedene Temperaturskalen oder auch Währungen zuständig ist, siehe Abbildung 2. 1 interface Model { 2 double f (double x); 3 } 4 5 public class Linear implements Model {
2 um/96/ Axel-Tobias Schreiner 2 6 protected double a, b; 7 public Linear (double a, double b) { 8 this.a = a; this.b = b; 9 } 10 public double f (double x) { 11 return a * x + b; 12 } 13 } Abbildung 2: Umwandlung abstrakt und konkret Ein Objekt wird mit den zwei Koeffizienten seiner Funktion initialisiert (2-8) und liefert dann über die Methode f die Funktionswerte ab (2-11). Java definiert ein Interface Obser ver, das Klassen implementieren müssen, wenn sie Änderungen in Objekten einer Klasse Obser vable beobachten wollen. 1 import java.util.*; 2 3 public class Output implements Observer { 4 protected Object value; 5 public Object value () { return value; } 6 public void update (Observable o, Object arg) { 7 value = arg; 8 } 9 } Abbildung 3: Ausgabe an einen Observer Abbildung 3 zeigt eine Klasse Output, die jeweils ein Objekt aufbewahren (3-4) und liefern kann (3-5). Als Obser ver erfährt Output mit update(), wenn sich sein Beobachtungsziel geändert hat; im vorliegenden Beispiel muß update() einen neuen Wert anliefern, der dann aufbewahrt wird (3-7). Ein Model soll von einem Controller betrieben werden, der über Änderungen eines Eingabe-Objekts informiert wird und dann einen neuen Funktionswert an alle Ausgabe-Objekte übermittelt, die das interessieren könnte, siehe Abbildung 4. 1 import java.util.*; 2 3 public class Controller extends Observable implements Observer { 4 protected Model model; 5 public Controller (Model model) { this.model = model; } 6 public void update (Observable o, Object arg) { 7 try { 8 double x = ((Double)arg).doubleValue(); 9 setchanged(); 10 notifyobservers(new Double(model.f(x))); 11 } catch(exception e) { } 12 } 13 } Abbildung 4: Änderungen bearbeitet ein Controller Java stellt als Grundstock dazu die Klasse Obser vable zur Verfügung. Controller soll beobachten und beobachtet werden, wird also von Obser vable und Obser ver abgeleitet (4-3). Bei der Konstruktion muß ein Model hinterlegt werden, das der Controller dann betreibt (4-5). update() empfängt hoffentlich (4-7) ein Double-Objekt, aus dem das Argument für die Umwandlung entnommen werden kann (4-8). setchanged() (4-9) informiert die Oberklasse Obser vable, daß wirklich eine Änderung stattfindet, deren Resultat dann mit notifyobser vers() ausgeliefert wird (4-10); ohne setchanged() würde die Auslieferung unterbleiben. Die objekt-orientierte Version der Temperaturumwandlung zeigt schließlich Abbildung 5, wobei der gleiche Rahmen wie in Abbildung 1 verwendet wird.
3 um/96/ Axel-Tobias Schreiner 3 8 Controller c2f = new Controller(new Linear(9./5., 32.)); 9 Output fahrenheit = new Output(); 10 c2f.addobserver(fahrenheit); 11 while ((line = in.readline())!= null) { 12 c2f.update(null, new Double(line)); 13 System.out.println("\t"+fahrenheit.value()); 14 } Abbildung 5: Umwandlung im OOP-Stil Zuerst muß die Objektwelt aus einem Controller mit einem Model zur Umwandlung von Celsius zu Fahrenheit aufgebaut werden (5-8). Die Ausgabe geht an das Output-Objekt fahrenheit (5-9), das dazu beim Controller als Obser ver angemeldet wird (5-10). Die Hauptschleife muß dann nur noch die Eingaben zu- und die Ausgaben darstellen: Eine Zeile wird als Double direkt an den Controller geschickt, als ob der Absender ein Obser vable gewesen wäre (5-12); null vertritt hier dessen Platz im Aufruf. Hat der Controller seine Pflicht getan, kann man das Resultat mit value() beim Output-Objekt abholen und als String ausgeben (5-13). Reuse Ein Problem durch eine Kombination von Model-, View- und Controller-Objekten zu lösen, ist eine bekannte Technik: Ein Model ist für die eigentliche Berechnung zuständig, losgelöst von allen Überlegungen zur Umgebung. View-Objekte dienen zur Interaktion mit dem Benutzer, und Controller lenken den Kontrollfluß von der Eingabe und Steuerung zur Ausgabe. Die objekt-orientierte Lösung ist zwar deutlich länger, aber mit den Klassen kann man auch ein Programm aufbauen, das Umwandlungen in beiden Richtungen vornimmt, siehe Abbildung 6: 11 Controller f2c = new Controller(new Linear(5./9., 160./9.)); 12 Output celsius = new Output(); f2c.addobserver(celsius); 13 while ((line = in.readline())!= null) 14 switch (line.charat(0)) { 15 case c : 16 c2f.update(null, new Double(line.substring(1))); 17 System.out.println("\t"+fahrenheit.value()+" f"); 18 break; 19 case f : 20 f2c.update(null, new Double(line.substring(1))); 21 System.out.println("\t"+celsius.value()+" c"); 22 } Abbildung 6: Umwandlung in beiden Richtungen Der bisherige Rahmen und die Objektwelt werden aus Abbildung 1 beziehungsweise 5 übernommen. Für die Umwandlung von Fahrenheit- in Celsius-Grade legt man einen weiteren Controller mit einem entsprechenden Model an (6-11) und verbindet ihn mit einem neuen Output-Objekt celsius (6-12). Je nach dem ersten Buchstaben der Eingabezeile (6-14) schickt die Hauptschleife den Rest der Zeile als Double an den zuständigen Controller (6-16,20) und berichtet den neuen Wert vom angeschlossenen Output (6-17,21). Die Objekt-Orientierung zahlt sich voll aus: Linear, Output und Controller wurden wiederverwendet, und für die zusätzliche Leistung des Programms muß eigentlich nur die Eingabemöglichkeit geschaffen und mit der vergrößerten Objektwelt verbunden werden. Erzeugt man weitere Linear-Objekte zur Umwandlung von DM in Dollar und umgekehrt, so hat man in Kürze die nötige Intelligenz für einen
4 um/96/ Axel-Tobias Schreiner 4 Wegbegleiter zu einem Trip ins Ausland beisammen. Retarget Ein zeitgemäßer Umwandler hat heute eine grafische Oberfläche. Die Aufbereitung der Lösung als Objektwelt geschah natürlich mit dem Hintergedanken, daß für eine grafische Oberfläche nur noch die Output-Objekte und die Art der Eingabe auszutauschen sind, denn sie bilden die einzige Schnittstelle zwischen Benutzer und Programm, wenn man davon absieht, daß die Hauptschleife die Ein- und Ausgaben der Objektwelt zustellen muß. Aus dem ersten Artikel dieser Serie ist schon bekannt, daß zu Java das Abstract Window Toolkit (AWT) gehört, eine Sammlung von Klassen, die die typische Funktionalität der grafischen Elemente von Window-Systemen so verkapseln, daß auf den einzelnen Plattformen noch das normale look and feel einigermaßen gewahrt bleiben sollte. Als ersten Lösungsversuch kann man ein TextField zur (zeilenlosen) Eingabe verwenden und eine Label als Obser ver ausbauen (Abbildung 7), um damit einen Controller zu bewachen und dessen Resultat auszugeben. 1 class TextOutput extends Label implements Observer { 2 public void update (Observable o, Object arg) { 3 settext(arg.tostring()); 4 } 5 } Abbildung 7: Label als Observer Die Umwandlung soll zunächst einmal per Maus-Click ausgelöst werden. Abbildung 8 zeigt einen ChangeButton, dem man bei der Konstruktion die Eingabe- TextComponent und den Obser ver mitteilt (8-4), damit er dann auf Knopfdruck die nötige update-nachricht verschicken kann (8-7). 1 class ChangeButton extends Button { 2 TextComponent source; Observer target; 3 ChangeButton (String label, TextComponent source, Observer target) { 4 super(label); this.source = source; this.target = target; 5 } 6 public boolean action(event evt, Object what) { 7 target.update(null, new Double(source.getText())); 8 return true; 9 } 10 } Abbildung 8: Button zum Auffordern Durch die Verwendung von Oberklassen hält man sich theoretisch offen, daß ähnliche Objekte auch mit diesem ChangeButton verbunden werden können. Events Viele Klassen im AWT definieren grafische Bedienungselemente, die Objekte einer etwas umständlichen Klasse Event empfangen können, die die typischen Ereignisse in Window-Systemen (Drücken oder Loslassen von Knöpfen und Tasten, Bewegungen usw.) repräsentieren. Eine Reihe von AWT-Klassen abstrahieren Event-Folgen, zum Beispiel reagiert Button optisch auf Maus-Clicks (Drücken plus Loslassen) und ersetzt sie durch Event-Objekte, die als ACTION_EVENT markiert sind.
5 um/96/ Axel-Tobias Schreiner 5 Leitet man eine Bedienelementklasse wie Button ab, kann man die Event-Objekte selbst untersuchen entweder durch Ersetzen der Methode handleevent(), bei der alle Events zuerst abgeliefert werden, oder mit Methoden wie action() (8-6), die anschließend nur entsprechend markierte Events erhalten. Events werden entlang der geometrischen Verschachtelung der AWT-Objekte zugestellt, und per Konvention rufen ersetzte Methoden wie handleevent() per super ihre Vorgänger in den Oberklassen der Objekte auf, wenn abgeleitete Klassen die Events nicht konsumieren wollen, denn nur so kann es nach handleevent() noch zum Aufruf von action() kommen. Liefert eine beteiligte Methode true (8-8), dann gilt der Event als konsumiert, sonst verschwindet er schließlich in handleevent() in der Basisklasse Component des äußersten grafischen Elements, also in einem Fenster oder Applet. Frame, Panel, LayoutManager Das Hauptprogramm des grafischen Umwandlers (Abbildung 9) baut jetzt nur noch die Objektwelt auf; die Zustellung der Eingaben als Events übernimmt das Java-AWT- Laufzeitsystem. 1 import java.awt.*; 2 import java.util.*; 3 4 public class d extends Panel { 5 public d () { 6 TextField celsius = new TextField(5); 7 Controller c2f = new Controller(new Linear(9./5., 32.)); 8 TextOutput fahrenheit = new TextOutput(); 9 c2f.addobserver(fahrenheit); 10 ChangeButton button = new ChangeButton(celsius, "c > f", c2f); 11 setlayout(new GridLayout(1,3)); 12 add(celsius); add(button); add(fahrenheit); 13 } 14 public static void main (String args []) { 15 Frame frame = new Frame(); 16 frame.add("center", new d()); 17 frame.pack(); frame.show(); 18 } 19 } Abbildung 9: Ein grafischer Umwandler Für die Oberfläche müssen ein TextField als Eingabe (9-6), ein TextOutput als Ausgabe (9-8) und ein ChangeButton als Auslöser (9-10) erzeugt werden, außerdem wird wieder ein Controller konstruiert und wie früher verbunden (9-7,9). Die grafischen Objekte müssen aber noch in einen Container eingepackt werden, der die geometrische Anordnung mit Hilfe eines LayoutManager-Objekts kontrolliert. Hier wird ein Panel verwendet, andere Möglichkeiten wären ein Frame oder ein Window. Abbildung 10: Motif-Oberfläche des ersten Umwandlers Die drei grafischen Objekte sollen gleich groß und als Zeile angeordnet sein (Abbildung 10), deshalb wird ein GridLayout mit einer Zeile und drei Spalten verwendet (9-11). add() ist eine Container-Methode, die bei diesem Layout die
6 um/96/ Axel-Tobias Schreiner 6 Objekte zeilenweise aufbaut (9-12). Ein Frame ist im X-Jargon ein Shell-Fenster, also ein Hauptfenster für eine Applikation (9-15), das auch eine MenuBar enthalten kann. Da dafür BorderLayout voreingestellt ist, kann das Umwandler-Panel mit einer weiteren add-methode im Zentrum des Frame angeordnet werden (9-16); andere Ziele für add() sind die vier Himmelsrichtungen. Alle Elemente machen bei BorderLayout die Größenänderungen des Fensters mit. Sind alle Objekte im Window oder Frame, läßt pack() wirklich das Layout berechnen und show() stellt das Resultat auf dem Schirm dar (9-17). Wie im letzten Artikel vorgeführt wurde, kann man sich mit dem Java-Debugger jdb davon überzeugen, daß jetzt mehrere Threads an der Ausführung des Umwandlers beteiligt sind, deshalb können das Hauptprogramm und damit der Thread main durchaus beendet werden. Die restlichen Threads kümmern sich um die Events und treiben dadurch die Umwandlungen auf dem Bildschirm voran. Das Programm kann tatsächlich nur gewaltsam beendet werden: Der als WINDOW_DESTROY markierte Event wird von Frame nicht bearbeitet; folglich kann das Fenster nicht geschlossen werden, und das Programm endet nur über ein Signal. Man ist also praktisch immer gezwungen, eine eigene Unterklasse von Frame zu konstruieren, in der WINDOW_DESTROY mit exit() verknüpft wird. Der Umwandler als Applet Eigentlich ist das Panel, in dem die grafischen Elemente des Umwandlers angeordnet sind, nicht notwendig. Frame stammt wie Panel von Container ab, und man hätte die Anordnung schon dort vornehmen können. Ein Panel kann allerdings im Gegensatz zu einem Frame auch in ein Applet eingefügt werden und damit als Teil einer Web-Seite auftauchen (Abbildung 11): 1 import java.applet.applet; 2 import java.awt.*; 3 4 public class LoaderApplet extends Applet { 5 public void init () { 6 try { 7 setlayout(new BorderLayout()); 8 add("center", (Component)Class. 9 forname(getparameter("class")). 10 newinstance()); 11 } catch(exception e) { 12 showstatus(e.tostring()); 13 } 14 } 15 } Abbildung 11: Ein Applet zum Laden von Component Dieses primitive LoaderApplet holt sich als Parameter einen Klassennamen (11-9) und erzeugt eine Instanz dieser Klasse (11-10), die von Component abstammen muß (11-8). Das neue Objekt bildet den Inhalt des Applets. 6 <applet code="loaderapplet.class" width=150 height=25> 7 <param name=class value=d> 8 </applet> Abbildung 12: Ein d -Panel wird als Applet geladen Abbildung 12 zeigt die entscheidenden Zeilen einer HTML-Datei, die das Umwandler- Panel auf einer Web-Seite auftauchen lassen: Mit einem applet-element wird ein
7 um/96/ Axel-Tobias Schreiner 7 LoaderApplet geladen (12-6), das dann aus param-elementen Werte zu Namen abholen kann (12-7, 11-9). Leider muß man den Platz für das Applet von außen her in Pixeln festlegen (12-6) eine Vermessung des ursprünglichen Panels auf dem heimatlichen Bildschirm ist im Web dabei nur bedingt hilfreich. Gegenverkehr Die Objekt-Orientierung des Designs hat zwar auch bei der grafischen Oberfläche für eine schnelle Lösung gesorgt Controller und Model wurden vollständig wiederverwendet aber die Auslösung der update-nachricht ist für den Benutzer durch den nötigen Wechsel von der Tastatur zur Maus reichlich unbequem, und ohne Beschriftung der Eingabefelder ist die Applikation in Kürze nutzlos. Abbildung 13: Verbesserte Windows-Oberfläche Abbildung 13 zeigt eine bessere Oberfläche, diesmal bei Windows 95 man erkennt deutlich, daß auf dieser Plattform die Beschriftung trotz entsprechender Programmierung (15-9) nicht zentriert ist. 3 public class e extends Panel { 4 protected DoubleIO fahrenheit, celsius; 5 public e () { 6 Controller c2f = new Controller(new Linear(9./5., 32.)); 7 fahrenheit = new DoubleIO(5); c2f.addobserver(fahrenheit); 8 Controller f2c = new Controller(new Linear(5./9., 160./9.)); 9 celsius = new DoubleIO(5); f2c.addobserver(celsius); 10 celsius.addobserver(c2f); fahrenheit.addobserver(f2c); 11 setlayout(new GridLayout(1,2)); 12 add(new Box("Celsius", celsius)); 13 add(new Box("Fahrenheit", fahrenheit)); 14 } 15 public static void main (String args []) { // frame.settitle("temperaturen"); Abbildung 14: Ein Panel für Gegenverkehr Abbildung 14 zeigt den Aufbau dieser Objektwelt in einem Panel. Erfreulicherweise liefert ein TextField auch einen ACTION_EVENT, wenn return eingegeben wird. Man kann also aus einem TextField ein DoubleIO entwickeln, das einerseits von einem Controller beobachtet werden kann (14-10), und das selbst auch einen Controller beobachtet (14-7,9). Zur Beschriftung werden celsius und fahrenheit noch in je eine Box verpackt (14-12,13), und zum Hauptprogramm kommt eine Zeile hinzu, die dem Frame einen Titel gibt (14-18). Natürlich darf das Eintreffen von update() bei DoubleIO nicht zu notifyobser vers() führen, sonst gerät die Applikation in eine Schleife, aber bei korrekter Implementierung kann man im einen Feld eingeben und im anderen Feld das Resultat der Umwandlung sehen.
8 um/96/ Axel-Tobias Schreiner 8 GridBagLayout Die Box besteht aus einem Rahmen um eine beliebige Component, die natürlich selbst ein Panel sein und dann weitere Elemente enthalten kann, sowie einer Beschriftung, die zum Beispiel mit einer Label realisiert werden kann. Abbildung 15 zeigt eine Lösung, die aus Platzgründen praktisch nicht parametrisiert ist. 1 import java.awt.*; 2 3 public class Box extends Panel { 4 protected Label title; 5 protected Component body; 6 protected boolean fixedsize; 7 private final int PAD = 8; 8 public Box (String title, Component body) { 9 this.title = new Label(title, Label.CENTER); GridBagLayout gb; 12 setlayout(gb = new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); 15 gbc.gridx = gbc.gridy = 0; 16 gbc.insets = new Insets(0, PAD, 0, PAD); 17 add(this.title); gb.setconstraints(this.title, gbc); gbc.gridx = 0; gbc.gridy = GridBagConstraints.RELATIVE; 20 gbc.gridwidth = gbc.gridheight = GridBagConstraints.REMAINDER; 21 gbc.fill = GridBagConstraints.HORIZONTAL; 22 gbc.insets = new Insets(PAD/2, PAD, PAD, PAD); 23 gbc.weightx = gbc.weighty = 1.; 24 add(this.body = body); gb.setconstraints(this.body, gbc); 25 } 26 public void paint (Graphics g) { 27 Dimension me = size(), tag = title.size(); 28 g.draw3drect(pad/2, tag.height/2, 29 me.width PAD, me.height (PAD+tag.height)/2, true); 30 } 31 public void validate () { 32 if (! fixedsize) { 33 Font f = title.getfont(); 34 title.setfont(new Font(f.getName(), f.getstyle(), 35 f.getsize() 2)); 36 fixedsize = true; 37 } 38 super.validate(); 39 } 40 } Abbildung 15: Eine Box mit Beschriftung Box entsteht aus Panel (15-3), denn damit hat man einen Container, auf den man zusätzlich zeichnen kann. Der wesentliche Trick besteht in der Verwendung des höchst komplizierten GridBagLayout (15-12), denn damit kann man unter anderem vorschreiben, daß um ein Element herum Platz freigehalten werden soll. Verwendet man GridBagLayout, muß man grafische Objekte sowohl dem Container als auch dem Layout-Manager mitteilen (15-17), wobei man die Randbedingungen als GridBagConstraints spezifiziert. Letzteres ist praktisch nur eine Struktur mit Voreinstellungen, die man abändern und wiederverwenden kann (15-24). Grundsätzlich ordnet man Elemente in einer Tabelle an (15-15,19), wobei ein Element auch mehrere Zellen der Tabelle erhalten kann (15-20). RELATIVE bedeutet, daß man anschließt, REMAINDER, daß der restliche Platz in der jeweiligen Richtung
9 um/96/ Axel-Tobias Schreiner 9 zugeteilt wird. Ein Element kann in seinen Zellen aufgeblasen werden (15-21), außerdem könnte man zur normalen Größe des Elements noch Zwischenraum hinzufügen lassen. Insets definieren einen Rahmen um ein Element herum (15-16,22); hier werden zumeist PAD Pixel für den Rahmen freigehalten. Entscheidend (und fehleranfällig) ist, was passiert, wenn sich der verfügbare Platz ändert. Das maximale weightx einer Spalte entscheidet, welchen Anteil am horizontalen Platz sie im Verhältnis zu den anderen Spalten bekommt. Vertikal funktioniert es mit weighty und Zeilen entsprechend. Die neueste Dokumentation von SUN (1.0.2) erklärt es genau umgekehrt, und auch sie schweigt sich darüber aus, was mit Gewichten von Elementen passiert, die mehrere Zellen belegen. Da die Voreinstellung Null ist und dann nichts hinzugefügt wird, erhält im vorliegenden Fall der Inhalt der Box den gesamten zusätzlich verfügbaren Platz (15-23). Trotz einer Reihe von Versuchen habe ich übrigens keinen Weg gefunden, die Minimalgröße eines Fensters zu begrenzen greift man zu hart mit dem Window-Manager zu, bleibt eben nichts übrig. Zeichnungen Damit der gewünschte Rahmen in der Box auftaucht, muß man die Methode paint() ersetzen, mit der sich jede Component selbst darstellt (15-26). Mit size() kann man die aktuelle Größe der Box und der Label bestimmen, die den Titel enthält (15-27). Anschließend genügt es, ein geeignetes Rechteck mit dem grafischen Kontext zu zeichnen (15-28). Die Label wird nämlich erst nach dem Aufruf der paint-methode der Box gezeichnet; sie ist gefüllt und verdeckt folglich auf dem Bildschirm einen Teil des Rechtecks. Es sieht eleganter aus, wenn der Titel etwas kleinere Zeichen verwendet. Dazu muß man die Schrift der Label beeinflussen. Sie gehört zum Grafik-Kontext und ist deshalb bei der Konstruktion noch nicht definiert. Mit einem kleinen Trick kann man die Änderung im richtigen Moment vornehmen: Man ersetzt validate(), die Methode, mit der ein grafisches Element validiert wird, bevor es dargestellt wird. Genau beim ersten Aufruf (15-32,36) holt die Box die Schriftart ihrer Label (15-33) und ersetzt sie durch einen neuen Font, der geringfügig kleiner ist (15-34). Danach muß natürlich die Validierung fortgesetzt werden (15-38). Mehr fachvererbung DoubleIO soll ein TextField sein, aber auch von einem Controller beobachtet werden können, also von Obser vable abstammen. Im Gegensatz zu Obser ver ist Obser vable eine Klasse die Objekte enthalten Zustand in Form einer Liste ihrer Beobachter, und damit ergibt sich ein Problem, denn Java kennt nur einfache Vererbung. Abbildung 16 zeigt die Lösung: DoubleIO stammt von TextField ab und enthält ein Obser vable als Hilfsobjekt, an das ein Aufruf von addobser ver() einfach weitergeleitet wird (16-11). 1 import java.awt.*; 2 import java.util.*; 3 4 public class DoubleIO extends TextField implements Observer { 5 protected myobservable clients; 6 public DoubleIO (int cols) { 7 super(cols); 8 clients = new myobservable(); 9 } 10 public void addobserver (Observer o) {
10 um/96/ Axel-Tobias Schreiner clients.addobserver(o); 12 } 13 public void update (Observable o, Object arg) { 14 settext(arg.tostring()); 15 } 16 public boolean action(event evt, Object what) { 17 clients.setchanged(); 18 try { 19 clients.notifyobservers(new Double(getText())); 20 } catch(exception e) { 21 settext("0"); 22 clients.notifyobservers(new Double(0.)); 23 } 24 selectall(); 25 return true; 26 } 27 public boolean lostfocus(event evt, Object what) { 28 action(evt, what); select(0, 0); 29 return true; 30 } 31 public boolean gotfocus(event evt, Object what) { 32 selectall(); 33 return true; 34 } 35 } class myobservable extends Observable { 38 protected void setchanged () { super.setchanged(); } 39 } Abbildung 16: Ein TextField mit Beobachtern Später muß DoubleIO noch die Methode setchanged() aufrufen (16-17); sie ist zwar theoretisch protected, aber wenn man im gleichen Paket wie DoubleIO eine eigene Unterklasse von Obser vable konstruiert (16-37), kann man die Methode auch von einer fremden Klasse aus aufrufen. DoubleIO soll ein Obser ver sein; die nötige Methode update() kann man von TextOutput in Abbildung 7 kopieren hier würde Mehrfachvererbung sicher nicht zum Ziel führen, denn man muß sich schon entscheiden, ob DoubleIO eine passive Label oder ein veränderliches TextField sein soll. DoubleIO muß vor allem bei Eingabe von return seine Beobachter informieren. Eigentlich sollte man action() vom ChangeButton in Abbildung 8 übernehmen können, aber die Beobachter müssen mit Hilfe des Obser vable erreicht werden (16-17,19). Die Fehlerbehandlung bereinigt Eingaben, die nicht in einen Double- Wert umgewandelt werden können (16-21). Chaos Der Umwandler ist bequemer zu benutzen, wenn man im Anschluß an return sofort die nächste Anfrage tippen kann, ohne die alte Eingabe explizit löschen zu müssen. Dies wird dadurch erreicht, daß man im Zuge der Umwandlung den Eingabetext vollständig selektiert (16-24); eine neue Eingabe ersetzt dann stillschweigend die Selektion. Leider ist man nicht verpflichtet, seine Eingabe mit return abzuschließen. Verläßt man ein DoubleIO-Feld, indem man mit der Maus ein anderes Fenster zum Fokus der Eingabe macht, oder wechselt man mit tab in das benachbarte Feld, erfolgt kein Aufruf von action() und damit keine Nachricht an die Beobachter: Die beiden Felder enthalten dann Werte, die nicht zueinandergehören.
11 um/96/ Axel-Tobias Schreiner 11 Die sichtbaren AWT-Objekte entstammen letztlich alle einer Klasse Component, die verspricht, einen LOST_FOCUS_EVENT zu erzeugen, wenn einem Objekt die Eingaben nicht mehr zugestellt werden, sowie einen GOT_FOCUS_EVENT, bevor die Eingaben fließen. Aus dem ersten Event sollte man also auch eine action() entwickeln, um sicherzustellen, daß Celsius- und Fahrenheit-Grade immer zusammenpassen (16-28). Beim zweiten Event kann man versuchsweise selectall() einbauen (16-32), damit man gleich wieder lostippen kann. Auf der Entwicklungsplattform (Java-Compiler auf NeXT, Java-Ausführung auf Linux, Motif-Ausgabe wieder zurück auf NeXT, was man eben so an Hardware hat) klappt das auch wie geplant; dort schaltet auch tab zwischen den beiden Textfeldern hin und her. Auf einer Originalplattform (Windows 95 und Windows NT) funktioniert es leider nicht tab provoziert etwas ärgerliche Geräusche, und Maus-Clicks in anderen Feldern oder Fenstern lassen die Controller ungerührt. Offensichtlich ist es mit der Portabilität des AWT an diesem recht kritischen Punkt noch nicht optimal bestellt. Bezüglich tab kann man gerade noch für Portabilität sorgen: Abbildung 17 zeigt die Methode keydown(), die man dazu dem Panel in Abbildung 14 hinzufügt. 21 public boolean keydown (Event evt, int key) { 22 if (key!= \t ) return false; 23 DoubleIO next = evt.target == celsius? fahrenheit : celsius; 24 next.requestfocus(); 25 return true; 26 } Abbildung 17: tab als Umschalter Da das TextField einen Event mit einem tab-zeichen nicht konsumiert, kann man ihn später in der Hierarchie dazu verwenden, mit requestfocus() umzuschalten (17-24). Daran anschließend erhalten die beteiligten DoubleIO-Objekte ihre FOCUS-Events wirklich, und die Umschaltung erfolgt so, wie man das möchte. Legt man den Focus mit der Maus fest, kann man in dem Panel nicht entsprechend nachhelfen. Zwar verspricht die neueste Dokumentation (1.0.2), daß in Version 1.1 das AWT alle derartigen Events dem TextField liefern wird, aber wenigstens bis dahin muß das TextField die Maus-Clicks zum Positionieren des Cursors akzeptieren. Das hat zur Folge, daß selbst auf der Motif-Plattform, wo die FOCUS-Events korrekt zugestellt werden, das selectall() (16-32) bei Maus-Clicks wirkungslos bleibt: Die Maus fokussiert die Eingabe und positioniert zugleich den Cursor, macht also die Selektion wieder rückgängig. Fazit Eigentlich wollte ich in diesem Artikel ja alles vorführen, was das AWT so bietet: Texte, Knöpfe, Listen, Dialoge und schließlich Canvas zum Aufbau eigener grafischer Elemente. Ich ließ es dann aber doch bei diesem trivialen Beispiel und dafür bei einer sehr gründlichen Betrachtung, denn sie illustriert meines Erachtens das AWT wesentlich besser: Die grafischen Elemente sind ziemlich primitiv, überschaubar und einigermaßen portabel. Mit den einfachen Layouts (Border und Grid) kommt man schnell zu einer relativ akzeptablen Oberfläche. GridBag ist mächtig, kompliziert, fehlerhaft und bisher sehr schlecht dokumentiert. Da die Events letztlich bis zum Fenster weitergereicht werden und ihr target enthalten, bietet sich an, auch nur dort den Kontrollfluß einer Applikation zu verwalten.
12 um/96/ Axel-Tobias Schreiner 12 Macht man sich die Mühe, Obser vable mit den AWT-Objekten zu verbinden, erhält man wesentlich wiederverwendbarere Lösungen. Das ist alles höchst positiv und für ein plattformübergreifendes System, das auch im Web einsetzbar ist, einigermaßen ohne Konkurrenz wenn man einmal von Visual Basic und OPENSTEP absieht. Weniger schön ist, daß man schon bei diesem trivialen Beispiel auf Probleme trifft, für die ich keine Lösung gefunden habe: Wie reagiert man zuverlässig auf die Fokussierung? Wann kann man eine vorhandene Schrift zuverlässig ändern? Wie begrenzt man die Größe eines Fensters? Wie konstruiert man eine für Windows und Motif typische Multi-Window- Architektur, bei der die Dokumente in einem Applikationsfenster eingesperrt bleiben? Das Beispiel ist zwar mit Blick auf eine Situation entwickelt worden, bei der viele Umwandler parallel betrieben und auch modifiziert werden, aber das ist erst praktikabel, wenn man auch diese Fragen beantworten kann. Die Quellen Auf die Idee, eine Umwandlung als Fallstudie zu verwenden, brachte mich das neue, ausgezeichnete Handbuch Discovering OPENSTEP von NeXT. Das Konzept Model, View, Controller wird immer der SmallTalk-Literatur zugeschrieben. Wie man sieht, funktioniert es auch bei Java (und genügend stilisierten Beispielen) hervorragend. Es kann seine Verwandtschaft zu NeXT s target-action-methodik nicht verleugnen. Mit Obser ver und Obser vable umgeht man zwar das Problem der fehlenden Selektoren in Java einigermaßen, aber ich finde die Lösung von NeXT nicht nur wegen der grafischen Programmierung im InterfaceBuilder eleganter. Java hat eine weitverzweigte Klassenhierarchie zur Repräsentierung von Fehlern als Exception oder Error. Ich finde es merkwürdig, daß die höchst wichtige Klasse Event im AWT dagegen im besten C-union-Stil definiert wurde: Je nach Markierung sind nur bestimmte Felder in einem Event-Objekt mit sinnvoller Information belegt. Eine Hierarchie hätte hier sicher für Klarheit gesorgt. Flanagan s Java in a Nutshell (O Reilly 1996, ISBN ) enthält eine hervorragende Tabelle (fast) aller Möglichkeiten, die man leider in der Java-Dokumentation nicht direkt findet und die man sehr häufig konsultieren muß. Speziell die Dokumentation der AWT-Klassen ist außerordentlich lückenhaft. Die Version der Dokumentation ist nicht mehr mit javadoc erstellt und enthält weniger gute Querverweise. Sie ist zwar ausführlicher, aber in kritischen Fragen ist man noch immer auf Experimente angewiesen, die, wie vorgeführt, dann auch noch plattformabhängig verlaufen können. Meine Java-Vorlesungsunterlagen, die wie die Quellen zu diesem Artikel über osnabrueck.de/um gefunden werden können, enthalten Applets und Applikationen, mit denen das Event-Verhalten jedes einzelnen grafischen Elements im AWT getestet werden kann.
Stellen Sie bitte den Cursor in die Spalte B2 und rufen die Funktion Sverweis auf. Es öffnet sich folgendes Dialogfenster
Es gibt in Excel unter anderem die so genannten Suchfunktionen / Matrixfunktionen Damit können Sie Werte innerhalb eines bestimmten Bereichs suchen. Als Beispiel möchte ich die Funktion Sverweis zeigen.
MehrProgrammierkurs Java
Programmierkurs Java Dr. Dietrich Boles Aufgaben zu UE16-Rekursion (Stand 09.12.2011) Aufgabe 1: Implementieren Sie in Java ein Programm, das solange einzelne Zeichen vom Terminal einliest, bis ein #-Zeichen
MehrDiese Ansicht erhalten Sie nach der erfolgreichen Anmeldung bei Wordpress.
Anmeldung http://www.ihredomain.de/wp-admin Dashboard Diese Ansicht erhalten Sie nach der erfolgreichen Anmeldung bei Wordpress. Das Dashboard gibt Ihnen eine kurze Übersicht, z.b. Anzahl der Beiträge,
MehrMit der Maus im Menü links auf den Menüpunkt 'Seiten' gehen und auf 'Erstellen klicken.
Seite erstellen Mit der Maus im Menü links auf den Menüpunkt 'Seiten' gehen und auf 'Erstellen klicken. Es öffnet sich die Eingabe Seite um eine neue Seite zu erstellen. Seiten Titel festlegen Den neuen
MehrJava: Vererbung. Teil 3: super() www.informatikzentrale.de
Java: Vererbung Teil 3: super() Konstruktor und Vererbung Kindklasse ruft SELBSTSTÄNDIG und IMMER zuerst den Konstruktor der Elternklasse auf! Konstruktor und Vererbung Kindklasse ruft SELBSTSTÄNDIG und
MehrEinführung in die Programmierung
Technische Universität München WS 2003/2004 Institut für Informatik Prof. Dr. Christoph Zenger Testklausur Einführung in die Programmierung Probeklausur Java (Lösungsvorschlag) 1 Die Klasse ArrayList In
MehrGraphische Benutzungsoberflächen
Graphische Benutzungsoberflächen Graphische Benutzungsoberflächen (graphical user interfaces, GUI) dienen zur interaktiven Bedienung von Programmen, Ein- und Ausgabe mit graphischen Techniken und visuellen
MehrHandbuch B4000+ Preset Manager
Handbuch B4000+ Preset Manager B4000+ authentic organ modeller Version 0.6 FERROFISH advanced audio applications Einleitung Mit der Software B4000+ Preset Manager können Sie Ihre in der B4000+ erstellten
MehrObjektorientierte Programmierung
Objektorientierte Programmierung 1 Geschichte Dahl, Nygaard: Simula 67 (Algol 60 + Objektorientierung) Kay et al.: Smalltalk (erste rein-objektorientierte Sprache) Object Pascal, Objective C, C++ (wiederum
MehrProgrammieren in Java
Programmieren in Java objektorientierte Programmierung 2 2 Zusammenhang Klasse-Datei In jeder *.java Datei kann es genau eine public-klasse geben wobei Klassen- und Dateiname übereinstimmen. Es können
MehrObjektorientierte Programmierung. Kapitel 12: Interfaces
12. Interfaces 1/14 Objektorientierte Programmierung Kapitel 12: Interfaces Stefan Brass Martin-Luther-Universität Halle-Wittenberg Wintersemester 2012/13 http://www.informatik.uni-halle.de/ brass/oop12/
MehrLineargleichungssysteme: Additions-/ Subtraktionsverfahren
Lineargleichungssysteme: Additions-/ Subtraktionsverfahren W. Kippels 22. Februar 2014 Inhaltsverzeichnis 1 Einleitung 2 2 Lineargleichungssysteme zweiten Grades 2 3 Lineargleichungssysteme höheren als
MehrTutorial: Entlohnungsberechnung erstellen mit LibreOffice Calc 3.5
Tutorial: Entlohnungsberechnung erstellen mit LibreOffice Calc 3.5 In diesem Tutorial will ich Ihnen zeigen, wie man mit LibreOffice Calc 3.5 eine einfache Entlohnungsberechnung erstellt, wobei eine automatische
Mehr2A Basistechniken: Weitere Aufgaben
2A Basistechniken: Weitere Aufgaben 2A.3 Programmierung unter UNIX/Linux 1. Gegeben sind einige Ausschnitte von C-Programmen, die unter UNIX/Linux ausgeführt werden sollen. Beantworten Sie die zugehörigen
Mehrmysql - Clients MySQL - Abfragen eine serverbasierenden Datenbank
mysql - Clients MySQL - Abfragen eine serverbasierenden Datenbank In den ersten beiden Abschnitten (rbanken1.pdf und rbanken2.pdf) haben wir uns mit am Ende mysql beschäftigt und kennengelernt, wie man
MehrZwischenablage (Bilder, Texte,...)
Zwischenablage was ist das? Informationen über. die Bedeutung der Windows-Zwischenablage Kopieren und Einfügen mit der Zwischenablage Vermeiden von Fehlern beim Arbeiten mit der Zwischenablage Bei diesen
MehrUrlaubsregel in David
Urlaubsregel in David Inhaltsverzeichnis KlickDown Beitrag von Tobit...3 Präambel...3 Benachrichtigung externer Absender...3 Erstellen oder Anpassen des Anworttextes...3 Erstellen oder Anpassen der Auto-Reply-Regel...5
MehrÜbungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag
Ludwig-Maximilians-Universität München WS 2015/16 Institut für Informatik Übungsblatt 9 Prof. Dr. R. Hennicker, A. Klarl Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung:
MehrAnleitung zur Daten zur Datensicherung und Datenrücksicherung. Datensicherung
Anleitung zur Daten zur Datensicherung und Datenrücksicherung Datensicherung Es gibt drei Möglichkeiten der Datensicherung. Zwei davon sind in Ges eingebaut, die dritte ist eine manuelle Möglichkeit. In
MehrSuche schlecht beschriftete Bilder mit Eigenen Abfragen
Suche schlecht beschriftete Bilder mit Eigenen Abfragen Ist die Bilderdatenbank über einen längeren Zeitraum in Benutzung, so steigt die Wahrscheinlichkeit für schlecht beschriftete Bilder 1. Insbesondere
MehrDrei-Schichten-Architektur. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 16: 3-Schichten-Architektur 1 Fachkonzept - GUI
Universität Osnabrück Drei-Schichten-Architektur 3 - Objektorientierte Programmierung in Java Vorlesung 6: 3-Schichten-Architektur Fachkonzept - GUI SS 2005 Prof. Dr. F.M. Thiesing, FH Dortmund Ein großer
MehrPrimzahlen und RSA-Verschlüsselung
Primzahlen und RSA-Verschlüsselung Michael Fütterer und Jonathan Zachhuber 1 Einiges zu Primzahlen Ein paar Definitionen: Wir bezeichnen mit Z die Menge der positiven und negativen ganzen Zahlen, also
MehrErstellen von x-y-diagrammen in OpenOffice.calc
Erstellen von x-y-diagrammen in OpenOffice.calc In dieser kleinen Anleitung geht es nur darum, aus einer bestehenden Tabelle ein x-y-diagramm zu erzeugen. D.h. es müssen in der Tabelle mindestens zwei
MehrKleines Handbuch zur Fotogalerie der Pixel AG
1 1. Anmelden an der Galerie Um mit der Galerie arbeiten zu können muss man sich zuerst anmelden. Aufrufen der Galerie entweder über die Homepage (www.pixel-ag-bottwartal.de) oder über den direkten Link
MehrIm Folgenden wird Ihnen an einem Beispiel erklärt, wie Sie Excel-Anlagen und Excel-Vorlagen erstellen können.
Excel-Schnittstelle Im Folgenden wird Ihnen an einem Beispiel erklärt, wie Sie Excel-Anlagen und Excel-Vorlagen erstellen können. Voraussetzung: Microsoft Office Excel ab Version 2000 Zum verwendeten Beispiel:
MehrExcel Pivot-Tabellen 2010 effektiv
7.2 Berechnete Felder Falls in der Datenquelle die Zahlen nicht in der Form vorliegen wie Sie diese benötigen, können Sie die gewünschten Ergebnisse mit Formeln berechnen. Dazu erzeugen Sie ein berechnetes
MehrPowerPoint: Text. Text
PowerPoint: Anders als in einem verarbeitungsprogramm steht in PowerPoint der Cursor nicht automatisch links oben auf einem Blatt in der ersten Zeile und wartet auf eingabe. kann hier vielmehr frei über
MehrWeb-Kürzel. Krishna Tateneni Yves Arrouye Deutsche Übersetzung: Stefan Winter
Krishna Tateneni Yves Arrouye Deutsche Übersetzung: Stefan Winter 2 Inhaltsverzeichnis 1 Web-Kürzel 4 1.1 Einführung.......................................... 4 1.2 Web-Kürzel.........................................
MehrNovell Client. Anleitung. zur Verfügung gestellt durch: ZID Dezentrale Systeme. Februar 2015. ZID Dezentrale Systeme
Novell Client Anleitung zur Verfügung gestellt durch: ZID Dezentrale Systeme Februar 2015 Seite 2 von 8 Mit der Einführung von Windows 7 hat sich die Novell-Anmeldung sehr stark verändert. Der Novell Client
MehrHinweise zum Übungsblatt Formatierung von Text:
Hinweise zum Übungsblatt Formatierung von Text: Zu den Aufgaben 1 und 2: Als erstes markieren wir den Text den wir verändern wollen. Dazu benutzen wir die linke Maustaste. Wir positionieren den Mauszeiger
MehrÜbung 1. Explorer. Paint. Paint. Explorer
Seite 1 Übung 1 1. Öffnen Sie das Programm PAINT 2. Maximieren Sie das Fenster 3. Verkleinern Sie das Fenster (Nicht Minimieren!!) 4. Öffnen Sie ZUSÄTZLICH zu PAINT den Windows Explorer 5. Verkleinern
MehrVerhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...
PIWIN I Kap. 8 Objektorientierte Programmierung - Vererbung 31 Schlüsselwort: final Verhindert, dass eine Methode überschrieben wird public final int holekontostand() {... Erben von einer Klasse verbieten:
MehrDokumentation für die software für zahnärzte der procedia GmbH Onlinedokumentation
Dokumentation für die software für zahnärzte der procedia GmbH Onlinedokumentation (Bei Abweichungen, die bspw. durch technischen Fortschritt entstehen können, ziehen Sie bitte immer das aktuelle Handbuch
MehrVirtueller Seminarordner Anleitung für die Dozentinnen und Dozenten
Virtueller Seminarordner Anleitung für die Dozentinnen und Dozenten In dem Virtuellen Seminarordner werden für die Teilnehmerinnen und Teilnehmer des Seminars alle für das Seminar wichtigen Informationen,
Mehrsm@rt-tan plus Flickerfeld bewegt sich nicht
Technischer Hintergrund Um die Verwendung des Verfahrens Sm@rt-TAN plus des neuen sicheren TAN- Verfahrens so komfortabel wie möglich zu gestalten, wurde eine Möglichkeit geschaffen, die Angaben einer
MehrAnleitung für Berichte in Word Press, auf der neuen Homepage des DAV Koblenz
Anleitung für Berichte in Word Press, auf der neuen Homepage des DAV Koblenz Diese Anleitung soll als Kurzreferenz und Schnellanleitung dienen um einfach und schnell Berichte auf der Homepage www.dav-koblenz.de
MehrOutlook Erstellen einer E-Mail aus einer HTML - Vorlage INHALT
Outlook Erstellen einer E-Mail aus einer HTML - Vorlage INHALT LADEN DER VORLAGE 2 Öffnen Sie Outlook 2 Klicken Sie auf EXTRAS >> OPTIONEN 2 Im Optionenfeld von Outlook folgend Sie den Schritten 2 Fenster
MehrWas ich als Bürgermeister für Lübbecke tun möchte
Wahlprogramm in leichter Sprache Was ich als Bürgermeister für Lübbecke tun möchte Hallo, ich bin Dirk Raddy! Ich bin 47 Jahre alt. Ich wohne in Hüllhorst. Ich mache gerne Sport. Ich fahre gerne Ski. Ich
MehrBinäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen
Binäre Bäume 1. Allgemeines Binäre Bäume werden grundsätzlich verwendet, um Zahlen der Größe nach, oder Wörter dem Alphabet nach zu sortieren. Dem einfacheren Verständnis zu Liebe werde ich mich hier besonders
MehrBeschreibung E-Mail Regeln z.b. Abwesenheitsmeldung und Weiterleitung
Outlook Weiterleitungen & Abwesenheitsmeldungen Seite 1 von 6 Beschreibung E-Mail Regeln z.b. Abwesenheitsmeldung und Weiterleitung Erstellt: Quelle: 3.12.09/MM \\rsiag-s3aad\install\vnc\email Weiterleitung
MehrEinstellungen im Internet-Explorer (IE) (Stand 11/2013) für die Arbeit mit IOS2000 und DIALOG
Einstellungen im Internet-Explorer (IE) (Stand 11/2013) für die Arbeit mit IOS2000 und DIALOG Um mit IOS2000/DIALOG arbeiten zu können, benötigen Sie einen Webbrowser. Zurzeit unterstützen wir ausschließlich
MehrEinführung in die Java- Programmierung
Einführung in die Java- Programmierung Dr. Volker Riediger Tassilo Horn riediger horn@uni-koblenz.de WiSe 2012/13 1 Wichtig... Mittags keine Pommes... Praktikum A 230 C 207 (Madeleine + Esma) F 112 F 113
MehrObjektorientierte Programmierung für Anfänger am Beispiel PHP
Objektorientierte Programmierung für Anfänger am Beispiel PHP Johannes Mittendorfer http://jmittendorfer.hostingsociety.com 19. August 2012 Abstract Dieses Dokument soll die Vorteile der objektorientierten
MehrWas meinen die Leute eigentlich mit: Grexit?
Was meinen die Leute eigentlich mit: Grexit? Grexit sind eigentlich 2 Wörter. 1. Griechenland 2. Exit Exit ist ein englisches Wort. Es bedeutet: Ausgang. Aber was haben diese 2 Sachen mit-einander zu tun?
MehrTextgestaltung mit dem Editor TinyMCE Schritt für Schritt
Textgestaltung mit dem Editor TinyMCE Schritt für Schritt Folgender Artikel soll veröffentlicht und mit dem Editor TinyMCE gestaltet werden: Eine große Überschrift Ein Foto Hier kommt viel Text. Hier kommt
MehrAUF LETZTER SEITE DIESER ANLEITUNG!!!
BELEG DATENABGLEICH: Der Beleg-Datenabgleich wird innerhalb des geöffneten Steuerfalls über ELSTER-Belegdaten abgleichen gestartet. Es werden Ihnen alle verfügbaren Belege zum Steuerfall im ersten Bildschirm
MehrZentrale Objekte zur Programmierung graphischer Benutzeroberflächen (GUI)
1 JAVA für Bauingenieure Alexander Karakas SS 2008 Zentrale Objekte zur Programmierung graphischer Benutzeroberflächen (GUI) 21.05.2008 2 Was ist ein(e) GUI? GUI = Graphical User Interface = Graphische
MehrAnleitung zum Login. über die Mediteam- Homepage und zur Pflege von Praxisnachrichten
Anleitung zum Login über die Mediteam- Homepage und zur Pflege von Praxisnachrichten Stand: 18.Dezember 2013 1. Was ist der Mediteam-Login? Alle Mediteam-Mitglieder können kostenfrei einen Login beantragen.
Mehrtentoinfinity Apps 1.0 EINFÜHRUNG
tentoinfinity Apps Una Hilfe Inhalt Copyright 2013-2015 von tentoinfinity Apps. Alle Rechte vorbehalten. Inhalt der online-hilfe wurde zuletzt aktualisiert am August 6, 2015. Zusätzlicher Support Ressourcen
MehrErstellen einer digitalen Signatur für Adobe-Formulare
Erstellen einer digitalen Signatur für Adobe-Formulare (Hubert Straub 24.07.13) Die beiden Probleme beim Versenden digitaler Dokumente sind einmal die Prüfung der Authentizität des Absenders (was meist
MehrM. Graefenhan 2000-12-07. Übungen zu C. Blatt 3. Musterlösung
M. Graefenhan 2000-12-07 Aufgabe Lösungsweg Übungen zu C Blatt 3 Musterlösung Schreiben Sie ein Programm, das die Häufigkeit von Zeichen in einem eingelesenen String feststellt. Benutzen Sie dazu ein zweidimensionales
MehrFolge 18 - Vererbung
Workshop Folge 18 - Vererbung 18.1 Ein einfacher Fall der Vererbung Schritt 1 - Vorbereitungen Besorgen Sie sich - vielleicht aus einer der Übungen der Folge 17 - ein fertiges und lauffähiges Listenprojekt,
MehrJetzt sollt ihr von der Vorlage der Grundversion 1.0 ein eigenes Textadventure erstellen.
Teil B: Erweiterungen Jetzt sollt ihr von der Vorlage der Grundversion 1.0 ein eigenes Textadventure erstellen. Die folgenden Aufgaben und Ausführungen geben einige Hilfestellungen, welche (mindestens
MehrProfessionelle Seminare im Bereich MS-Office
Der Name BEREICH.VERSCHIEBEN() ist etwas unglücklich gewählt. Man kann mit der Funktion Bereiche zwar verschieben, man kann Bereiche aber auch verkleinern oder vergrößern. Besser wäre es, die Funktion
MehrDatensicherung. Beschreibung der Datensicherung
Datensicherung Mit dem Datensicherungsprogramm können Sie Ihre persönlichen Daten problemlos Sichern. Es ist möglich eine komplette Datensicherung durchzuführen, aber auch nur die neuen und geänderten
MehrPages, Keynote. und Numbers
Pages, Keynote und Numbers Pages, Keynote und Numbers Die iwork-apps im Büro und unterwegs nutzen Mac und mehr. Numbers Tipps und Tricks zur Arbeit mit Tabellen Kapitel 18 Kapitel 18 Tabellen als Ganzes
MehrMicrosoft Access 2013 Navigationsformular (Musterlösung)
Hochschulrechenzentrum Justus-Liebig-Universität Gießen Microsoft Access 2013 Navigationsformular (Musterlösung) Musterlösung zum Navigationsformular (Access 2013) Seite 1 von 5 Inhaltsverzeichnis Vorbemerkung...
MehrFolge 19 - Bäume. 19.1 Binärbäume - Allgemeines. Grundlagen: Ulrich Helmich: Informatik 2 mit BlueJ - Ein Kurs für die Stufe 12
Grundlagen: Folge 19 - Bäume 19.1 Binärbäume - Allgemeines Unter Bäumen versteht man in der Informatik Datenstrukturen, bei denen jedes Element mindestens zwei Nachfolger hat. Bereits in der Folge 17 haben
MehrFotostammtisch-Schaumburg
Der Anfang zur Benutzung der Web Seite! Alles ums Anmelden und Registrieren 1. Startseite 2. Registrieren 2.1 Registrieren als Mitglied unser Stammtischseite Wie im Bild markiert jetzt auf das Rote Register
MehrErzherzog Johann Jahr 2009
Erzherzog Johann Jahr 2009 Der Erzherzog Johann Tag an der FH JOANNEUM in Kapfenberg Was wird zur Erstellung einer Webseite benötigt? Um eine Webseite zu erstellen, sind die folgenden Dinge nötig: 1. Ein
MehrComputeria Rorschach Mit Excel Diagramme erstellen
Mit Excel Diagramme erstellen 25.12.2010 Roland Liebing Mit Excel Diagramme erstellen Diagramme können Zahlenwerte veranschaulichen, das heisst, mit Hilfe eines Diagramms können Zahlen besser miteinander
MehrAnleitung für die Registrierung und das Einstellen von Angeboten
Anleitung für die Registrierung und das Einstellen von Angeboten Das FRROOTS Logo zeigt Ihnen in den Abbildungen die wichtigsten Tipps und Klicks. 1. Aufrufen der Seite Rufen Sie zunächst in Ihrem Browser
MehrAbamsoft Finos im Zusammenspiel mit shop to date von DATA BECKER
Abamsoft Finos im Zusammenspiel mit shop to date von DATA BECKER Abamsoft Finos in Verbindung mit der Webshopanbindung wurde speziell auf die Shop-Software shop to date von DATA BECKER abgestimmt. Mit
MehrWindows. Workshop Internet-Explorer: Arbeiten mit Favoriten, Teil 1
Workshop Internet-Explorer: Arbeiten mit Favoriten, Teil 1 Wenn der Name nicht gerade www.buch.de oder www.bmw.de heißt, sind Internetadressen oft schwer zu merken Deshalb ist es sinnvoll, die Adressen
MehrArbeiten mit UMLed und Delphi
Arbeiten mit UMLed und Delphi Diese Anleitung soll zeigen, wie man Klassen mit dem UML ( Unified Modeling Language ) Editor UMLed erstellt, in Delphi exportiert und dort so einbindet, dass diese (bis auf
MehrPunkt 1 bis 11: -Anmeldung bei Schlecker und 1-8 -Herunterladen der Software
Wie erzeugt man ein Fotobuch im Internet bei Schlecker Seite Punkt 1 bis 11: -Anmeldung bei Schlecker und 1-8 -Herunterladen der Software Punkt 12 bis 24: -Wir arbeiten mit der Software 8-16 -Erstellung
MehrDAVID: und David vom Deutschlandlabor. Wir beantworten Fragen zu Deutschland und den Deutschen.
Das Deutschlandlabor Folge 09: Auto Manuskript Die Deutschen sind bekannt dafür, dass sie ihre Autos lieben. Doch wie sehr lieben sie ihre Autos wirklich, und hat wirklich jeder in Deutschland ein eigenes
MehrRegistrierung am Elterninformationssysytem: ClaXss Infoline
elektronisches ElternInformationsSystem (EIS) Klicken Sie auf das Logo oder geben Sie in Ihrem Browser folgende Adresse ein: https://kommunalersprien.schule-eltern.info/infoline/claxss Diese Anleitung
MehrS TAND N OVEMBE R 2012 HANDBUCH DUDLE.ELK-WUE.DE T E R M I N A B S P R A C H E N I N D E R L A N D E S K I R C H E
S TAND N OVEMBE R 2012 HANDBUCH T E R M I N A B S P R A C H E N I N D E R L A N D E S K I R C H E Herausgeber Referat Informationstechnologie in der Landeskirche und im Oberkirchenrat Evangelischer Oberkirchenrat
MehrEinrichtung des Cisco VPN Clients (IPSEC) in Windows7
Einrichtung des Cisco VPN Clients (IPSEC) in Windows7 Diese Verbindung muss einmalig eingerichtet werden und wird benötigt, um den Zugriff vom privaten Rechner oder der Workstation im Home Office über
MehrIn diesem Tutorial lernen Sie, wie Sie einen Termin erfassen und verschiedene Einstellungen zu einem Termin vornehmen können.
Tutorial: Wie erfasse ich einen Termin? In diesem Tutorial lernen Sie, wie Sie einen Termin erfassen und verschiedene Einstellungen zu einem Termin vornehmen können. Neben den allgemeinen Angaben zu einem
MehrKapitel 3 Frames Seite 1
Kapitel 3 Frames Seite 1 3 Frames 3.1 Allgemeines Mit Frames teilt man eine HTML-Seite in mehrere Bereiche ein. Eine Seite, die mit Frames aufgeteilt ist, besteht aus mehreren Einzelseiten, die sich den
MehrViele Bilder auf der FA-Homepage
Viele Bilder auf der FA-Homepage Standardmäßig lassen sich auf einer FA-Homepage nur 2 Bilder mit zugehörigem Text unterbringen. Sollen es mehr Bilder sein, muss man diese als von einer im Internet
MehrHandbuch. NAFI Online-Spezial. Kunden- / Datenverwaltung. 1. Auflage. (Stand: 24.09.2014)
Handbuch NAFI Online-Spezial 1. Auflage (Stand: 24.09.2014) Copyright 2016 by NAFI GmbH Unerlaubte Vervielfältigungen sind untersagt! Inhaltsangabe Einleitung... 3 Kundenauswahl... 3 Kunde hinzufügen...
MehrDas RSA-Verschlüsselungsverfahren 1 Christian Vollmer
Das RSA-Verschlüsselungsverfahren 1 Christian Vollmer Allgemein: Das RSA-Verschlüsselungsverfahren ist ein häufig benutztes Verschlüsselungsverfahren, weil es sehr sicher ist. Es gehört zu der Klasse der
MehrProfessionelle Seminare im Bereich MS-Office
Serienbrief aus Outlook heraus Schritt 1 Zuerst sollten Sie die Kontakte einblenden, damit Ihnen der Seriendruck zur Verfügung steht. Schritt 2 Danach wählen Sie bitte Gerhard Grünholz 1 Schritt 3 Es öffnet
MehrMediator 9 - Lernprogramm
Mediator 9 - Lernprogramm Ein Lernprogramm mit Mediator erstellen Mediator 9 bietet viele Möglichkeiten, CBT-Module (Computer Based Training = Computerunterstütztes Lernen) zu erstellen, z. B. Drag & Drop
MehrApplets. Applets. Applets. Applet: Java-Programm Eingebettet in einer HTML-Seite Ausführung von einem Java-fähigen Web-Browser oder sog.
Johann Wolfgang Goethe-Universität Professur für Graphische Datenverarbeitung Fachbereich Informatik und Mathematik Prof. Dr. Detlef Krömker Applet: Java-Programm Eingebettet in einer HTML-Seite Ausführung
MehrTeamSpeak3 Einrichten
TeamSpeak3 Einrichten Version 1.0.3 24. April 2012 StreamPlus UG Es ist untersagt dieses Dokument ohne eine schriftliche Genehmigung der StreamPlus UG vollständig oder auszugsweise zu reproduzieren, vervielfältigen
MehrWir basteln einen Jahreskalender mit MS Excel.
Wir basteln einen Jahreskalender mit MS Excel. In meinen Seminaren werde ich hin und wieder nach einem Excel-Jahreskalender gefragt. Im Internet findet man natürlich eine ganze Reihe mehr oder weniger
MehrAnlegen eines DLRG Accounts
Anlegen eines DLRG Accounts Seite 1 von 6 Auf der Startseite des Internet Service Centers (https:\\dlrg.de) führt der Link DLRG-Account anlegen zu einer Eingabemaske, mit der sich jedes DLRG-Mitglied genau
MehrJava Projekt: Tic Tac Toe + GUI
Java Projekt: Tic Tac Toe + GUI Rechnerpraktikum aus Programmierung im WS 2005/06 unter der Leitung von Dr. Michael Hahsler Tadeh Amirian (h0253821) 10.01.2006 1) Problemdefinition Beim TicTacToe Spiel
MehrErstellen einer Collage. Zuerst ein leeres Dokument erzeugen, auf dem alle anderen Bilder zusammengefügt werden sollen (über [Datei] > [Neu])
3.7 Erstellen einer Collage Zuerst ein leeres Dokument erzeugen, auf dem alle anderen Bilder zusammengefügt werden sollen (über [Datei] > [Neu]) Dann Größe des Dokuments festlegen beispielsweise A4 (weitere
MehrSpeichern. Speichern unter
Speichern Speichern unter Speichern Auf einem PC wird ständig gespeichert. Von der Festplatte in den Arbeitspeicher und zurück Beim Download Beim Kopieren Beim Aufruf eines Programms Beim Löschen Beim
MehrPrinzipien Objektorientierter Programmierung
Prinzipien Objektorientierter Programmierung Valerian Wintner Inhaltsverzeichnis 1 Vorwort 1 2 Kapselung 1 3 Polymorphie 2 3.1 Dynamische Polymorphie...................... 2 3.2 Statische Polymorphie........................
MehrAnleitung RÄUME BUCHEN MIT OUTLOOK FÜR VERWALTUNGSANGESTELLTE
Anleitung RÄUME BUCHEN MIT OUTLOOK FÜR VERWALTUNGSANGESTELLTE Dezernat 6 Abteilung 4 Stand: 14.Oktober 2014 Inhalt 1. Einleitung 3 2. Räume & gemeinsame Termine finden 3 3. Rüstzeit 8 4. FAQ: Oft gestellte
MehrAnleitung zum erfassen von Last Minute Angeboten und Stellenangebote
Anleitung zum erfassen von Last Minute Angeboten und Stellenangebote Zweck dieser Anleitung ist es einen kleinen Überblick über die Funktion Last Minute auf Swisshotelportal zu erhalten. Für das erstellen
MehrOutlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang
sysplus.ch outlook - mail-grundlagen Seite 1/8 Outlook Mail-Grundlagen Posteingang Es gibt verschiedene Möglichkeiten, um zum Posteingang zu gelangen. Man kann links im Outlook-Fenster auf die Schaltfläche
MehrReporting Services und SharePoint 2010 Teil 1
Reporting Services und SharePoint 2010 Teil 1 Abstract Bei der Verwendung der Reporting Services in Zusammenhang mit SharePoint 2010 stellt sich immer wieder die Frage bei der Installation: Wo und Wie?
MehrInformatik Kurs Simulation. Hilfe für den Consideo Modeler
Hilfe für den Consideo Modeler Consideo stellt Schulen den Modeler kostenlos zur Verfügung. Wenden Sie sich an: http://consideo-modeler.de/ Der Modeler ist ein Werkzeug, das nicht für schulische Zwecke
MehrBeispiel Shop-Eintrag Ladenlokal & Online-Shop im Verzeichnis www.wir-lieben-shops.de 1
Beispiel Shop-Eintrag Ladenlokal & Online-Shop. Als Händler haben Sie beim Shop-Verzeichnis wir-lieben-shops.de die Möglichkeit einen oder mehrere Shop- Einträge zu erstellen. Es gibt 3 verschiedene Typen
Mehr40-Tage-Wunder- Kurs. Umarme, was Du nicht ändern kannst.
40-Tage-Wunder- Kurs Umarme, was Du nicht ändern kannst. Das sagt Wikipedia: Als Wunder (griechisch thauma) gilt umgangssprachlich ein Ereignis, dessen Zustandekommen man sich nicht erklären kann, so dass
MehrBereich METIS (Texte im Internet) Zählmarkenrecherche
Bereich METIS (Texte im Internet) Zählmarkenrecherche Über die Zählmarkenrecherche kann man nach der Eingabe des Privaten Identifikationscodes einer bestimmten Zählmarke, 1. Informationen zu dieser Zählmarke
MehrDie Dateiablage Der Weg zur Dateiablage
Die Dateiablage In Ihrem Privatbereich haben Sie die Möglichkeit, Dateien verschiedener Formate abzulegen, zu sortieren, zu archivieren und in andere Dateiablagen der Plattform zu kopieren. In den Gruppen
MehrWie halte ich Ordnung auf meiner Festplatte?
Wie halte ich Ordnung auf meiner Festplatte? Was hältst du von folgender Ordnung? Du hast zu Hause einen Schrank. Alles was dir im Wege ist, Zeitungen, Briefe, schmutzige Wäsche, Essensreste, Küchenabfälle,
MehrGRAF-SYTECO. Handbuch. Zeichensatzgenerator für AT-Geräte. Erstellt: November 2004. SYsteme TEchnischer COmmunikation
GRAF-SYTECO Handbuch Zeichensatzgenerator für AT-Geräte Dokument: Status: H165A0 Freigegeben Erstellt: November 2004 SYsteme TEchnischer COmmunikation GRAF-SYTECO Gmbh & Co.KG * Kaiserstrasse 18 * D-78609
Mehr2. Speichern und öffnen
2. Speichern und öffnen In diesem Modul lernen Sie, ein Dokument zum ersten Mal zu speichern, zu öffnen, nochmals zu speichern unter demselben Namen, nachdem Sie etwas geändert haben, zu speichern als
MehrSchrittweise Anleitung zur Erstellung einer Angebotseite 1. In Ihrem Dashboard klicken Sie auf Neu anlegen, um eine neue Seite zu erstellen.
Schrittweise Anleitung zur Erstellung einer Angebotseite 1. In Ihrem Dashboard klicken Sie auf Neu anlegen, um eine neue Seite zu erstellen. Klicken Sie auf Neu anlegen, um Ihre neue Angebotseite zu erstellen..
MehrUpdatebeschreibung JAVA Version 3.6 und Internet Version 1.2
Updatebeschreibung JAVA Version 3.6 und Internet Version 1.2 Hier finden Sie die Beschreibung der letzten Änderungen und Aktualisierungen. Bei Fragen und Anregungen steht das EDI-Real-Team unter +43 732
Mehr