MezData-Logo Lösungen Button :JAVA: Hello World mit BlueJ

Beispiele mit BlueJ 1.3.0 und Mac OS 10.2.8

  1. Erstellen eines neuen Projekts
  2. Achtung Klassen!
  3. Hello Word auf Konsole
  4. Manuell Klassen erzeugen und inspizieren
  5. Auf zum GUI!
  6. Application (Frame) oder Applet?
  7. Hello World in Frame (AWT)
  8. Hello World in Applet (AWT)
  9. Hybrid-Anwendung (Application und Applet in einem)(AWT)
  10. Hello World in Frame (Swing)
  11. Hello World in Applet (Swing)
  12. Hybrid-Anwendung (Swing)

1. Erstellen eines neuen Projekts

BlueJ starten. Unter "Project" -> "New Project..." auswählen.

Es erscheint ein Verzeichnis-Dialog:

Zum gewünschen Verzeichnis navitieren, ggfs. einen neuen Ordner erstellen..
Wichtig: BlueJ erstellt einen neuen Ordner, der den Namen des Projekts trägt!

Hier heist das Projekt "HelloKons", der erzeugte Ordner sieht nun so aus:

bluej.pkg ist die Projektdatei

README.TXT soll Information über das Projekt beinhalten.

2. Achtung Klassen!

Bevor es richtig los geht, noch ein paar Hinweise zu Namens- und Datei-Konventionen:

  1. Klassen immer mit grossen Anfangsbuchstaben.
  2. Konstanten (final) immer mit GROSSBUCHSTABEN
  3. Variablen und Attribute fangen klein an
  4. Bezeichner aus mehreren Wörtern werden so geschrieben meineVariable, MeineKlasse, MEINE_KONSTANTE
  5. Methoden fangen mit einem Verb im Bezeichner an: zeichneBlase(), getFarbe()
  6. Pro Datei nur maximal eine "public" Klasse, die Datei erhält den Namen der "public" Klasse, daher auf Konventionen für Dateinamen achten!
  7. Kommentarblöcke, die mit /** eingeleitet werden erscheinen später auch in der mit "Javadoc" erzeugten Dokumentation.
  8. Formatierung des Quelltextes mit zwei Leerzeichen, kein Tabulator

Vorweg etwas OOP-Chinesisch (steht schon hier damit ihr es auch findet und nicht wieder überlest)

3. Hello Word auf Konsole

Erstelle ein Projekt "HelloKons", soweit noch nicht geschehen.

Alle Programme in Java sind Klassen-Objekte, also erst mal eine "New Class" erstellen (auf New Class klicken).

Die neue Klasse soll "KonsClass" heißen. BlueJ erzeugt damit eine Quell-Datei "KonsClass.java".

Auf OK klicken.

Hier ist nun die neue Klasse->

Schraffiert bedeutet, daß sie noch nicht compiliert wurde, d.h. daß noch keine Datei KonsClass.class erzeugt wurde.

Nun die Klasse editieren: Mit Doppelklick auf die Klasse im Editor öffnen, den Quelltext abändern (einfach hier kopieren und im Editor einfügen):

/**
 * @author Oliver Mezger 
 * @version 18.10.03
 */
public class KonsClass{
  private int x;                              // interne Variable der Klasse

  public KonsClass(){                         // Konstruktor der Klasse
    System.out.println("KonsClass konstruieren");
    x = 0;
  }
  public void setX(int y){                    // Methode zum Setzen von x
    System.out.println("setX");
    x = y;
  }
  public int getX(){                          // Methode um den Wert von x auszulesen
    System.out.println("getX");
    return x;
  }
  public static void main(String[] args){     // Startfunktion 
    System.out.println("main aufgerufen!");
	   KonsClass kc = new KonsClass();         // Objekt erzeugen
	   System.out.println("KonsClass Objekt erzeugt!");
	   System.out.println(kc.getX());
	   kc.setX(4711);                          // die interne Variable auf 4711 setzen
	   System.out.println(kc.getX());
	   System.out.println("main am Ende!");
  }    
}

Download BlueJ-Projekt: HelloKons.zip

Auf "Compile" klicken, die Schraffur verschwindet. Nun mit rechter Maustaste auf die Klasse klicken und "void main(args)" auswählen:

Es wird nun gefragt, mit welchen Argumenten die main-Methode aufgerufen werden soll.

Einfach "OK" klicken!

In einem Terminalfenster erscheinen nun die Ausgaben...
main aufgerufen!
KonsClass konstruieren
KonsClass Objekt erzeugt!
getX
0
setX
getX
4711
main am Ende!

Warum ist main "static"?

Es handelt sich hier um ein "Henne-Ei-Problem" wäre main nicht static gäbe es diese Methode erst wenn eine Instanz erzeugt worden wäre.
Nun wird aber in main gerade erst eine Instanz mit "new KonsClass()" erzeugt. Der Ausweg ist der Modifizierer "static", damit ist main auch ohne Instanz vorhanden. Man nennt solche Attribute und Methoden Klassen-Attribute und Klassen-Methoden.
Ohne "static" sind die Attribute und Methoden erst in einer Instanz existent und heisen daher Instanz-Attribute bzw. Instanz-Methoden.

4. Manuell Klassen erzeugen und inspizieren

In BlueJ können Objekte von Klassen auch manuell erzeugt werden, mit der rechten Maustaste auf die Klasse klicken und "new KonsClass()" auswählen:

Ein "Objekt konsClas1" vom Typ "KonsClass" wurde erzeugt.

Mit der rechten Maustaste auf dieses Objekt klicken und "Inspect" auswählen:

Die Methode "int getX()" aufrufen.

Die Methode "void setX(y)" aufrufen und den Wert 1234 übergeben.

"Inspect" aufrufen.

Mit "Remove" die Klasse wieder entfernen.

5. Auf zum GUI!

Konsole ist ja nett, aber wir wollen Graphik und Buttons, also ein GUI (Graphical User Interface)! Es gibt nun zwei Möglichkeiten - AWT oder Swing?

AWT (Abstract Window Toolkit)

Diese Klassen stellen Buttons und Co unter Zuhilfenahme der jeweiligen Plattform-Komponenten des Betriebssystems dar (Peer-Ansatz). Damit sieht ein Button unter Windows wie ein Windows-Button und unter Mac wie Mac-Button aus. Damit beschränkt sich die AWT auf diejenigen GUI-Komponenten, die von allen unterstützen Betriebssystemen dargestellt werden können.
Vorteil für uns: Keine grossen Probleme mit alten IE auf Windows (man kann den Opa auch mit Orginal-Sun-JavaVM-Plugin nachrüsten) und ist etwas einfacher..

Swing

Die Swing-Komponenten sind vollständig in Java implementiert und vom jeweiligen Betriebssystem unabhängig (lightweight). Auf allen Rechnern ergibt sich dadurch ein einheitliches Aussehen. SwingKlassen sind am 'J' erkennbar: JApplet, JFrame, JButton usw..

6. Application (Frame) oder Applet?

Eine Application ist eine vollständige Anwendung mit allen Rechten und Möglichkeiten. Ein Applet ist als ein in den Browser ladbares Miniprogramm gedacht das dort in einer sicheren Umgebung (Sand-Box) läuft (soll nicht auf lokale Dateien des Rechners zugreifen können). Ein Applet kann allerdings auch in einem Applet-Viewer gestartet werden, und hat dann praktisch alle Rechte einer Application.

Es gibt die Möglichkeit, Hybrid-Applets zu schreiben, die auch ohne Applet-Viewer als Application gestartet werden können.

7. Hello World in Frame (AWT)

Bisher haben sich die Ausgaben der Klasse auf das Terminalfenster (Konsole) beschränkt. Nun soll eine Klasse "FrameClass" erzeugt werden,
die über in eigenes Fenster (Frame) verfügt.

Erzeuge ein neues Projekt "HelloFrame" mit der Klasse "FrameClass":

/* @author Oliver Mezger 
 * @version 12.11.03
 */
import java.awt.*; // die nötigen Komponenten müssen importiert werden
import java.awt.event.*;

public class FrameClass extends Frame{               // unsere FrameClass erweitert Frame (Vererbung)
 
  public FrameClass(String title){                   // Konstruktor der Klasse
	    super (title);                                  // den Konstruktor der Elternklasse Frame aufrufen
     System.out.println("Konstruktor aufgerufen!");
	    add ("North", new Button ("Hello World Button"));
	    setSize (250,150);                              // die Grösse des Frames setzen
	    setVisible(true);                               // der Frame soll sichtbar sein
     addWindowListener(new WindowAdapter(){          // Objekt soll beendet werden können
       public void windowClosing(WindowEvent e) {
         System.exit(0);
       }
     }); 
  }
  public void paint(Graphics g){ // diese Methode wird immer aufgerufen wenn gezeichnet werden soll
    g.setColor(Color.yellow);
    g.fillRect(20, 70, 200, 50);
    g.setColor(Color.black);
    g.drawString("Sample AWT-Frame", 50, 100);
  }
  public static void main(String[] args){            // Startfunktion 
	    System.out.println("main aufgerufen!");
	    new FrameClass("Banane");                       // Objekt erzeugen
	    System.out.println("FrameClass Objekt erzeugt!");
	    System.out.println("main am Ende!");
  }    
}

Download BlueJ-Projekt: HelloFrame.zip

Das Programm erzeugt das Frame mit dem Titel "Banane" und eine Ausgabe auf dem Terminalfenster:

main aufgerufen!
Konstruktor aufgerufen!
FrameClass Objekt erzeugt!
main am Ende!

Man beachte, daß main beendet ist und das Frame weiter besteht!

8. Hello World in Applet (AWT)

Neues Projekt "HelloApplet" erzeugen.

Eine Appletklasse namens "ApplClass" erzeugen:

BlueJ erzeugt schon eine Menge Beispiel-Quelltext.
Compilieren, dann mit rechter Maustaste auf "ApplClass" klicken und "Run Applet" auswählen:

Das Applet kann im Applet-Viewer oder auf eine Web-Seite betrachtet werden.

Hier nun die Beschreibung der wesentlichen Komponenten, Kommentare von BlueJ wurden entfernt:

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

public class ApplClass extends Applet{
  private int x;

  public void init(){}
  public void start(){}

  public void paint(Graphics g){
    g.setColor(Color.white);
    g.fillRect(0, 0, 200, 100);
    g.setColor(Color.black);
    g.drawString("Sample Applet", 20, 20);
    g.setColor(Color.blue);
    g.drawString("created by BlueJ", 20, 40);
  }

  public void stop(){}
  public void destroy(){}

  public String getAppletInfo(){
    return "Title: BlueJ Applet Demo\n" + "Author: Bruce Quig\n" +
      "A simple applet that draws two strings.";
  }

  public String[][] getParameterInfo(){
    String paramInfo[][] = {
      {"firstParameter", "1-10", "description of first parameter"},
      {"secondParameter", "boolean", "description of second parameter"}
    };
    return paramInfo;
  }
}

Download BlueJ-Projekt: HelloApplet.zip

public void init () {....} wird nur dann aufgerufen, wenn der Browser zum ersten Mal die Appletklasse lädt.
public void start () {....} wird nach der init-Methode aufgerufen, wenn das Applet sichtbar wird.
public void stop () {....} wird aufgerufen, wenn sich das Applet nicht mehr auf dem Bildschirm befindet.
public void destroy () {....} wird dann aufgerufen, wenn das Applet nicht mehr benötigt wird. Dies geschieht normalerweise beim Verlassen der HTML-Seite, spätetens jedoch beim Verlassen des Browsers.
public void paint (Graphics g) {....} wird aufgerufen, wenn das Appletzeichengebiet neu dargestellt werden muss. Dies ist der Fall beim ersten Start des Applets, beim Verschieben des Browser-Fensters, bzw. wenn das Applet vom Hintergrund in den Vordergrund gebracht wird. Die paint-Methode hat als Parameter ein Grafikobjekt (Klasse Graphics). Daher muss vorher das entsprechende Package (java.awt.Graphics) importiert werden.
public void update () {....} wird als erstes aufgerufen, wenn der Bildschirm neu aufzubauen ist. Diese Methode löscht das Gebiet des Applets und ruft die paint-Methode auf.

Einbindung eines Applets in HTML (Achtung alt, in XHTML sollte das via Object Tag geschehen)

Eine HTML-Seite ist ein Text, der mit sogenannten Tags versehen wird. Diese werden in spitze Klammern gesetzt und von den Browsern entsprechend interpretiert. Jeder Tag muss geöffnet und mit der gleichen Bezeichnung mit Schrägstrich (Slash) wieder geschlossen werden. Es ergibt sich folgender Aufbau:

<html>
  <head>
    <title>Fensterüberschrift</title>
  </head>
  <body>
    Hier steht nun der Inhalt der Seite.
    Einbau des Applets
    <applet CODEBASE="Verzeichnisname des Applets" CODE="Name des Applets.class" width=300 height=300>
    </applet>
  </body>
</html>

Befinden sich die HTML-Seite und das Applet im gleichen Verzeichnis, so kann CODEBASE entfallen. Mit width und height wird die Größe des Fensters, in dem das Applet dargestellt wird, festgelegt.

9. Hybrid-Anwendung (Application und Applet in einem)(AWT)

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

public class ApplClass extends Applet{
 
  public ApplClass(){  // Konstruktor
      
  }

  public void paint(Graphics g){
    g.setColor(Color.white);
    g.fillRect(0, 0, 200, 100);
    g.setColor(Color.black);
    g.drawString("Sample Applet", 20, 20);
    g.setColor(Color.blue);
    g.drawString("created by OLLY", 20, 40);
  }

  public static void main(String[]args){ 
    Frame f = new Frame("Testi");
    f.add(new ApplClass());
    f.setSize(200,200);
    f.setVisible(true);
    f.addWindowListener(new WindowAdapter(){
      public void windowClosing(WindowEvent e) {
        System.exit(0);
      }
    });
  }   
}

ApplClass.jar kann auch als Application ausgeführt werden. Wer will kann es "unZippen" und die Dateien anschauen...

Einbindung als Applet

<applet archive="ApplClass.jar" code="ApplClass.class" width="300" height="200"></applet>

10. Hello World in Frame (Swing)

Swing funktioniert deutlch anders als AWT, da hier gemalt werden soll, ist es notwendig ein JPanel in das JFrame einzubauen (auf JFrame soll nicht gezeichnet werden).

/* @author Oliver Mezger 
 * @version 12.11.03
 */

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class SwingFrame extends JPanel {          // die Zeichenflaeche als Traeger der Komponenten ein JPanel
  
  public static void main(String[] args){         // Startfunktion 
	   System.out.println("main aufgerufen!");
	   JFrame frame = new JFrame("Banane");          // Objekt erzeugen
	   System.out.println("JFrame Objekt erzeugt!");
	   frame.getContentPane().add(new SwingFrame()); // das JPanel im JFrame hinzufuegen, fuellt den sichtbaren Bereich voll aus
	   frame.setSize(250,150);                       // Groesse des JFrame setzen
	   frame.setVisible(true);
	   frame.addWindowListener(new WindowAdapter(){  // Objekt soll beendet werden können
       public void windowClosing(WindowEvent e) {
         System.exit(0);
       }
    }); 
	   System.out.println("main am Ende!");
  } 
  public SwingFrame(){                            // Konstruktor der Klasse (JPanel Kind)
    System.out.println("Konstruktor aufgerufen!");
	   add ("North", new JButton ("Hello World Button")); // einen JButton zum JPanel hinzufuegen  
  }
  public void paintComponent(Graphics g){ // diese Methode wird immer aufgerufen wenn gezeichnet werden soll
    g.setColor(Color.yellow);
    g.fillRect(20, 70, 200, 50);
    g.setColor(Color.black);
    g.drawString("Sample Swing-Frame", 50, 100);
  }
}

Download BlueJ-Projekt: HelloSwingFrame.zip

Eine weitere Betrachtung von Swing erscheint mir momentan nicht sinnvoll, da zunächst nur die Komplexität des Quelltextes zunimmt ohne direkten Nutzen für die Applikation.

 

 

Hello World in Applet (Swing)

Hybrid-Anwendung (Swing)