kramann.info
© Guido Kramann

Login: Passwort:










Informatik3
1 Vom_struct_zur_Klasse
..1.1 Vom_struct_zur_Klasse
..1.2 struct_Programm
..1.3 Klassen_Programm
..1.4 Offene_Fragen
..1.5 Historie
..1.6 Objektabstraktion
..1.7 OO_Kundenverwaltung
..1.8 Objektfaehigkeiten
..1.9 Formatierung
..1.10 Motivation
..1.11 Uebung1
..1.12 Uebung2
2 UML
..2.1 Volumenberechnung
..2.2 UML_Klassendiagramm
..2.3 Konstruktor
..2.4 Statische_Variable
3 Strings
..3.1 Klassenbibliotheken
..3.2 stringUML
..3.3 Uebung3
4 Initialisierungen
4 bluej
5 Zeiger_und_Arrays
..5.1 Zeiger
..5.2 Zeiger_und_Funktion
..5.3 Uebung4
6 Vererbung
..6.1 MesswerteUML
..6.2 MesswerteProgramm
..6.3 VererbungsProgramm
..6.4 Vector
..6.5 Uebung
7 Modifikatoren
..7.1 public_Vererbung
..7.2 protected_Vererbung
8 Listen_und_Templates
..8.1 Containertypen
....8.1.1 ListeUML
....8.1.2 ListeProgramm
..8.2 Templates
....8.2.1 Listentemplate
....8.2.2 STLvectorTemplate
..8.3 Uebung5
..8.4 Uebung6
..8.5 Uebung7
9 Java
..9.1 Uebung
..9.2 GettingStarted
..9.3 Animation
..9.4 Hybrid
..9.5 Threads
10 Delegation
11 LayoutProjekt
12 Fenster
13 Uebung
14 Zwischenprojekt
..14.1 Befehle
..14.2 Planung
..14.3 JNI
..14.4 JNIumsetzen
..14.5 Anwendungsklasse
..14.6 GUI01
..14.7 GUI02
15 Rasterlayout
..15.1 Bilder_Packages
..15.2 interfaces
..15.3 ArrayList
..15.4 clone
..15.5 Uebung
16 Nuetzliches
..16.1 Threads
..16.2 Animation
..16.3 RungeKutta
..16.4 Loesungsansatz
..16.5 Internetprogrammierung
....16.5.1 Codegenerierung
....16.5.2 PHP_Programmierung
....16.5.3 PHP_OOP
....16.5.4 Java
17 Algorithmen
..17.1 RungeKutta
..17.2 Loesungsansatz
..17.3 Evoopt
..17.4 Uebung12
..17.5 Uebung8_2014
..17.6 Ausdruecke
18 Uebung10
19 UML_ALT
..19.1 Flaechenberechnung
..19.2 UML_Flaechenberechnung
..19.3 Implementierung
..19.4 ListeUML
..19.5 ListenImplementierung
..19.6 Anwendung
kramann.info
© Guido Kramann

Login: Passwort:




Klonen von Objekten

(EN google-translate)

(PL google-translate)

rl005_clone.zip - Fünfte Entwicklungsstufe zu Rasterlayout (hier nicht dargestellter Zwischenstand).
rl006_clone_verbessert.zip - Sechste Entwicklungsstufe zu Rasterlayout (hier nicht dargestellter Zwischenstand).
rl007_bauteil_chooser.zip - Siebte Entwicklungsstufe zu Rasterlayout (weiter unten dargestellt).

Ein nicht leerer Konstruktor erzeugt ein Objekt mit den übergebenen Parametern. Manchmal ist es nützlich, eine genaue Kopie eines bereits existierenden Objektes herstellen zu können. D.h. bei dem Klon handelt es sich nicht nur um ein Objekt gleichen Typs, sondern auch die Objektattribute gleichen der Vorlage.

Für das Rasterlayout-Programm soll nun ein Auswahlmechanismus bereitgestellt werden, der es erlaubt die möglichen Bauteile und deren vier mögliche Rotationen durchzugehen und ein Exemplar auszuwählen, um es auf das Raster zu bringen.

Dieser Vorgang kann elegant durch Klonen realisiert werden. Das wichtige Attribut, der hier mit geklont wird, ist die Rotation (0, 90, 180 oder 270 Grad) des Bauteil-Objektes.

package bauteile;

import java.awt.Graphics2D;

public interface BauteilInterface
{
    public abstract void zeichnen(Graphics2D g2d);
    public abstract void setRotation(int rotation);
    public abstract void setTranslation(int xpos, int ypos);
    public abstract void setBeschriftung(String beschriftung);
    public abstract BauteilInterface clone();

    public abstract int getX();
    public abstract int getY();
    public abstract int getRotation();
}

Code 0-1: BauteilInterface - Vereinbarung der Methode clone() u.a.

package bauteile;

import java.awt.Graphics2D;
import java.awt.Color;

import konstanten.Style;

public abstract class Bauteil implements BauteilInterface
{
    protected String beschriftung = "";
    protected int xpos=0,ypos=0,rotation=0;

    //wird erst in den erbenden Klassen implementiert:
    public abstract void zeichnen(Graphics2D g2d); 
    public abstract Bauteil clone(); 

    protected void copyParameter(Bauteil bauteil)
    {
        bauteil.setBeschriftung(this.beschriftung);
        bauteil.setRotation(this.rotation);
        bauteil.setTranslation(this.xpos, this.ypos);        
    }

    public int getX()
    {
        return xpos;
    }
    public int getY()
    {
        return ypos;
    }
    public int getRotation()
    {
        return rotation;
    }    

    ....
    ....
    ....
}

Code 0-2: Bauteil - Implementierung der Hilfsmethoden getX(), getY(), getRotation() und copyParameter(Bauteil bauteil), die für clone benötigt werden.

package bauteile;

import java.awt.Graphics2D;
import java.awt.Color;
import java.awt.BasicStroke;

import konstanten.Style;



public class Widerstand extends Bauteil implements BauteilInterface
{
    public Widerstand clone()
    {
        Widerstand neu = new Widerstand();
        copyParameter(neu);
        return neu;
    }

    public void zeichnen(Graphics2D g2d)
    {
        ....
        ....
        ....
    }
}

Code 0-3: Widerstand - Implementierung der clone()-Methode.

Hinter den Kulissen wird eine zweite ArrayList angelegt, in der jedes Bauteil viermal, d.h. in den vier möglichen Rotationseinstellungen, abgelegt wird.

Über das Drücken der Escapetaste soll nun wählbar sein, welches Bauteil aus dieser Liste in einem Extrabereich im Fenster Fenster gerade zu sehen ist. Dies wird durch das Objekt-Attribut AKTUELLE_AUSWAHL gespeichert.

Beim Drücken der ENTER-Taste wird dann ein Klon der aktuellen Auswahl erstellt. Dieser wird zunächst unten rechts auf dem Rasterlayout positioniert und kann dann mit Hilfe der Pfeiltasten auf dem Layout verschoben werden. Der Klon wird auch in der ArrayList bauteile eingefügt. Somit ist das zuletzt erstellte neue Element immer das letzte in der ArrayList bauteile.

Das Reagieren auf die Tastatur wird über eine innere Klasse von Rasterlayout mit dem Namen TastenLauscher realisiert. TastenLauscher implementiert die Schnittstelle KeyListener. Ein Objekt von TastenLauscher wird beim Fenster mit addKeyListener(..) registriert. Wenn das Fenster im Fokus ist, wird deshalb dann bei jedem Betätigen einer Taste auf der Tastatur die Methode keyPressed(..) im TastenLauscher-Objekt aufgerufen. Hierin sind über if-Verzweigungen die Reaktionen implementiert, die weiter oben beschrieben wurden.

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

import hilfsklassen.Bilder;

import bauteile.*;
import konstanten.Style;

public class Rasterlayout extends Canvas
{
     private int AKTUELLE_AUSWAHL = 0;

     private Image rasterbild = null;

     private Widerstand r1,r2,r3;
     private Bruecke b1,b2;

     private ArrayList<BauteilInterface> bauteile = new ArrayList<BauteilInterface>();

     private ArrayList<BauteilInterface> auswahl = new ArrayList<BauteilInterface>();

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

         JFrame frame = new JFrame();

         frame.addKeyListener(new TastenLauscher());

         frame.setBounds(10,10,900,700);
         frame.getContentPane().add(this);
         frame.setVisible(true); 

         auswahl.add(new Widerstand());
         auswahl.add(new Widerstand());
         auswahl.add(new Widerstand());
         auswahl.add(new Widerstand());

         auswahl.add(new Bruecke());
         auswahl.add(new Bruecke());
         auswahl.add(new Bruecke());
         auswahl.add(new Bruecke());

         for(int i=0;i<4;i++)
         {
             auswahl.get(i+0).setTranslation(Style.XRASTER_AUSWAHLBEREICH,
                                             Style.YRASTER_AUSWAHLBEREICH);         
             auswahl.get(i+4).setTranslation(Style.XRASTER_AUSWAHLBEREICH,
                                             Style.YRASTER_AUSWAHLBEREICH);         
             auswahl.get(i+0).setRotation(i); 
             auswahl.get(i+4).setRotation(i); 
         }




         bauteile.add(new Widerstand());
         bauteile.add(new Widerstand());
         bauteile.add(new Widerstand());

         bauteile.add(new Bruecke());
         bauteile.add(new Bruecke());

         bauteile.get(0).setTranslation(8,1);         
         bauteile.get(0).setRotation(0); 

//Hierzu muss Interface geändert werden !!!:        
         bauteile.get(0).setBeschriftung("100");

         bauteile.get(1).setTranslation(16,1);         
         bauteile.get(1).setRotation(0);         

         bauteile.get(2).setTranslation(16,1);         
         bauteile.get(2).setRotation(1);         
         bauteile.get(2).setBeschriftung("2k2");

         bauteile.get(3).setTranslation(0,0);         
         bauteile.get(3).setRotation(0);         

         bauteile.get(4).setTranslation(0,0);         
         bauteile.get(4).setRotation(1);         

         bauteile.add(bauteile.get(4).clone());
         bauteile.get(5).setTranslation(2,0);
     }

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

         Graphics2D g2d = (Graphics2D)g;

         for(int i=0;i<bauteile.size();i++)
                 bauteile.get(i).zeichnen(g2d);

         //Aktuell ausgewaehltes Bauteil anzeigen:
         auswahl.get(AKTUELLE_AUSWAHL).zeichnen(g2d);
     }

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

    //Auf Sondertasten reagieren über KeyListener
    private class TastenLauscher implements KeyListener
    {
        public void keyPressed(KeyEvent e) 
        {
            int c = e.getKeyCode();

            if(c == KeyEvent.VK_ESCAPE  )
            {
                System.out.println("Taste ESC gedrueckt.");
                AKTUELLE_AUSWAHL++;
                AKTUELLE_AUSWAHL%=auswahl.size();
                repaint();
            }

            if(c == KeyEvent.VK_ENTER   )
            {
                bauteile.add(auswahl.get(AKTUELLE_AUSWAHL).clone());
                bauteile.get(bauteile.size()-1).setTranslation(Style.XRASTER_ZIELBEREICH,
                                                               Style.YRASTER_ZIELBEREICH);
                repaint();
            } 

            if(c == KeyEvent.VK_RIGHT   )
            {
                int x = 1  +  bauteile.get(bauteile.size()-1).getX();
                int y = 0  +  bauteile.get(bauteile.size()-1).getY();
                bauteile.get(bauteile.size()-1).setTranslation(x,y);
                repaint();
            } 
            if(c == KeyEvent.VK_LEFT   )
            {
                int x = -1  +  bauteile.get(bauteile.size()-1).getX();
                int y = 0  +  bauteile.get(bauteile.size()-1).getY();
                bauteile.get(bauteile.size()-1).setTranslation(x,y);
                repaint();
            } 
            if(c == KeyEvent.VK_UP   )
            {
                int x = 0  +  bauteile.get(bauteile.size()-1).getX();
                int y = -1  +  bauteile.get(bauteile.size()-1).getY();
                bauteile.get(bauteile.size()-1).setTranslation(x,y);
                repaint();
            } 
            if(c == KeyEvent.VK_DOWN   )
            {
                int x = 0  +  bauteile.get(bauteile.size()-1).getX();
                int y = 1  +  bauteile.get(bauteile.size()-1).getY();
                bauteile.get(bauteile.size()-1).setTranslation(x,y);
                repaint();
            } 
        }
        public void keyReleased(KeyEvent e)
        {
        }
        public void keyTyped(KeyEvent e) 
        {
        }
    }
}

Code 0-4: Quelltext von Rasterlayout.java

Darstellung nach Start des Programms und Einfügen einiger Widerstände und Drahtbrücken.

Bild 0-1: Darstellung nach Start des Programms und Einfügen einiger Widerstände und Drahtbrücken.