kramann.info
© Guido Kramann

Login: Passwort:










kramann.info
© Guido Kramann

Login: Passwort:




Die Verwendung von Packages und das Laden und Darstellen von Bildern

(EN google-translate)

(PL google-translate)

rl001_fenster.zip - Erste Entwicklungsstufe zu Rasterlayout.

Statt das Raster (Dreierketten) für das Layout automatisch zu zeichnen, wird ein mit LibreOffice Draw erzeugtes Bild mit dem Raster als Hintergrund für die darauf mit paint(..) eingezeichneten Bauteile verwendet.

In einer ersten Programmversion soll ein Fenster mit einer Canvas erzeugt werden, in der dieses Hintergrundbild dargestellt wird.

Der Vorteil dieser Technik ist, dass nicht implementierte Elemente mit LibreOffice Draw vorher oder nach Erstellung des Layouts ergänzt werden können. So kann das Programm sehr schnell produktiv eingesetzt werden.

Verwendetes Hintergrundbild mit den Dreierketten-Lochraster und einem bereits eingezeichneten Mikrocontroller.

Bild 0-1: Verwendetes Hintergrundbild mit den Dreierketten-Lochraster und einem bereits eingezeichneten Mikrocontroller.

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

import hilfsklassen.Bilder;

public class Rasterlayout extends Canvas
{
     private Image rasterbild = null;

     public Rasterlayout()
     {
         rasterbild = Bilder.holeBild("raster.png");

         JFrame frame = new JFrame();
         frame.setBounds(10,10,900,700);
         frame.getContentPane().add(this);
         frame.setVisible(true);          
     }

     public void paint(Graphics g)
     {         
         ....
     }

     public static void main(String[] args)
     {
         Rasterlayout rasterlayout = new Rasterlayout();
     }
}

Code 0-1: Rasterlayout.java - Hauptprogramm des Layout-Programms.

Obiger Quelltext stellt das Hauptprogramm dar. Es erbt von Canvas und implementiert deshalb die Methode paint(..). Deren Inhalt ist hier zunächst nicht dargestellt. Das Programm weist gegenüber früheren Beispielen folgende Besonderheiten auf:

  • Es wird eine Klasse aus einem selber erstellten Package importiert. Das Package ist mit "hilfsklassen" benannt. Die importierte Klasse heißt "Bilder".
  • Die Klasse Bilder besitzt eine statische Methode holeBild(..), die es erlaubt eine Bilddatei als Image-Objekt zu erhalten.
UML-Diagramm der Klasse Bilder.

Bild 0-2: UML-Diagramm der Klasse Bilder.

Die Klasse Bilder besitzt nur eine einzige Methode. Diese ist statisch und kann deshalb ohne Erzeugen eines Objektes direkt über Angabe des Klassennamens benutzt werden. Dass sie statisch ist, ist in Java durch das Schlüsselwort "static" festgelegt und in UML durch einen Unterstrich.

package hilfsklassen;

import java.awt.Image;
import java.net.URI;
import java.net.URL;
import java.io.File;
import javax.swing.ImageIcon;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;


public class Bilder
{
    public static Image holeBild(String name)
    {
        try
        {
//Aktueller Pfad (Punkt .) ist der, von dem das Programm gestartet wird:
            File datei = new File("./bilder/"+name);
            Image bild = ImageIO.read(datei);
            return bild;
        }
        catch(Exception e)
        {
            return null;
        }
    }   
}

Code 0-2: Quelltext Bilder.java

Am Quelltext von Bilder ist zu sehen, dass über das Schlüsselwort package vermerkt ist, zu welchem Paket (package) die Klasse gehört. Äußerlich ist dies dadurch festgelegt, dass die Klasse in dem Unterordner "hilfsklassen" liegt:

Die Methode holeBild(..) verwendet ihrerseits komfortable Bibliotheksfunktionen: Der Konstruktor File(String) erlaubt es ein eine Datei repräsentierendes Objekt durch Übergabe des Pfades zu erzeugen. Der gerade aktuelle Pfad ist dabei immer derjenige, in dem die Hauptklasse liegt, also hier auf der Ebene von Rasterlayout. Die statische Methode read(..) in der Klasse ImageIO erlaubt es durch Übergabe eines File-Objekts ein ein Bild repräsentierendes Objekt vom Typ Image zu erhalten.

Verzeichnisstruktur zu obigem Programm: Im Ordner hilfsklassen liegt die Klasse Bilder, in bilder liegt raster.png.

Bild 0-3: Verzeichnisstruktur zu obigem Programm: Im Ordner hilfsklassen liegt die Klasse Bilder, in bilder liegt raster.png.

In der Methode paint(..) in Rasterlayout kann nun das geladene Bildobjekt einfach durch Aufruf der Methode drawImage(..) des Objekts g vom Typ Graphics dargestellt werden.

Um auch Koordinatentransformationen der zu zeichnenden Elemente zu ermöglichen, wird aus dem in paint(..) verfügbaren Graphics-Objekt g durch eine Cast-Operation (Neuer Klassenname in runden klammern vor das Objekt gestellt), ein Graphics2D-Objekt erzeugt werden, das Graphics beerbt, jedoch einige weitere Methoden bereitstellt. Unter anderem translate(..) und rotate(..) mit denen alles was danach dargestellt wird um die übergebenen Parameter transformiert (verdreht bzw. verschoben) dargestellt wird.

     public void paint(Graphics g)
     {         
         if(rasterbild!=null)
         {
             g.drawImage(rasterbild,0,0,Color.WHITE,this); 
         }

         Graphics2D g2d = (Graphics2D)g;

         g2d.setStroke(new BasicStroke(
                                       5.0f,                  // Liniendicke
                                       BasicStroke.CAP_ROUND, // Form des Linienendes
                                       BasicStroke.JOIN_ROUND // Verbindung von Polygonlinien
                                      )   
                      ); 
         g2d.setColor(Color.GREEN);

//Transformieren
         g2d.translate(200,400);      
         g2d.rotate(1.0);   

         g2d.drawRect(0,0,200,100);

//Letzte Transformation rückgängig machen!
         g2d.rotate(-1.0);   
         g2d.translate(-200,-400);      


         g2d.translate(400,100);      
         g2d.setColor(new Color(0,0,100));
         g2d.setFont(new Font("Arial",Font.BOLD,50));

         g2d.rotate(-Math.PI*0.5);   
         g2d.drawString("huhu",0,0);

         g2d.rotate(-Math.PI*0.5);   
         g2d.drawString("huhu",0,0);

         g2d.rotate(-Math.PI*0.5);   
         g2d.drawString("huhu",0,0);

         g2d.rotate(-Math.PI*0.5);   
         g2d.drawString("huhu",0,0);

     }

Code 0-3: Methode paint(..) in der Klasse Rasterlayout.

Um die Möglichkeiten von Graphics2D aufzuzeigen, werden hier das Bild raster.png dargestellt und darüber einige grafische Elemente gezeichnet. Unter anderem werden Stiftdicke, Liniendarstellung, Font der Schrift eingestellt.


Kompilieren von hilfsklassen/Bilder.java: Man geht in das Verzeichnis von Rasterlayout und gibt ein: Javac hilfsklassen/Bilder.java


Entstehende Darstellung bei Start von Rasterlayout.

Bild 0-4: Entstehende Darstellung bei Start von Rasterlayout.