Programmieren in Java: Aufbau


Kapitel 6: Systemzugriff


Inhaltsverzeichnis

Dieses Buch ist unter einer Creative Commons-Lizenz lizensiert.


6.1 Allgemeines

Applets in der Sandbox

Der Zugriff auf das Computer-System ist für Applet-Programmierer nur sehr eingeschränkt möglich. Sun hat Java so konzipiert, dass Java-Applets in einer Sandbox laufen, die mehr oder weniger hermetisch vom physikalischen Computer-System abgeschirmt ist. Das Java-Applet kennt nur die Sandbox - Zugriffe auf das System sind grundsätzlich verboten. Das heißt, dass Sie als Applet-Programmierer beispielsweise grundsätzlich keinen Zugriff auf das Dateisystem oder auf andere Anwendungen haben.

Der Grund für diesen restriktiven Zugriff ist klar: Wer möchte schon ein Java-Applet aus dem Internet ausführen, wenn dieses Zugriff auf sämtliche Teile des Computers hätte? Durch die hohen Zugriffsbeschränkungen erfüllt Sun lediglich die Anforderungen der Anwender, die ohne Vertrauen in Java-Applets diese kaum ausführen würden und somit auch kaum zum Erfolg von Java beigetragen hätten.

Dennoch: Die Sandbox bietet Schnittstellen zum Computer-System an. Sie greifen hierbei nicht direkt auf den Computer zu, sondern Java bietet Ihnen innerhalb der Sandbox einen kontrollierten Zugriff an. Sicherheit wird groß geschrieben.

Auf was Sie genau von einem Java-Applet aus auf Informationen im Computer-System zugreifen können, erfahren Sie in diesem Kapitel. Selbstverständlich stehen die in diesem Kapitel vorgestellten Möglichkeiten auch für Programmierer von Java-Applications zur Verfügung. Dort gibt es jedoch viel umfassendere Möglichkeiten für einen Systemzugriff, da Applications nicht den rigorosen Sicherheitsbestimmungen von Applets unterworfen sind.


6.2 Systemfarben

Einheitliche Farbgestaltung

Wenn Sie in Java mit Hilfe der AWT-Klassen grafische Benutzerschnittstellen entwickeln, passt Java die Anzeige der Schaltflächen an die Betriebssystemumgebung an. Das heißt, eine Java-Eingabeschaltfläche sieht, wenn das Applet unter Microsoft Windows läuft, genauso aus wie jede andere Eingabeschaltfläche unter diesem Betriebssystem auch. Läuft das gleiche Java-Applet jedoch auf einem Apple Macintosh, so sieht die Eingabeschaltfläche eben typisch Mac aus.

Moderne Betriebssysteme ermöglichen eine benutzerdefinierte Farbgestaltung von Fenstern, Menüs, Hintergründen und so weiter. Jeder Anwender kann sich so seinen persönlichen Desktop zusammenstellen in den Farben, die ihm am besten gefallen. Wäre es nicht schön, wenn sich das Java-Applet in seiner farblichen Gestaltung an die Einstellungen im Betriebssystem anpassen würde? Während Java die formale Gestaltung von Schaltflächen an das Betriebssystem anpasst, geschieht dies nicht automatisch bei den Farben.

Die Klasse java.awt.SystemColor ist der Schlüssel. Die Anwendung der Klasse ist extrem einfach: java.awt.SystemColor besteht fast ausschließlich aus öffentlichen statischen Eigenschaften. Das heißt, Sie müssen kein Objekt von dieser Klasse erstellen, und Sie müssen keine Methoden-Schnittstellen erlernen. Sie brauchen lediglich einen Überblick über die Eigenschaften von java.awt.SystemColor, den Sie im Folgenden bekommen.

  • java.awt.SystemColor.desktop enthält die Hintergrundfarbe des Desktops.

  • java.awt.SystemColor.activeCaption speichert die Hintergrundfarbe der Titelleiste selektierter Fenster.

  • java.awt.SystemColor.activeCaptionText ermöglicht den Zugriff auf die Schriftfarbe für die Titelleiste selektierter Fenster.

  • java.awt.SystemColor.activeCaptionBorder bietet die Rahmenfarbe der Titelleiste selektierter Fenster an.

  • java.awt.SystemColor.inactiveCaption gibt die Hintergrundfarbe der Titelleiste nicht-selektierter Fenster an.

  • java.awt.SystemColor.inactiveCaptionText bietet Zugriff auf die Schriftfarbe der Titelleiste nicht-selektierter Fenster.

  • java.awt.SystemColor.inactiveCaptionBorder enthält die Rahmenfarbe der Titelleiste nicht-selektierter Fenster.

  • java.awt.SystemColor.window speichert die Hintergrundfarbe von Fenstern.

  • java.awt.SystemColor.windowBorder gibt die Farbe für Fensterrahmen an.

  • java.awt.SystemColor.windowText enthält die Textfarbe im Fenster.

  • java.awt.SystemColor.menu bietet Zugriff auf die Hintergrundfarbe von Menüs.

  • java.awt.SystemColor.menuText gibt die Textfarbe in Menüs an.

  • java.awt.SystemColor.text speichert die Hintergrundfarbe für Textfelder.

  • java.awt.SystemColor.textText enthält die Textfarbe für Textfelder.

  • java.awt.SystemColor.textHighlight bietet die Hintergrundfarbe für hervorgehobenen Text an.

  • java.awt.SystemColor.textHighlightText gibt die Textfarbe für hervorgehobenen Text an.

  • java.awt.SystemColor.textInactiveText speichert die Textfarbe für inaktiven Text.

  • java.awt.SystemColor.control enthält die Hintergrundfarbe für Dialogelemente.

  • java.awt.SystemColor.controlText speichert die Textfarbe für Dialogelemente.

  • java.awt.SystemColor.controlHighlight gibt die Farbe für hervorgehobene Dialogelemente an.

  • java.awt.SystemColor.controlLtHighlight enthält die helle Farbe für hervorgehobene Dialogelemente.

  • java.awt.SystemColor.controlShadow speichert die Farbe für den Schatten von Dialogelementen.

  • java.awt.SystemColor.controlDkShadow enthält die dunklere Farbe für den Schatten von Dialogelementen.

  • java.awt.SystemColor.scrollbar gibt die Hintergrundfarbe für Schieberegler an.

  • java.awt.SystemColor.info speichert die Hintergrundfarbe für Hilfetext.

  • java.awt.SystemColor.infoText enthält die Textfarbe für Hilfetext.

In den oben genannten statischen Eigenschaften befinden sich jeweils die Farbwerte, die momentan im Betriebssystem eingestellt sind. Sie nutzen diese Werte, indem Sie sie als Parameter an Methoden wie setBackground(), setForeground() oder setColor() übergeben. Die Klasse java.awt.SystemColor ist von java.awt.Color abgeleitet, so dass Sie sie auch überall dort einsetzen können, wo als Parameter java.awt.Color erwartet wird.

Im folgenden kleinen Beispiel wird im Java-Applet ein neues Fenster mit einem eigenen Menü geöffnet, dessen Farben sich teilweise an den aktuellen Einstellungen im Betriebssystem orientieren.

import java.applet.*; 
import java.awt.*; 
import java.awt.event.*; 

public class MyApplet extends Applet implements ActionListener, WindowListener 
{ 
  Frame Window; 

  public void init() 
  { 
    Window = new Frame(); 
    Window.setLayout(new FlowLayout()); 
    Window.setBackground(SystemColor.desktop); 
    MenuItem ItemExit = new MenuItem("Beenden"); 
    ItemExit.addActionListener(this); 
    Menu MenuApplet = new Menu("Applet"); 
    MenuApplet.add(ItemExit); 
    MenuBar Bar = new MenuBar(); 
    Bar.add(MenuApplet); 
    Window.setMenuBar(Bar); 
    Button ButtonExit = new Button("Beenden"); 
    ButtonExit.addActionListener(this); 
    ButtonExit.setForeground(SystemColor.controlText); 
    ButtonExit.setBackground(SystemColor.control); 
    Window.add(ButtonExit); 
    Window.addWindowListener(this); 
    Window.setSize(400, 300); 
    Window.setVisible(true); 
  } 

  public void actionPerformed(ActionEvent ev) 
  { 
    Window.setVisible(false); 
    Window.dispose(); 
  } 

  public void windowClosing(WindowEvent ev) 
  { 
    Window.setVisible(false); 
    Window.dispose(); 
  } 

  public void windowActivated(WindowEvent ev) { } 
  public void windowClosed(WindowEvent ev) { } 
  public void windowDeactivated(WindowEvent ev) { } 
  public void windowDeiconified(WindowEvent ev) { } 
  public void windowIconified(WindowEvent ev) { } 
  public void windowOpened(WindowEvent ev) { } 
} 

Das Beispiel-Applet öffnet ein neues Java-Fenster und fügt diesem eine Menü-Leiste hinzu sowie eine anklickbare Schaltfläche, über die man beide das Java-Fenster jederzeit schließen kann. Die Klasse java.awt.SystemColor wird dreimal im Code verwendet: Die Hintergrundfarbe des Java-Fensters wird auf die aktuelle Hintergrundfarbe des Desktops gesetzt. Außerdem wird die Text- und Hintergrundfarbe für die anklickbare Schaltfläche auf die Farben gesetzt, die momentan im Betriebssystem eingestellt sind. Über weitere Aufrufe von Methoden, um Farben zu setzen, ließe sich ein Applet sehr gut in die aktuellen Farbeinstellungen eines Systems einbetten.


6.3 Toolkit

Verbindung zur Außenwelt

Das Toolkit ist die Verbindung zwischen dem Java-System und dem Betriebssystem. Das Toolkit wird hauptsächlich vom Java-System selber benötigt, um Aufgaben mit Hilfe von Betriebssystemfunktionen ausführen zu können. Dennoch steht das Toolkit als eine eigene Klasse auch dem Java-Applet-Programmierer zur Verfügung. Die Klasse java.awt.Toolkit bietet Methoden an, die oft direkt auf Betriebssystemfunktionen zugreifen und somit Möglichkeiten eröffnen, für die das Java-System selber zu beschränkt ist.

Sie erstellen niemals selber ein Objekt der Klasse java.awt.Toolkit, sondern lassen sich stattdessen über den Aufruf der Methode getToolkit(), die in der Klasse java.applet.Applet definiert ist, das aktuelle Toolkit zurückgeben. Über dieses können Sie dann mehr oder weniger direkt auf Funktionen des Betriebssystems zugreifen. Die Klasse java.awt.Toolkit ist abstrakt, so dass Sie sowieso keine eigenen Objekte dieses Typs erstellen können.

Im Folgenden sehen Sie eine Reihe interessanter Methoden, die von der Klasse java.awt.Toolkit angeboten werden.

  • beep() löst einen kurzen Ton aus.

  • getFontList() gibt die vom Java-System unterstützten Schriftarten zurück.

  • getFontMetrics() gibt genaue Informationen zu Größenangaben einer Schriftart zurück.

  • getScreenResolution() gibt die Bildschirmauflösung in der Einheit Pixel pro Zoll zurück.

  • getScreenSize() gibt die Bildschirmgröße in Pixel zurück.

Das folgende Beispiel-Programm läßt bei einem Mausklick auf eine Schaltfläche einen kurzen Piepser aus dem Lautsprecher ertönen.

import java.applet.*; 
import java.awt.*; 
import java.awt.event.*; 

public class MyApplet extends Applet implements ActionListener 
{ 
  public void init() 
  { 
    Button Beep = new Button("Beep"); 
    Beep.addActionListener(this); 
    add(Beep); 
  } 

  public void actionPerformed(ActionEvent ev) 
  { 
    Toolkit Tk = getToolkit(); 
    Tk.beep(); 
  } 
} 

Sie sehen, dass Sie die Methode getToolkit() direkt innerhalb des Java-Applets aufrufen können, weil diese Methode durch Vererbung aus der Klasse java.applet.Applet zur Verfügung steht. Über die Referenzvariable vom Typ java.awt.Toolkit können Sie dann genauso einfach wie beep() auch die anderen oben vorgestellten Methoden aufrufen.


6.4 Systemeigenschaften

Umgebungsvariablen abfragen

Die Klasse java.lang.System macht es möglich, sogenannte Umgebungsvariablen eines Java-Programms abzufragen. Umgebungsvariablen sind Variablen, die Informationen zum umgebenden Computer-System enthalten. So können Sie beispielsweise überprüfen, unter welchem Betriebssystem das Java-Applet gerade ausgeführt wird oder welche Java-Version die momentan ausführende Java-VM unterstützt.

Sie erstellen niemals ein Objekt vom Typ java.lang.System, sondern greifen über eine statische Methode direkt auf die gewünschten Umgebungsvariablen zu. Folgende zwei statische Methoden sind am interessantesten.

  • getProperty() übergeben Sie genau einen Parameter vom Typ java.lang.String. Dieser Parameter gibt die Umgebungsvariable an, deren Wert Sie abfragen möchten. Die Methode gibt den Wert der Umgebungsvariable als java.lang.String zurück. Wird die angegebene Umgebungsvariable nicht gefunden, wird null zurückgegeben.

  • getProperty() ist überladen. Sie können dieser Methode auch zwei Parameter vom Typ java.lang.String übergeben. Der erste Parameter gibt die Umgebungsvariable an, deren Wert Sie abfragen möchten. Der zweite Parameter ist der Rückgabewert dieser Methode, wenn die angegebene Umgebungsvariable nicht gefunden wird.

Um Umgebungsvariablen abzufragen, rufen Sie eine der zwei Versionen von getProperty() auf. Mögliche Umgebungsvariablen, die Sie abfragen können, finden Sie in folgender Auflistung.

  • java.version gibt die Java-Versionsnummer zurück.

  • java.vendor gibt eine herstellerspezifische Zeichenkette zurück.

  • java.vendor.url gibt eine WWW-Adresse zum Hersteller der Java-VM zurück.

  • java.home gibt das Intallationsverzeichnis zurück.

  • java.class.version gibt die Versionsnummer der Java-Klassenbibliothek zurück.

  • java.class.path gibt den Klassenpfad zurück.

  • os.name gibt den Namen des Betriebssystems zurück.

  • os.arch gibt die Betriebssystem-Architektur zurück.

  • os.version gibt die Versionsnummer des Betriebssystems zurück.

  • file.separator gibt das Trennzeichen für Pfadangaben zurück.

  • path.separator gibt das Trennzeichen für die Laufwerksangabe eines Pfadnamens zurück.

  • line.separator gibt die Zeichenkette für einen Zeilenvorsprung zurück.

  • user.name gibt den Namen des angemeldeten Anwenders zurück.

  • user.home gibt das Home-Verzeichnis zurück.

  • user.dir gibt das aktuelle Arbeitsverzeichnis zurück.

Es ist vom Java-System abhängig, ob eine Umgebungsvariable zur Verfügung steht oder nicht. Sie müssen immer davon ausgehen, dass eine Umgebungsvariable eventuell nicht existiert. Genausogut kann es auch sein, dass zusätzliche Umgebungsvariablen existieren, die Ihnen Zugriff auf weitere Systemeigenschaften bieten.

Im Folgenden sehen Sie eine kleine Beispiel-Anwendung, die Betriebssystemnamen und -version inklusive Rechnerarchitektur ausgibt.

import java.applet.*; 
import java.awt.*; 

public class MyApplet extends Applet 
{ 
  public void paint(Graphics g) 
  { 
    g.drawString("Betriebssystem: " + System.getProperty("os.name", "unbekannt"), 5, 15); 
    g.drawString("Architektur: " + System.getProperty("os.arch", "unbekannt"), 5, 25); 
    g.drawString("Betriebssystemversion: " + System.getProperty("os.version", "unbekannt"), 5, 35); 
  } 
} 

Sie sehen, dass sich der Zugriff auf Umgebungsvariablen sehr einfach gestaltet.