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

15.4 Klonen von Objekten

15.4 Cloning objects (EN google-translate)

15.4 Klonowanie obiektów (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.

A non-empty constructor creates an object with the passed parameters. Sometimes it is useful to have an exact copy of an already existing object to be able to produce. Tha around an object of the same type, but also the object attributes resemble the template.

Niepusty konstruktor tworzy obiekt o podanych parametrach. Czasami dobrze jest mieć dokładną kopię już istniejącego obiektu aby móc produkować. ż wokół obiektu tego samego typu, ale także atrybuty obiektu przypominają szablon.

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.

For the raster layout program, a selection mechanism should now be provided, which allows to go through the possible components and their four possible rotations and select a copy to put it on the grid.

W przypadku programu rastrowego należy teraz wprowadzić mechanizm selekcji, która pozwala przejść przez możliwe komponenty i ich cztery możliwe obroty i wybierz kopię, aby umieścić ją na siatce.

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.

This process can be elegantly realized by cloning. The important attribute cloned here is the rotation (0, 90, 180 or 270 degrees) of the component object.

Ten proces może być elegancko zrealizowany przez klonowanie. Ważnym atrybutem sklonowanym tutaj jest obrót (0, 90, 180 lub 270 stopni) obiektu składowego.

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 15.4-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 15.4-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 15.4-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.

Behind the scenes, a second ArrayList is created, in which each one Component four times, i. in the four possible rotation settings, is store

Za kulisami tworzona jest druga ArrayList, w której każda z nich Komponent cztery razy, i. w czterech możliwych ustawieniach obrotu jest przechowywan

Ü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.

By pressing the escape key you can now select which component from this List in an extra area in the window window is just visible. This is stored by the object attribute CURRENT_SELECT.

Naciskając klawisz Escape, możesz teraz wybrać komponent z tego Lista w dodatkowym obszarze w oknie jest widoczna. Jest to przechowywane przez atrybut obiektu CURRENT_SELECT.

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.

Pressing the ENTER key will then create a clone of the current selection. This is initially positioned at the bottom right of the grid layout and can then be moved on the layout using the arrow keys. The clone is also inserted in the ArrayList components. Thus the last created new item will always be the last one in the ArrayList components.

Naciśnięcie klawisza ENTER utworzy klon bieżącego zaznaczenia. Jest on początkowo umieszczony w prawym dolnym rogu układu siatki i można następnie przenieść na układ za pomocą klawiszy strzałek. Klon jest również wstawiany do komponentów ArrayList. Tak je ostatni utworzony nowy element zawsze będzie ostatnim elementem ArrayList.

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.

Reacting to the keyboard is done using an inner class of grid layout with the Name key exchangers realized. Key exchanger implements the interfa KeyListener. An object of key exchangers is displayed at the window with addKeyListener (. registered. If the window is in focus, then it will be at ea Pressing a key on the keyboard, the method keyPressed (..) in Keys exchanger object called. Here are about if branch implements the reactions described above.

Reagowanie na klawiaturę odbywa się za pomocą wewnętrznej klasy układu siatki z Wymienione kluczowe wymienniki kluczy. Wymiennik kluczy implementuje interfe KeyListener. Obiekt kluczowych wymienników jest wyświetlany w oknie z addKeyListener (. zarejestrowany. Jeśli okno jest ostre, to będzie przy każd Naciśnięcie klawisza na klawiaturze, key methodPressed (..) in Wymieniono obiekt wymiennika kluczy. Oto około, czy gałęz realizuje opisane powyżej reakcje.

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 15.4-4: Quelltext von Rasterlayout.java

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

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