IT-Academy Logo
Sign Up Login Help
Home - Programmieren - Java - Java: Konzepte



Java: Konzepte

Java ist zunächst einmal einfach eine Programmiersprache. Sie hat starke Anleihen bei C++, so dass sie für C++-Programmierer relativ leicht zu erlernen ist.


Autor: Arnold Willerner (willemer)
Datum: 23-01-2002, 19:36:29
Referenzen: http://www.willemer.de/informatik/index.htm
Schwierigkeit: Profis
Ansichten: 8797x
Rating: 4.17 (6x bewertet)

Hinweis:

Für den hier dargestellte Inhalt ist nicht der Betreiber der Plattform, sondern der jeweilige Autor verantwortlich.
Falls Sie Missbrauch vermuten, bitten wir Sie, uns unter missbrauch@it-academy.cc zu kontaktieren.

[Druckansicht] [Als E-Mail senden] [Kommentar verfassen]



Java Runtimesystem

Das Besondere an Java ist, dass der Code von einem Laufzeitsystem interpretiert wird, das dem Programm vorgaukelt, alle Maschinen seien gleich. Dadurch kann portabel programmiert werden.

Der Compiler dient dazu, einen Zwischencode zu erzeugen, der vom Laufzeitsystem interpretiert wird. Es kann auch Code erzeugt werden, der einen WWW-Browser als Laufzeitsystem nutzt.

Applikations- und Appletprogrammierung

Applikation

Eine Java-Applikation startet mit der öffentlichen, statischen Funktion main einer Klasse. Dies ist analog zur Funktion main in C.

public class hello { public static void main(String argv[]) { System.out.println("hello world"); } }

Applet

Mit Applets werden Programme für Browser geschrieben. Dazu werden Klassen entwickelt, die von der Klasse Applet abgeleitet werden. Beispielsweise:

public class hello extents Applet { public paint(Graphics g) { g.PaintString("hello world", 10, 10); } }

Als Beispiel für ein Applet kann man sich das Spiel Bermuda ansehen.

Java Datentypen

Standardtypen

Die Standardtypen in Java sind fast gleich wie in C. Alle sind in ihrer Größe klar definiert. Aus diesem Grund ist auch sizeof() nicht erforderlich.

byte 8 Bit float 32 Bit
short 16 Bit double 64 Bit
int 32 Bit char 16 Bit
long 64 Bit boolean 8 Bit

boolean

Der neue Typ boolean kann die Werte true und false annehmen. Dieser Typ ist nicht kompatibel mit einem numerischen Typ wie das in C der Fall ist. Eine Zuweisung eines Wertes an eine boolesche Variable scheitert. Auf diese Weise wird der beliebte C-Fehler, in einem booleschen Ausdruck statt dem == eine Zuweisung = zu verwenden, sofort durch den Compiler entdeckt.

char

Der char belegt zwei Byte und kann damit den Unicode Standard verwenden. Für Zeichenketten wird in Java der Typ String und nicht ein char-Feld verwendet.

Fließkommazahlen

double ist mit 8 Byte doppelt so groß wie ein float. Beide entsprechen dem IEEE 754.

Konstanten

Konstanten werden wie Variablen definiert. Durch das Attribut final bleiben sie unveränderbar.

final int MAXFACH = 25;

Felder

Wie bei C beginnt der Index bei 0. Die Definition erfolgt normalerweise in zwei Schritten. Zunächst wird ein Array deklariert. Dabei wird statt der Größe nur leere rechteckige Klammern angegeben. Die so deklarierte Variable ist kein Zeiger, aber ein Referenztyp.

int meinFeld[]; meinFeld = new int[99];

Das Feld wird erst durch den new-Operator alloziiert. Danach ist die Größe des Feldes nicht mehr änderbar.
Steht von vornherein die Größe fest, kann aber auch beides in einem Schritt erfolgen.

int[] meinFeld = new int[99];

Es ist auch möglich, ein Feld mit Werten vorzubelegen. Auch hier erfolgt Deklaration und Alloziierung in einem Schritt. Die Dimension des Feldes ergibt sich aus der Anzahl der vorgegebenen Werte.

int[] meineFinger = {1,2,3,4,5};

Mehrdimensionale Felder sind analog:

int meinFeld[][][]; meinFeld = new int[9][4][2];

Alle Felder besitzen eine Instanzvariable namens length, mit der man deren Länge ermitteln kann.

Referenztypen

Objekte, Arrays und Strings sind Referenztypen. Das bedeutet, dass die Variable nicht den Speicher direkt repräsentiert, sondern nur eine Referenz auf die Daten hält. Beim Zugriff auf die Daten ist der Unterschied nicht sichtbar. Aber sobald man eine Referenzvariable kopiert, wird nicht etwa ein Duplikat der Daten angefertigt, sondern eine zweite Referenz auf die gleichen Daten. Will man eine Kopie der Daten, verwendet man clone. Das Gleiche gilt für die Abfrage auf Gleichheit. Wird der == Operator verwendet, wird geprüft, ob beide Variablen auf denselben Datensatz zeigen. Will man bei Strings also feststellen, ob der inhaltlich gleiche String in beiden Variablen steht, verwendet man die Methode equals.

Operatoren

Numerische Operatoren

+ unär positives Vorzeichen
- unär negatives Vorzeichen
+ binär Summe
- binär Differenz
* binär Produkt
/ binär Quotient
% binär Modulo (Rest)
++ unär Inkrement
-- unär Dekrement

Boolesche Operatoren

Zeichen Bedeutung
== gleich
!= ungleich
< kleiner
<= kleiner oder gleich
> größer
>= größer oder gleich
&& UND mit Shortcut
& UND ohne Shortcut
|| ODER mit Shortcut
| ODER ohne Shortcut
^ exklusiv ODER (XOR): beide Wahrheitswerte unterscheiden sich
! NOT

Java Kontrollstrukturen

Java ähnelt in den Kontrollstrukturen C.

Durch geschweifte Klammern werden mehrere Anweisungen zu einer zusammengefasst. Dies wird insbesondere im Zusammenhang mit den Kontrollstrukturen verwendet.

if else

Ein if kann einen else-Zweig haben, muss aber nicht.

if ( Bedingung ) Statement; if ( Bedingung ) Statement1; else Statement2;

dangeling else

Wenn es bei zwei if-Anweisungen nur ein else gibt, gehört dieses immer zum inneren if. Beispiel:

if (b1) if (b2) a1; else a2;

Der else-Zweig mit a2 gehört trotz der anders scheinenden Einrückung zum if mit b2.

switch

switch ist eine Fallunterscheidung.

switch (ausdruck) { case constant1: anweisung1; case constant2: anweisung2; break; case constant3: anweisung3; break; default: anweisung4; }

Der ausdruck muss vom Typ byte, short, char oder int sein. Ist der Wert von ausdruck gleich constant1, so wird die anweisung1 und die anweisung2 ausgeführt. Hinter anweisung2 sorgt das break dafür, dass die weiteren Anweisungen nicht ausgeführt werden.

Der default-Zweig wird angesprungen, wenn keine der Konstanten dem switch-Ausdruck entspricht.

while

while ( Bedingung ) Anweisung

Die Bedingung ist ein boolescher Ausdruck. Ist dieser bei Erreichen des while nicht erfüllt, wird die Anweisung nicht ausgeführt. Ansonsten wird die Anweisung so oft ausgeführt, bis die Bedingung erfüllt ist.

do

Im Gegensatz zur while-Schleife wird die do-Schleife mindestens einmal durchlaufen. Die Bedingung wird am Ende geprüft.

do Anweisung while ( Bedingung )

for

Die for-Schleife ist eine spezialisierte while-Schleife. Sie wird überwiegend beim Zählen verwendet.

for ( Startanweisung ; Bedingung ; EndAnweisung ) SchleifenAnweisung

Ein Beispiel macht das sofort deutlich:

for (i=0; i<10; i++) a[i] = 1;

i=0 ist die Startanweisung. Sie wird genau einmal vor Beginn der Schleife ausgeführt. i<10 ist die Bedingung, die am Schleifenkopf abgefragt wird. Da 0 kleiner als 10 ist, wird die Anweisung a[0]=1 ausgeführt. Am Ende der Anweisung wird die Endanweisung i++ ausgeführt und wieder zum Kopf gesprungen. Die Startanweisung i=0 wird nicht wieder durchgeführt, da sie nur einmalig vor Start der Schleife ausgeführt wird. Aber die Bedingung wird wiederum geprüft.

Insgesamt setzt das Beispiel die Werte von a[0] bis a[9] und damit die ersten zehn Elemente des Feldes a auf 1.

break und continue

Wie in C kann eine Schleife sowohl mit break als auch mit continue unterbrochen bzw. kurzgeschlossen werden. Mit break wird die Schleife verlassen. continue übergeht den Rest des Schleifenkörpers, bleibt aber in der Schleife, solange die Bedingung noch erfüllt ist.

Java: Klassen

Definition einer Klasse

Eine Klasse beinhaltet Datenmember und Methoden, wie diese zu bearbeiten sind. Um die Separation von Klassen zu erzwingen, ist nur eine öffentliche Klasse je Datei zugelassen. Die Datei muss dann auch den Namen der öffentlichen Klasse zuzüglich der Extension .java tragen. Nach der Übersetzung durch den Compiler hat das Ergebnis die Extension .class.

Beispielsweise würde die Klasse Auto in der Datei Auto.java realisiert und könnte beispielsweise folgenden Code enthalten.

public class Auto { public String name; private int PS; public int getPS() { return PS; } }

Privatsphäre

Member und Methoden, die public deklariert sind, können von anderen Klassen direkt verwendet werden. Soll das Element nur für interne Zwecke dienen, wird es als private deklariert.

Statisches

Das Attribut static hat die Bedeutung, dass etwas exakt einmal existiert und dies vom Laden der Klasse bis zum Ende des Programms.

Statische Membervariablen existieren also nicht für jedes Objekt neu, sondern einmal für die gesamte Klasse. Solche Variablen werden beispielsweise verwendet, um die Anzahl der angelegten Objekte einer Klasse zu zählen. Der Zugriff auf diese Objekte erfolgt über den Klassennamen statt über einen Variablennamen erfolgen. Immerhin bedarf die Existenz einer statischen Variablen nicht einer Instanz.

Um statische Membervariablen zu initialisieren, werden statische Konstruktoren definiert. Diese werden bei Laden der Klasse einmal ausgeführt und nicht jedesmal, wenn eine Instanz gebildet wird.

Instanz einer Klasse: ein Objekt

Auto meinR4; meinR4 = new Auto(); meinR4.name = "R4";

Konstruktor und Destruktor

Konstruktor

Der Konstruktor ist eine Methode, die bei Instanzierung (new) einer Klasse aufgerufen werden. Der Standardkonstruktor hat keine Parameter. Im Konstruktor findet die Initialisierung statt, also alle die Vorgänge, die genau einmal zu Start erledigt werden sollten, bevor die Variable benutzt wird. Da die Variable sich quasi selbst vorbereitet, werden Initialisierungsfehler vermieden und der Code wird stabiler.

Ein Konstruktor trägt den Namen der Klasse und hat keinen Rückgabewert. Der Standarkonstruktor hat keine Parameter. Es kann weitere (überladene) Konstruktoren mit Parametern geben. Im folgenden Beispiel werden im Standardkonstruktor die Variablen vorbelegt. Im Konstruktor mit dem Stringparameter wird der Name des Autos beim new bereits festgelegt.

public class Auto { public String name; private int PS; public Auto() { PS = 1; name=""; } public Auto(String pName) { name = pName; PS = 1; } public int getPS() { return PS; } } ... Auto meinR4 = new Auto("Renault R4");

Durch Weglassen des Standardkonstruktors kann verhindert werden, dass ein Auto ohne Namen erzeugt wird.

Destruktor

protected void finalize() { }

Der Destruktor wird von der Garbage Collection aufgerufen, sobald das Objekt eleminiert wird. Da diese als gering priorisierter Thread im Hintergrund läuft, ist der Zeitpunkt der Ausführung schwer bestimmbar. Es ist sogar denkbar, dass der Destruktor nie aufgerufen wird, nämlich dann, wenn das Programm beendet wird, bevor es zu einer Garbage Collection kommt.

Vererbung

Die Vererbung realisiert die OOP-Konzepte der Generalisierung und Spezialisierung.

public class Fahrzeug { protected String name; protected int Plaetze; public int getPlaetze() { return Plaetze; } }

Davon abgeleitet könnte es eine Klasse Kraftfahrzeug geben. Das Kraftfahrzeug hat alle Eigenschaften eines Fahrzeuges, hat aber zusätzlich einen Motor. Dieser wird hier durch seine Leistung in kW repräsentiert.

public class Kraftfahrzeug extends Fahrzeug { protected int kW; }

Jede Klasse in Java ist mindestens indirekt von der Klasse Object abgeleitet. Diese Klasse besitzt unter anderem zwei wichtige Membermethoden:

  • boolean equals(Object obj)
    Diese Methode gibt den Wert true zurück, wenn das Image des Objektes gleich dem Objekt obj ist. Dabei ist zu berücksichtigen, dass wenn eine Membervariable eine Referenz ist, diese auf exakt das gleiche Objekt referenzieren müssen.
  • protected Object clone()
    Nach der Zuweisung einer Referenzvariablen an eine andere, zeigen beide Variablen auf das gleiche Objekt. Soll ein Duplikat angefertigt werden, muss die Methode clone gerufen werden.

Überladen und Überlagern

Der Name einer Methode kann innerhalb einer Klasse durchaus mehrfach verwendet werden. Allerdings muss jede Methode andere Parameter besitzen. Dieses nennt man Überladen.

Vom Überlagern spricht man, wenn eine Methode der Vaterklasse in der abgeleiteten Klasse neu definiert wird. Dabei müssen auch die Parameter übereinstimmen. Ist ein Zugriff auf die "Vatermethode" erforderlich, wird sie mit super.MethodenName(Parameter) angesprochen. Dies ist nur mit der direkten Vaterklasse möglich. Eine Konstruktion super.super.xxx ist nicht zulässig.

Abstrakte Klassen in Java

Eine abstrakte Klasse entsteht dadurch, dass mindestens eine Methode mit dem Atribut abstract versehen wird. Das bedeutet, dass die Methode nicht an dieser Stelle implementiert wird, sondern dass eine Spezialisierung dieser Klasse die Methode implementieren muss. Von einer abstrakten Klasse kann keine Instanz gebildet werden.

Interface

Ein Interface ist der Spezialfall einer abstrakten Klasse. Sie besteht nur aus abstrakten Methoden und Konstanten. Sie dient dazu, eine Funktionalität zu beschreiben, ohne sie zu realisieren.

Mehrfachvererbung contra Interface

Auch vom Kraftfahrzeug kann es wieder Spezialisierungen geben, wie etwa ein Motorrad und ein Auto. Aber man könnte auch eine Klasse Zweiräder einbauen, die Spezialisierung von Fahrzeug wäre. Das Motorrad würde dann sowohl ein Zweirad als auch ein Kraftfahrzeug ist. Das Fahrrad dagegen nur Zweirad, aber kein Kraftfahrzeug. Das Auto ist dann Kraftfahrzeug, aber nicht Zweirad. In Java ist diese Mehrfachvererbung nicht möglich.

Das Motorrad würde man entsprechend zu den Kraftfahrzeugen einordnen. Dagegen kann man eine abstrakte Klasse für Zweiräder definieren, die beschreibt, was typisch für ein Zweirad ist. Man bildet ein Interface Zweirad. Diese abstrakte Schnittstelle wird dann von jedem Fahrzeug, das ein Zweirad ist, implementiert.

Ein Interface gleicht also einer Klasse, enthält aber nur abstrakte Funktionen und Konstanten.

Java Abstract Windowing Toolkit (AWT)

Das Grundkonzept des AWT ist von X-Window geprägt. Innerhalb des Programms werden die Fenster und deren Unterfenster angelegt. Unterfenster sind beispielsweise Kontrollelemente oder Layout-Fenster, die beschreiben, wie die Kontrollemelente angeordnet werden. Bei der Erzeugung des Elemente wird auch definiert, welche Funktion welche Ereignisse des Kontrollelement bearbeitet.

Basis dieses Textes ist Java 1.1.

Ein Programm, das die awt benutzt, muß erst die Library importieren.

import java.awt.*;

Kontrollelemente

Label

Label(); Label(String); Label(String, Ausrichtung); Ausrichtung: Label.RIGHT Label.LEFT Label.CENTER

Die Memberfunktionen

void setText(String); String getText(); void setAlignment(int); int getAlignment();

Button

Der Button hat die gleichen Memberfunktionen wie Label.

Checkboxen und Radiobutton

Gleiche Memberfunktionen wie Label und Button, hinzu kommt:

boolean getState(); setState(boolean);

Die Radiobuttons unterscheiden sich dadurch, daß sie gemeinsam in einer CheckboxGroup befinden. Beispiel:

CheckboxGroup Gruppe = new CheckboxGroup(); this.add(new Checkbox("ARD", true, Gruppe)); this.add(new Checkbox("ZDF", false, Gruppe));

Member, die nur bei Radio-Buttons funktionieren.

Checkbox getCurrent(); SetCurrent(Checkbox);

Choice

Unter Windows würde man dieses Kontrollelement eine Combobox nennen.

Der Index der Items beginnt bei 0.

addItem(String) fügt ein Item hinzu
String getItem(int) liefert den Text des Items (Index beginnt bei 0)
int getItemCount() liefert die Anzahl der Elemente der Liste
int getSelectedItem() liefert den Index des selektierten Items
void select(int) selektiert das Item mit dem angebenen Index
void select(String) selektiert das Item mit dem angebenen Text

List

Unter Windows würde man dieses Kontrollelement eine Listbox nennen.

Der Index der Items beginnt bei 0.

addItem(String) fügt ein Item hinzu
String getItem(int) liefert den Text des Items (Index beginnt bei 0)
int getItemCount() liefert die Anzahl der Elemente der Liste
String getSelectedItem() liefert den Text des selektierten Items
int getSelectedIndex() liefert den Index des selektierten Items
void select(int) selektiert das Item mit dem angebenen Index
void select(String) selektiert das Item mit dem angebenen Text
bei Listen mit Mehrfachselektion
String[] getSelectedItems() liefert den Index des selektierten Items
int[] getSelectedIndexes() liefert den Index des selektierten Items

TextField

Konstruktoren:

TextField()
TextField(int, String)

Maximale Spalten und vorgegebener Text kann angegeben werden.

Memberfunktionen:

int setText(String) belegt das Feld mit Text
String getText() liefert den Inhalt des Textfeldes
select(int, int) setzt die Markierung
selectAll() setzt die Markierung über alles
int getSelectionStart() liefert Anfang der Markierung
int getSelectionEnd() liefert Ende der Markierung
int getSelectionText() liefert den markierten Text
int getColumns() liefert Anzahl der max. Spalten
setEchoChar(char) setzt das Zeichen für die Passwortfunktion

TextArea

Konstruktoren:

TextArea()
TextArea(String, int Zeilen, int Spalten)

Memberfunktionen:

int setText(String) belegt das Feld mit Text
String getText() liefert den Inhalt des Textfeldes
select(int, int) setzt die Markierung
selectAll() setzt die Markierung über alles
int getSelectionStart() liefert Anfang der Markierung
int getSelectionEnd() liefert Ende der Markierung
int getSelectionText() liefert den markierten Text
int getColumns() liefert Anzahl der max. Spalten
int getRows() liefert Anzahl der max. Zeilen
append(String) fügt Text an das Ende des Textes
insert(String, int) fügt Text an der Position ein
replace(String, int, int) ersetzt Text zwischen den Positionen

Java AWT: Menü

Menüs werden nicht wie bei Windows und einigen anderen Systemen üblich per Ressource definiert, sondern im Programm bei der Initialisierung erstellt und in den Frame eingehängt. Die Methode dazu lautet auch setMenuBar.

Richtfest

Ein Menü besteht aus mehreren Komponenten.

Javaklasse Element
MenuBar Der Querbalken, der die Hauptpunkte enthält (Datei, Bearbeiten...)
Menu Das senkrechte Element, das aufklappt und die Punkte enthält
MenuIten Der anwählbare Punkt, der die Aktion auslöst

Im folgenden Listing wird gezeigt, wie man ein extrem einfaches Menü aufbaut. Es gibt nur ein Dateimenü mit dem einzigen Punkt Ende. Nacheinander werden MenuBar, Menu und MenuItem erzeugt und in der Elternkomponente eingeklinkt.

MenuBar myMenuBar = new MenuBar(); myFrame.setMenuBar(myMenuBar); Menu fileMenu = new Menu("Datei"); myMenuBar.add(fileMenu); MenuItem EndeItem = new MenuItem("Ende"); fileMenu.add(EndeItem);

Wenn sich die Ereignisse überstürzen

So elegant ein Menü auch sein mag, es ist weitgehend uninteressant, wenn das Programm nicht erfährt, das ein Punkt ausgewählt wurde. Um das Ereignis der Menüauswahl zu fangen, braucht man einen ActionListener. Eine Instanz dieser Klasse wird mit der Funktion addActionListener an das MenuItem gebunden. Dessen Memberfunction actionPerformed wird beim Eintreten des Ereignisses aufgerufen.

In der folgenden Variante wird im Aufruf von addActionListener eine solche Instanz direkt erzeugt und die Funktion actionPerformed direkt eingehängt.

MenuItem EndeItem = new MenuItem("Ende"); EndeItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.exit(0); } } ); fileMenu.add(EndeItem);

Man kann MenuBar und ActionListener in einer Klasse aufsetzen, wodurch die komplette Menübehandlung zusammengefasst wird. Das sieht beispielsweise so aus:

import java.awt.*; import java.awt.event.*; public class PimfMenu extends MenuBar implements ActionListener { PimfMenu(Frame myFrame) { myFrame.setMenuBar(this); Menu fileMenu = new Menu("Datei"); add(fileMenu); MenuItem EndeItem = new MenuItem("Ende"); EndeItem.setActionCommand("exit"); EndeItem.addActionListener(this); fileMenu.add(EndeItem); } // hier wird auf das Ereignis reagiert public void actionPerformed(ActionEvent event) { if (event.getActionCommand()=="exit") { Pimf.Exit(); } } }

Mit der Funktion setActionCommand kann dem Menüpunkt ein Befehl gegeben werden, der unabhängig von der Beschriftung intern verwendet wird. Er kann aus dem Ereignis per getActionCommand entnommen werden. Hier wird die Exit-Routine des Hauptprogrammes gerufen. Dort wird dann entschieden, ob dem Programm mit System.exit() wirklich die Luft abgedreht werden soll.

Container

Java AWT: Frame

Frames sind eigene Fenster. Insbesondere, wenn man eine eigenstädige Anwendung, also kein Applet schreiben will, braucht man zunächst einen Frame. Bei einem Applet wird ein eigenes Fenster für die Anwendung erzeugt.

Memberfunktionen:

String getTitle() liefert den Titel
setTitle(String) setzt den Titel
setVisible(true) macht den Frame sichtbar oder unsichtbar
setMenuBar(MenuBar) hängt ein Menü ein
setSize(int, int) Gr&souml;ssenänderung in Pixeln x/y
dispose() zerstöre den Frame

Java AWT: Dialog

Wie unter allen GUIs dient ein Dialog einer kurzzeitigen Anfrage an den Benutzer. Auch Java kennt modale und nicht-modale Dialoge. Der nicht-modale verhält sich eher wie ein Fenster, während der modale Dialog den Anwender nichts anderes tun läßt was außerhalb des Dialogs liegt. Um einen Dialog zu erstellen, wird eine Klasse geschrieben, die sich von Dialog herleitet. Im Konstruktor werden die Elemente, die in den Dialog gehören, erstellt und angeordnet. Wird die Klasse auch als ActionListener implementiert, werden hier auch die Ereignisse gefangen. Wichtig sind hier die Memberfunktion actionPerformed für die Bearbeitung der Ereignisse und die processEvent, um den Dialog zu schließen. Dazu muss zu Anfang enableEvents aufgerufen werden.

import java.awt.*; import java.awt.event.*; public class InfoDialog extends Dialog implements ActionListener { InfoDialog(Frame myFrame, String title) { super(myFrame, title, true); enableEvents(AWTEvent.WINDOW_EVENT_MASK); add("Center", new Label("(C) Arnold Willemer 2000")); Button Ok = new Button("OK"); Ok.addActionListener(this); Ok.setActionCommand("ok"); add("South", Ok); pack(); } public void actionPerformed(ActionEvent event) { setVisible(false); } public void processEvent(AWTEvent e) { if (e.getID() == Event.WINDOW_DESTROY) { dispose(); } else { super.processEvent(e); } } }

Die Superklasse Dialog hat den folgenden Konstruktor:

Dialog meinDialog = new Dialog(meinFrame, "Balkentitel des Dialogs", true);

Der erste Parameter ist der Frame, aus dem der Dialog gestartet wurde, der zweite der Balkentitel und der letzte Parameter gibt an, daß der Dialog modal sein soll. Gezeigt wird der Dialog, sobald die Memberfunktion show() angewendet wird.

Java AWT: FileDialog

Zur Auswahl von Dateien bietet inzwischen jede GUI eine Auswahlbox an. Unter Java ist diese über die Klasse FileDialog erreichbar. Die Verwendung ist recht einfach.

FileDialog filedia = new FileDialog(MainFrame, "Öffnen"); filedia.setFile("*.java"); filedia.show(); String filename = filedia.getFile(); if (filename != null) { // Datei eroeffnen und so weiter } filedia.dispose();

Zunächst wird eine Instanz erzeugt. Mit setFile kann eine Namensmaske vorgegeben werden. Mit show wird der Dialog angezeigt und vom Anwender bearbeitet. Danach kann mit getFile der gewählte Dateiname ausgelesen werden. Zu guter Letzt wird der Dialog per dispose wieder freigegeben.

Member Aufgabe
setFile(String) Vorgabe einer Namensmaske
String getFile() Auslesen des Dateinamens
show() Starten des modalen Dialogs

Layout

Ein Layout legt fest, in welcher Anordnung Kontrollelemente in ihre Container gesetzt werden.

Ein Layout wird mit der Funktion setLayout dem Container zugeordnet. Die Kontrollelemente werden dann per add-Funktion in das Layout gesteckt.

FlowLayout

Diese einfache Anordnung ist auch der Standard. Es werden alle Elemente von links nach rechts bis zum rechten Rand aufgefüllt und dann wird quasi zeilenweise nach unten gegangen.

GridLayout

Das Grid legt ein Gitter an. Im Konstruktor wird die Zahl der Zeilen und der Spalten festgelegt. Durch Hinzufügen (add) werden die Elemente der Reihenfolge nach ins Grid gelegt.

BorderLayout

Wie der Name schon vermuten läßt wird ein Rand um ein zentrales Element gelegt. Man hat dann eine Kopfzeile, eine Fußzeile, einen linken und einen rechten Rand. Benannt werden sie allerdings "North", "South", "West" und "East". Der Raum in der Mitte wird als "Center" bezeichnet.

Die add-Funktion erhält einen Parameter zu Anfang mehr. Es ist ein String, der festlegt, in welchen Bereich das Element gelegt werden soll.

GridBagLayout

Hier können auch Constraints festgelegt werden. Also Regeln, die festlegen, welches Element sich bei der Vergrösserung wie verhält.

Ereignisse

Die Ereignisse sollen hier am Beispiel der Maus behandelt werden.

import java.awt.event.*; public class MausEvent extends Applet implements MouseListener { int x, y; public void init() { this.addMouseListener(this); } // die Mitglieder der MouseListener-Schnittstelle public void mouseClicked(MouseEvent me) { x = me.getX(); y = me.getY(); } public void mouseReleased(MouseEvent me) { } public void mousePressed(MouseEvent me) { } public void mouseEntered(MouseEvent me) { } public void mouseExited(MouseEvent me) { } }

In der init-Funktion wird der MouseListener auf diese Klasse "scharfgemacht" (this.add ...) und die Behandlung auf die eigene Klasse gelenkt (..Listener(this)). Die eigene Klasse wird zwar von Applet abgeleitet, implementiert aber die Schnittstelle (interface) des MouseListener. Das bedeutet, daß jede Funktion implementiert werden muß, selbst wenn sie nicht im Programm benötigt wird.

Beispielprogramm

Das Beispielprogramm erscheint als eigenständige Applikation mit einem "handelsüblichen" Menü, das allerdings nur den Menüpunkt Datei - Ende kennt.

Die Ereignislogik hat sich von Java 1.0 nach 1.1 verändert. Wie im restlichen Text ist hier die Variante für 1.1 verwendet.

Unter dem Namen MiniMenu.java die erste Datei:

import java.awt.*; public class MiniMenu extends Object { public static void main(String[] args) { Frame myFrame = new Frame("Erstes Frame"); MenuBar myMenuBar = new MenuBar(); myFrame.setMenuBar(myMenuBar); Menu fileMenu = new Menu("Datei"); myMenuBar.add(fileMenu); MenuItem EndeItem = new MenuItem("Ende"); HndlMenu MenuHandler = new HndlMenu(EndeItem); EndeItem.addActionListener(MenuHandler); fileMenu.add(EndeItem); myFrame.resize(300, 200); myFrame.show(); } }

MiniMenu erweitert Object, nicht Applet! Der Start liegt damit nicht in der Funktion init, sondern main. Es wird ein Frame angelegt, der einen Menübaum zugeordnet bekommt. Im Gegensatz zu Windows oder MacOS verwendet AWT das direkte Aufbauen von Menüs wie man es von den Widget-Sets von X-Window kennt.

Bevor das EndeItem dem Baum hinzugefügt wird, wird der Eventhandler, hier HndlMenu angebunden. Durch resize und vor allem show erscheint das Programm mit dem Menübaum auf dem Bildschirm.

Der Eventhandler unter der Datei HndlMenu.java:

import java.awt.*; import java.awt.event.*; public class HndlMenu implements ActionListener { MenuItem thisItem; HndlMenu(MenuItem callItem) { thisItem = callItem; } // hier wird auf das Ereignis reagiert public void actionPerformed(ActionEvent evnt) { if (thisItem.getLabel()=="Ende") { System.exit(0); } } }

Über den Konstruktor wird das Element notiert, das den Eventhandler benutzt. Bei Eintreffen des Events wird die Funktion actionPerformed gerufen. Hier wird dann durch Aufruf von System.exit die Anwendung geschlossen.

Bermuda: ein Beispiel-Applet in Java

Die Aufgabenstellung

Bermuda ist ein kleines Spiel, das mit einer einfachen Textoberfläche in einem Applet realisiert werden kann und damit ideal zur Demonstration verwendbar ist.

In einem Feld von 9x7 Punkten sind Schiffe verschwunden, die durch Anticken der Positionen gesucht werden können. Nach Anklicken zeigt die Position ein X, wenn ein Schiff gefunden wurde oder eine Zahl, die Auskunft gibt, in wieviele Richtungen (!) Schiffe gesehen werden. Ein Schiff kann also durch ein davor liegendes verdeckt werden.

Das Auffinden aller Schiffe soll erkannt und dem Anwender angezeigt werden. Er soll die Möglichkeit haben, das Spiel neu zu starten.

Das Spiel als Applet

Spielen Sie: es sollte funktionieren, wenn Ihr Browser Java unterstützt.

Literatur

Schulz, Paul: Java 1.1: schnell und sicher zum Ziel. Markt & Technik, 1997.
Diehl, Stephan: Java & Co. Addison Wesley, 1997.


[back to top]



Userdaten
User nicht eingeloggt

Gesamtranking
Werbung
Datenbankstand
Autoren:04508
Artikel:00815
Glossar:04116
News:13565
Userbeiträge:16552
Queueeinträge:06246
News Umfrage
Ihre Anforderungen an ein Online-Zeiterfassungs-Produkt?
Mobile Nutzung möglich (Ipone, Android)
Externe API Schnittstelle/Plugins dritter
Zeiterfassung meiner Mitarbeiter
Exportieren in CSV/XLS
Siehe Kommentar



[Results] | [Archiv] Votes: 1154
Comments: 0