Klassen implementieren

Diskutiere Klassen implementieren im Java Basics - Anfänger-Themen Bereich.
E

Erazo

Hallo Java-forum!
Ich sitze grade an einer Aufgabe in der ich Klassen implementieren soll die auf anderen Klassen "aufsitzen". Ich vermutemal damit ist gemeint dass ich die Klassen die bei der Aufgabe mitgeliefert wurden iwie als Basis implementieren soll. Ich wollte anfangen mit der Klasse sheep und stoße bereits auf 2 Probleme
Hoffe ihr könnt mir hier auf die Sprünge helfen
Java:
import java.awt.color.*;

public class Sheep {
   
    // attributes
   private int xpos;
   private int ypos;
   private colour Colour;

   //methods
   public void draw() {
}

}
erstens erkennt er den Datentyp "colour" nicht auch nachdem ich java.awt.color importiert habe und zweitens weiß ich nicht wie ich die Klasse Ellipse in den Attributen der Klasse Sheep einbaue


hier die Klasse Ellipse:
Java:
import java.awt.*;
import java.awt.geom.*;
import java.util.*;

import javax.swing.*;

/**
* Class represents and draws ellipses in a window. The half axes of the
* ellipses run parallel to the cartesian coordinate system underlying the
* window, whose origin is positioned in its upper left corner.
*
* The ellipse's position denotes the upper left corner of the (virtual)
* rectangle which circumscribes the ellipse.
*
*/
class Ellipse {
    /** Length of horizontal axis */
    int horizontalLength;

    /** Length of vertical axis */
    int verticalLength;

    /**
     * The x- and y-coordinates describing the ellipse's position, denoting the
     * top left corner of its surrounding rectangle.
     */
    int xPos, yPos;

    /**
     * The ellipse's colour. Available colours are enumerated in Type Colour.
     */
    Colour colour;

    /**
     * Creates the ellipse, initializes all its attributes and draws it.
     *
     * @param h
     *            Horizontal Length
     * @param v
     *            Vertical Length
     * @param x
     *            x-coordinate
     * @param y
     *            y-coordinate
     * @param initialColour
     *            Initial color
     */
    Ellipse(int h, int v, int x, int y, Colour initialColour) {
        horizontalLength = h;
        verticalLength = v;
        xPos = x;
        yPos = y;
        colour = initialColour;
    }

    /**
     * Sets the ellipse's color to a new value and redraws the ellipse.
     *
     * @param newColour
     */
    void setColour(Colour newColour) {
        colour = newColour;
    }

    /**
     * Reset horizontalLength to a new value.
     *
     * @param h
     *            New horizontal length.
     */
    void setHorizontalLength(int h) {
        horizontalLength = h;
    }

    /**
     * Reset verticalLength to a new value.
     *
     * @param v
     *            New vertical length.
     */
    void setVerticalLength(int v) {
        verticalLength = v;
    }

    /**
     * Erases existing ellipse. Moves the ellipse by resetting its coordinates.
     * Redraws moved ellipse.
     *
     * @param xDelta
     *            Denotes horizontal movement
     * @param yDelta
     *            Denotes vertical movement
     */
    void move(int xDelta, int yDelta) {
        xPos = xPos + xDelta;
        yPos = yPos + yDelta;
    }

    // /////////////////////////////////////////////////////////////////
    // Alles was ab hier kommt wurde in der Vorlesung nicht besprochen
    // /////////////////////////////////////////////////////////////////

    void draw() {
        Canvas canvas = Canvas.getCanvas();
        canvas.draw(this, colour, new Ellipse2D.Double(xPos, yPos,
                horizontalLength, verticalLength));
        canvas.wait(0);
    }

    void erase() {
        Canvas canvas = Canvas.getCanvas();
        canvas.erase(this);
    }

    private static class Canvas {
        // Note: The implementation of this class (specifically the handling of
        // shape identity and colors) is slightly more complex than necessary.
        // This
        // is done on purpose to keep the interface and instance fields of the
        // shape objects in this project clean and simple for educational
        // purposes.

        private static Canvas canvasSingleton;

        /**
         * Factory method to get the canvas singleton object.
         */
        public static Canvas getCanvas() {
            if (canvasSingleton == null) {
                canvasSingleton = new Canvas("Shawna das Schaf", 500, 300,
                        Color.white);
            }
            canvasSingleton.setVisible(true);
            return canvasSingleton;
        }

        // ----- instance part -----

        private JFrame frame;
        private CanvasPane canvas;
        private Graphics2D graphic;
        private Color backgroundColor;
        private Image canvasImage;
        private java.util.List<Object> objects;
        private HashMap<Object, ShapeDescription> shapes;

        /**
         * Create a Canvas.
         *
         * @param title
         *            title to appear in Canvas Frame
         * @param width
         *            the desired width for the canvas
         * @param height
         *            the desired height for the canvas
         * @param bgColor
         *            the desired background color of the canvas
         */
        private Canvas(String title, int width, int height, Color bgColor) {
            frame = new JFrame();
            canvas = new CanvasPane();
            frame.setContentPane(canvas);
            frame.setTitle(title);
            frame.setLocation(30, 30);
            canvas.setPreferredSize(new Dimension(width, height));
            backgroundColor = bgColor;
            frame.pack();
            objects = new ArrayList<Object>();
            shapes = new HashMap<Object, ShapeDescription>();
        }

        /**
         * Set the canvas visibility and brings canvas to the front of screen
         * when made visible. This method can also be used to bring an already
         * visible canvas to the front of other windows.
         *
         * @param visible
         *            boolean value representing the desired visibility of the
         *            canvas (true or false)
         */
        public void setVisible(boolean visible) {
            if (graphic == null) {
                // first time: instantiate the offscreen image and fill it with
                // the background color
                Dimension size = canvas.getSize();
                canvasImage = canvas.createImage(size.width, size.height);
                graphic = (Graphics2D) canvasImage.getGraphics();
                graphic.setColor(backgroundColor);
                graphic.fillRect(0, 0, size.width, size.height);
                graphic.setColor(Color.black);
            }
            frame.setVisible(visible);
        }

        /**
         * Draw a given shape onto the canvas.
         *
         * @param referenceObject
         *            an object to define identity for this shape
         * @param color
         *            the color of the shape
         * @param shape
         *            the shape object to be drawn on the canvas
         */
        // Note: this is a slightly backwards way of maintaining the shape
        // objects. It is carefully designed to keep the visible shape
        // interfaces
        // in this project clean and simple for educational purposes.
        public void draw(Object referenceObject, Colour colour, Shape shape) {
            objects.remove(referenceObject); // just in case it was already
                                                // there
            objects.add(referenceObject); // add at the end
            shapes.put(referenceObject, new ShapeDescription(shape, colour));
            redraw();
        }

        /**
         * Erase a given shape's from the screen.
         *
         * @param referenceObject
         *            the shape object to be erased
         */
        public void erase(Object referenceObject) {
            objects.remove(referenceObject); // just in case it was already
                                                // there
            shapes.remove(referenceObject);
            redraw();
        }

        /**
         * Set the foreground color of the Canvas.
         *
         * @param newColor
         *            the new color for the foreground of the Canvas
         */
        public void setForegroundColor(Colour colorString) {
            switch (colorString) {
            case WHITE:
                graphic.setColor(Color.white);
                break;
            case YELLOW:
                graphic.setColor(new Color(255, 230, 0));
                break;
            case GREEN:
                graphic.setColor(new Color(80, 160, 60));
                break;
            case BLUE:
                graphic.setColor(new Color(30, 75, 220));
                break;
            case MAGENTA:
                graphic.setColor(Color.magenta);
                break;
            case RED:
                graphic.setColor(new Color(235, 25, 25));
                break;
            case BLACK:
                graphic.setColor(Color.black);
                break;
            default:
                graphic.setColor(Color.black);
            }
        }

        /**
         * Wait for a specified number of milliseconds before finishing. This
         * provides an easy way to specify a small delay which can be used when
         * producing animations.
         *
         * @param milliseconds
         *            the number
         */
        public void wait(int milliseconds) {
            try {
                Thread.sleep(milliseconds);
            } catch (Exception e) {
                // ignoring exception at the moment
            }
        }

        /**
         * Redraw ell shapes currently on the Canvas.
         */
        private void redraw() {
            erase();
            for (Object shape : objects) {
                shapes.get(shape).draw(graphic);
            }
            canvas.repaint();
        }

        /**
         * Erase the whole canvas. (Does not repaint.)
         */
        private void erase() {
            Color original = graphic.getColor();
            graphic.setColor(backgroundColor);
            Dimension size = canvas.getSize();
            graphic.fill(new Rectangle(0, 0, size.width, size.height));
            graphic.setColor(original);
        }

        /************************************************************************
         * Inner class CanvasPane - the actual canvas component contained in the
         * Canvas frame. This is essentially a JPanel with added capability to
         * refresh the image drawn on it.
         */
        private class CanvasPane extends JPanel {
            private static final long serialVersionUID = 1L;

            public void paint(Graphics g) {
                g.drawImage(canvasImage, 0, 0, null);
            }
        }

        /************************************************************************
         * Inner class CanvasPane - the actual canvas component contained in the
         * Canvas frame. This is essentially a JPanel with added capability to
         * refresh the image drawn on it.
         */
        private class ShapeDescription {
            private Shape shape;
            private Colour colourString;

            public ShapeDescription(Shape shape, Colour colour) {
                this.shape = shape;
                colourString = colour;
            }

            public void draw(Graphics2D graphic) {
                setForegroundColor(colourString);
                graphic.fill(shape);
            }
        }

    }

}
auserdem mitgeleifert: colour.java und HelperClass.java
Java:
/**
 * Enumerates colour values that we allow in our circlesw.
 *
 * @author Veronika Thurner
 */

enum Colour {
    WHITE, YELLOW, GREEN, BLUE, MAGENTA, RED, BLACK;
}
Java:
/**
 * Contains helper methods such as wait.
 *
 * @author Veronika Thurner
 *
 */
class HelperClass {

    /**
     * Wait for a specified number of milliseconds before finishing. This
     * provides an easy way to specify a small delay which can be used when
     * producing animations.
     *
     * @param milliseconds
     *            the number
     */
    static void wait(int milliseconds) {
        try {
            Thread.sleep(milliseconds);
        } catch (Exception e) {
            // ignoring exception at the moment
        }
    }

}
 

Anhänge

Zuletzt bearbeitet:
H

httpdigest

Erstens werden in Java bzw. im JRE immer grundsätzlich alle Klassen groß geschrieben. Das heißt, die Klasse "colour" gibt es nicht. Wenn schon, würde sie "Colour" heißen. Diese gibt es aber auch nicht, da im JRE alle Klassen gemäß amerikanischer Schreibweise (also "Color") geschrieben werden.
Desweiteren macht dann aber auch der Import `import java.awt.colour.*;` keinen Sinn, da es das Package "java.awt.colour" nicht gibt. Du müsstest also schon `import java.awt.Color;` schreiben, wenn du die Klasse Color haben willst.
Siehe: https://docs.oracle.com/javase/8/docs/api/java/awt/Color.html
 
mihe7

mihe7

erstens erkennt er den Datentyp "colour" nicht
Der Datentyp heißt auch Colour und nicht colour und die Klasse hast Du bestimmt, wie Ellipse, mitgeliefert bekommen.

und zweitens weiß ich nicht wie ich die Klasse Ellipse in den Attributen der Klasse Sheep einbaue
Genauso wie alle anderen Variablen auch. Zum Beispiel:
Java:
private Ellipse ellipse;
Das ist aber nur die Variable - das Objekt musst Du schon noch erzeugen.
 
E

Erazo

Das Problem ist aber, dass der prof in der Aufgabe immer die schreibweise colour benutzt und es so auch in der mitgeleiferten Klasse Ellipse so verwendet hat
 
J

JustNobody

Zu 1. Die Klasse heisst Color und ist in java.awt, also entweder import auf java.awt.* oder eben direkt auf java.awt.Color - Aber nur, wenn Du die awt Klasse nutzen willst und nicht die Klasse Colour, die wohl bei Ellipse dabei ist!

@httpdigest: Die haben noch eine eigene Klasse Colour. Erkennt man etwas an der Methode setForegroundColor.

Zu 2. Du kannst die Klasse Ellipse nutzen wie jede andere Klasse: Also z.B. innerhalb Deines Codes mittels Ellipse meineEllipse = new Ellipse(...); wobei die ... durch notwendige Parameter ersetzt werden sollte ...
 
H

httpdigest

@httpdigest: Die haben noch eine eigene Klasse Colour. Erkennt man etwas an der Methode setForegroundColor.
An diesem Code hier:
Java:
public void setForegroundColor(Colour colorString) {
            switch (colorString) {
            case WHITE:
erkennt man eigentlich überhaupt nichts (außer, dass das nicht kompilieren wird). Man kann keinen Switch auf eine Instanz einer Klasse machen. Nur auf ganzzahltypen <= int und auf String. Was also bitte soll Colour sein??
 
E

Erazo

ja, die klasse Colour.java wurdemitgeliefert und ich hab sie auch in das paket importiert.
Java:
/**
* Enumerates colour values that we allow in our circlesw.
*
* 
*/

enum Colour {
    WHITE, YELLOW, GREEN, BLUE, MAGENTA, RED, BLACK;
}
 
J

JustNobody

An diesem Code hier:
Java:
public void setForegroundColor(Colour colorString) {
            switch (colorString) {
            case WHITE:
erkennt man eigentlich überhaupt nichts (außer, dass das nicht kompilieren wird). Man kann keinen Switch auf eine Instanz einer Klasse machen. Nur auf ganzzahltypen <= int und auf String. Was also bitte soll Colour sein??
Eine Enumeration natürlich. Denn eine Enumeration wird auch von switch unterstützt und man muss die Enumeration nicht selbst angeben beim case.

Aber Aufklären wird das wohl nur der TE können.

Und sorry, falls ich von Klasse gesprochen hatte...
 
E

Erazo

Zu 1. Die Klasse heisst Color und ist in java.awt, also entweder import auf java.awt.* oder eben direkt auf java.awt.Color - Aber nur, wenn Du die awt Klasse nutzen willst und nicht die Klasse Colour, die wohl bei Ellipse dabei ist!

@httpdigest: Die haben noch eine eigene Klasse Colour. Erkennt man etwas an der Methode setForegroundColor.

Zu 2. Du kannst die Klasse Ellipse nutzen wie jede andere Klasse: Also z.B. innerhalb Deines Codes mittels Ellipse meineEllipse = new Ellipse(...); wobei die ... durch notwendige Parameter ersetzt werden sollte ...
ich will ja noch kein objekt erzeugen sondern erstmal nur die Klasse definieren und dafür brauch ich laut UML klassendiagramm ein attribut body: Ellipse

Java:
public class Sheep {
 
 
    // attributes
   private int xpos;
   private int ypos;
   private Colour colour;
   private Ellipse ellipse;


   //methods
   public void draw() {
}


}
wenn ich das jetzt so habe, müsste ich ein neues objekt über
Java:
    Ellipse body = new Ellipse( 180, 120, 170, 100, Colour.RED);
erstellen können?
edit:Es funktioniert einwandfrei :D
 
Zuletzt bearbeitet:
E

Erazo

Java:
public class Shawna {
   
    public static void main(String[] args) {
        // TODO Auto-generated method stub
       
    Ellipse body = new Ellipse( 180, 120, 170, 100, Colour.RED);
       body.draw();
     
    Ellipse head = new Ellipse(80, 120, 110, 60, Colour.RED);
       head.draw();
     
   
   
       
    }

}
So funktioniert es jetzt aber da ich die Koordinaten der Teile mit Bezug auf andere Körperteile gegeben habe, dachte ich mir, dass ich das vielleicht auch bei mir intergrieren sollte. Wenn ich alles vom selben Rumpf aus bemessen würde könnte ich es ja einfach darüber Regeln dass ich als Eingabe immer die Differenz zum jeweiligen Teil definiere aber wie mache ich es wenn es jedes mal ein anderes Teil sein soll?
 
J

JustNobody

Erst einmal ein kleiner Hinweis nur um sicher zu gehen, dass es so gedacht war:


private Ellipse ellipse;
Das hat bei Dir eine Instanzvariable mit namen ellipse erzeugt, aber die hast Du bisher nirgends verwendet.

Code:
    Ellipse body = new Ellipse( 180, 120, 170, 100, Colour.RED);
    Ellipse head = new Ellipse(80, 120, 110, 60, Colour.RED);
Diese Zeilen haben jeweils eine lokale Variable erzeugt. Evtl. willst Du diese Ellipsen ja in der Instanz von Deinem Schaf haben?

Bezüglich
aber da ich die Koordinaten der Teile mit Bezug auf andere Körperteile gegeben habe
:
Dem kann ich nicht folgen. Du hast absolute Werte und die haben keinen Bezug zueinander.

Aber Du hast ja die Instanzvariablen
Code:
   private int xpos;
   private int ypos;
Evtl. kannst Du ja das mit einbauen? Wie kannst Du das denn bei Deinen konkreten Aufrufen verwenden?
 
E

Erazo

die Attribute sollten nicht ellipse heißen sondern 2 Attribute mit den namen tail und body mit dem Datentyp Ellipse sein(hab ich dementsprechend geändert)
Java:
   private int xpos;
   private int ypos;
   private Colour colour;
   private Ellipse body;
   private Ellipse tail;
Diese Zeilen haben jeweils eine lokale Variable erzeugt. Evtl. willst Du diese Ellipsen ja in der Instanz von Deinem Schaf haben?
Ich verstehe nicht ganz was damit gemeint ist. Ich will doch die Objekte Head und body erzeugen und dafür brauche ich doch 2 Variablen?

Evtl. kannst Du ja das mit einbauen? Wie kannst Du das denn bei Deinen konkreten Aufrufen verwenden?
ich dachte mir dass ich dann sowas wie xpos = x + xpos von Körperteil nutze aber wie sage ich dem Programm welchen Wert ich genau meine? Und wird das nicht ein Problem wenn ich das jeweilige Teil ändere und sich dann alles verschiebt?
 
mihe7

mihe7

sondern 2 Attribute mit den namen tail und body mit dem Datentyp Ellipse sein(hab ich dementsprechend geändert)
Nö, Du hast zwei lokale Variablen in main angelegt. Instanzvariablen werden außerhalb der Methode deklariert, so wie in Deinem Eingangsbeispiel.

ich dachte mir dass ich dann sowas wie xpos = x + xpos von Körperteil nutze aber wie sage ich dem Programm welchen Wert ich genau meine? Und wird das nicht ein Problem wenn ich das jeweilige Teil ändere und sich dann alles verschiebt?
Warum solltest Du ein einziges Teil ändern?
 
E

Erazo

Wenn ich zB sehe dass ein Teil falsche Werte hat will ich ja nicht dass sich dadurch dann alles verschiebt. Außerdem soll es ja quasi Gruppenweise gebaut werden. Kopf mit Augen und Ohren. Körper mit Schwanz und Beinen etc. Dafür muss ich dann ja eben die abhängkeit haben weil ich die absoluten werte der Teile nicht habe(siehe Aufgabe im Anhang)
 

Anhänge

J

JustNobody

Dein Schaf hat doch Koordinaten. Das ist also wie wenn Dir jemand einen Zettel gibt und dann auf einen Punkt zeigt und sagt: Da malst Du mir ein Schaf hin.

Wie malst Du jetzt das Schaf, damit es am angegebenen Punkt ist?
 
E

Erazo

mit
Java:
public class Shawna {
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
    Ellipse body = new Ellipse( 180, 120, 170, 100, Colour.RED);
       body.draw();
oder soll ich in der Klasse Sheep die objekte tail und body erzeugen und sie in Shawna dann nur noch durch draw zeichnen?
 
mihe7

mihe7

Deine Klasse vom Anfang war doch OK:
Java:
public class Sheep {
   
    // attributes
   private int xpos;
   private int ypos;
   private Colour colour;
   private Ellipse body;
   private Ellipse tail;

   //methods
   public void draw() {
   }
}
Was noch fehlt, wäre ein Konstruktor, der soll lt. UML-Diagramm die x- und y-Koordinate sowie eine Initialfarbe erhalten:
Java:
    public Sheep(int x, int y, Colour initialColour) {
        xpos = x;
        ypos = y;
        colour = initialColour;
        // hier noch die Objekte fuer body und tail
        //  erstellen, also etwas wie
        // body = new Ellipse(...)
        // tail = new Ellipse(...)
    }
und dann kümmerst Du Dich um die weiteren Attribute.
 
J

JustNobody

Wo berücksichtigst Du denn, wo das Schaf hin soll? Wenn Du fixe Werte einsetzt, dann landet das Schaf immer an der gleichen Stelle ....

Und ich dachte es geht schon um das Ausfüllen der Klasse Shawna - und nicht darum, jetzt irgendelche Ellipsen in main() zu malen ...
 
E

Erazo

Java:
public class Sheep {
    
    
    // attributes
   private int xpos;
   private int ypos;
   private Colour colour;
   private Ellipse body;
   private Ellipse tail;

   //methods
   public void draw() {
}
  
   public Sheep(int x, int y, Colour initialColour) {
       xpos = x;
       ypos = y;
       colour = initialColour;
       Ellipse body = new Ellipse( 180, 120, 170, 100, Colour.RED);
       Ellipse tail = new Ellipse( 20, 50, xpos+174, ypos+90, Colour.RED);
   }

      
}
würde das so dann funktionieren?
 
mihe7

mihe7

Wenn Du jetzt noch alle Koordinaten relativ zu x und y anpasst, dann ja. Da musst Du ggf. ein bisschen überlegen :)

EDIT: es kann auch sein, dass Du die Koordinaten relativ zu (0,0) rechnen musst und in draw() dann um x und y verschieben kannst. Das sehe ich aber hier nicht.
 
J

JustNobody

In dem Konstruktor erzeugst Du zwei lokale Variablen body und tail. Willst Du da nicht die Instanzvariablen nutzen?

Und der body ist immer an der gleichen Stelle, egal wo das Schaf hin gezeichnet werden soll?
 
E

Erazo

Java:
public class Sheep {
    
    
    // attributes
   private int xpos;
   private int ypos;
   private Colour colour;
   private Ellipse body;
   private Ellipse tail;

   //methods
   public void draw() {
}
  
   public Sheep(int x, int y, Colour initialColour) {
       xpos = x;
       ypos = y;
       colour = initialColour;
       Ellipse body = new Ellipse( 180, 120, xpos, ypos, Colour.RED);
       Ellipse tail = new Ellipse( 20, 50, xpos+174, ypos+90, Colour.RED);
   }

      
}
so?
 
J

JustNobody

Besser, aber wie kannst Du denn die Instanzvariablen body und tail nutzen und nicht zwei neue (lokale) Variablen erzeugen?
 
E

Erazo

Ok, jetzt bin ich verwirrt o_O
Ich definiere in der Klasse Sheep die Attribute und erstelle die Methode Sheep. Diese Methode soll mir doch jetzt den Körper und den Schwanz erstellen abhängig von den von mir gegebenem xpos und ypos
in der main methode rufe ich die dann später auf und er zeichnet mir dir beiden objekte.
Oder sehe ich das falsch?
 
mihe7

mihe7

Es geht darum, dass Du body und tail zweimal deklarierst: einmal als Instanzvariable und einmal als lokale Variable im Konstruktor.
Java:
   public Sheep(int x, int y, Colour initialColour) {
       xpos = x;
       ypos = y;
       colour = initialColour;
       // hier erzeugst Du zwei neue, lokale Variablen
       Ellipse body = new Ellipse( 180, 120, xpos, ypos, Colour.RED);
       Ellipse tail = new Ellipse( 20, 50, xpos+174, ypos+90, Colour.RED);
   }
Java:
   public Sheep(int x, int y, Colour initialColour) {
       xpos = x;
       ypos = y;
       colour = initialColour;
       // so verwendest Du die Variablen des Objekts (genau wie bei xpos, ypos, colour)
       body = new Ellipse( 180, 120, xpos, ypos, Colour.RED);
       tail = new Ellipse( 20, 50, xpos+174, ypos+90, Colour.RED);
   }
 
E

Erazo

ok, ich verstehe, danke. Somit wäre die Klasse ja fertig und ich muss sie nur noch in shawna.java in der main methode durch Sheep.draw(); zeichnen?
 
E

Erazo

die ist leer, aber in Ellipse.java vorhanden
Java:
    void draw() {
        Canvas canvas = Canvas.getCanvas();
        canvas.draw(this, colour, new Ellipse2D.Double(xPos, yPos,
                horizontalLength, verticalLength));
        canvas.wait(0);
    }
 
E

Erazo

Was könnte dann in Sheep#draw() stehen?
Also canvas scheint einfach das Zeichenbrett zu erstellen. mit .draw(this... erstellt er dann das was vor der draw methode steht?
Da wir hier Sheep zeichnen wollen würde ich dann statt "Ellipse" "Sheet" schreiben und dann horizontallenght und vertical length auch streichen?
 
mihe7

mihe7

Die Internas von Ellipse interessieren nicht.

Du hast die Klasse Ellipse mit einer draw-Methode. Du hast in Sheep mehrere Ellipse-Objekte. Was könnte also in der draw-Methode von sheep stehen?
 
E

Erazo

Java:
public class Sheep {
    
    
    // attributes
   private int xpos;
   private int ypos;
   private Colour colour;
   private Ellipse body;
   private Ellipse tail;

   //methods
   public void draw() {
       body.draw();
       tail.draw();

}
  
   public Sheep(int x, int y, Colour initialColour) {
       xpos = x;
       ypos = y;
       colour = initialColour;
      
       body = new Ellipse( 180, 120, xpos, ypos, Colour.RED);
       tail = new Ellipse( 20, 50, xpos+174, ypos+90, Colour.RED);
      
   }   
  
}
wenn ich jetzt in der main methode in shawna.java versuche Sheep.draw(); aufzurufen kommt folgende Meldung:
Cannot make a static reference to the non-static method draw() from the type Sheep
es wird Empfohlen die draw Methode zu static zu ändern. Wenn ich dies aber tue kommt dort wieder die Fehlermeldung. Wenn ich auch dort die Anweisung befolge und static davor setze bekomme ich folgende Ausgabe:

Exception in thread "main" java.lang.NullPointerException
at Sheep.draw(Sheep.java:13)
at Shawna.main(Shawna.java:8)
 
J

JustNobody

Die klasse ist auch nur ein Bauplan. Du kannst auch kein Haus betreten, von dem Du nur einen Bauplan hast. Da musst Du erst ein Haus bauen und dann kannst Du dieses Haus auch betreten.

Also von der Klasse eine Instanz erzeugen und dann kannst Du darauf auch etwas aufrufen.
 
E

Erazo

Bei der Klasse Leg, die laut UML Diagramm ohne Attibut colour auskommen soll kriege ich die Fehlermeldung dass der Konstruktur für Leg nicht definiert ist. Dabei hab ich ihn doch mit public Leg(...)
Java:
public class Shawna {
   
    public static void main(String[] args) {
        // TODO Auto-generated method stub
       
        Sheep bodyTail = new Sheep(170, 100, Colour.RED);
        bodyTail.draw();
       
        Head head = new Head(-60, -40, Colour.RED);
        head.draw();
       
        Leg leftFrontLeg = new Leg(30, 90);
        leftFrontLeg.draw();
    }

}
Java:
public class Leg {
   
    //attributes
   private int xPos;
   private int yPos;
   private static Ellipse leg;
 
 
 
   public void draw() {
       leg.draw();
}


   public Leg(int x, int y) {
    xPos = x;
    yPos = y;
    leg = new Ellipse(80, 20, xPos+170, yPos+100, Colour.BLACK);
}




}
 
E

Erazo

Ok, ich hab Eclipse geschlossen und neu geöffnet und es funktioniert...
 
E

Erazo

Ich habe jetzt Körper,Schwanz,Kopf,Beine fertig, bei der Pupille aber sind die Koordinaten aber relativ zum Kopf angegeben der wiederum relativ zum Körper liegt. Die Frage ist jetzt wie ich xPos und yPos vom Kopf in den Konstruktur von der Pupille kriege.
Natürlich könnte ich auch einfach xPos+170Körper)-60(Kopf) angeben, aber so wird das wohl nicht gedacht sein, oder?

Java:
public class Shawna {
   
    public static void main(String[] args) {
        // TODO Auto-generated method stub
       
        // erstellt und zeichnet zuerst Beine, die hinter dem Körper liegen
        Leg rightRearLeg = new Leg(125, 80);
        rightRearLeg.draw();
       
        Leg rightFrontLeg = new Leg(5, 80);
        rightFrontLeg.draw();
       
        // erstellt und zeichnet Körper und Schwanz
        Sheep bodyTail = new Sheep(170, 100, Colour.RED);
        bodyTail.draw();

        // erstellt und zeichnet Beine, die vor dem Körper liegen
        Leg leftFrontLeg = new Leg(30, 90);
        leftFrontLeg.draw();
       
        Leg leftRearLeg = new Leg(150, 90);
        leftRearLeg.draw();
       
        // erstellt und zeichnet Kopf
        Head head = new Head(-60, -40, Colour.RED);
        head.draw();

       //Nostril leftNostril = new Nostril()


    }

}
Java:
public class Nostril {

    //Attribute
   private int xPos;
   private int yPos;
   private static Ellipse nostril;

 
 
   public void draw() {
      nostril.draw();
}
 
 
   public Nostril(int x, int y) {
   xPos = x;
   yPos = y;
 
   nostril = new Ellipse(10, 10, xPos+170, yPos+100, Colour.BLACK);

}
}
 
E

Erazo

Java:
   nostril = new Ellipse(10, 10, xPos + Sheep.xPos, yPos+100, Colour.BLACK);
"The field Sheep.xPos is not visible"
dabei ist xPos in Sheep doch auf public gesetzt?
edit: Ich hatte es nicht gespeichert. Jetzt geht's
 
Zuletzt bearbeitet:
mihe7

mihe7

Java:
   nostril = new Ellipse(10, 10, xPos + Sheep.xPos, yPos+100, Colour.BLACK);
"The field Sheep.xPos is not visible"
dabei ist xPos in Sheep doch auf public gesetzt?
edit: Ich hatte es nicht gespeichert. Jetzt geht's
Das ist der falsche Ansatz. Die Position des Schafs interessiert nicht. Das Nostril-Objekt wird im Head-Objekt erzeugt und das Head-Objekt weiß, wo die Augen und Pupillen sein müssen.
 
E

Erazo

Java:
   nostril = new Ellipse(10, 10, xPos + Head.xPos, yPos + Head.yPos, Colour.BLACK);
Java:
        Nostril leftNostril = new Nostril(20, 84);
        leftNostril.draw();
Es gibt jetzt zwar keine Fehlermeldung, aber in der Ausgabe wird nostril auch nicht gezeichnet...
Die Koordinaten müssten passen
 
mihe7

mihe7

Nein, die Pupille bekommt ihre Koordinaten mit xPos und yPos im Konstruktor vorgegeben. Da brauchst Du in Nostril nichts addieren. Im Head dagegen musst Du die Position der Pupillen in Abängigkeit von xPos und yPos berechnen.
 
E

Erazo

Das heißt ich soll es so machen wie bei body und tail? Dann hätte ich aber keine Klasse Nostril mehr, die aber im UML Klassendiagramm enthalten ist
 
mihe7

mihe7

Nein. Mal langsam:

Du hast einen Kopf und Du willst z. B. dass die linke Pupille 20 vom linken Rand und 50 vom oberen Rand des Kopfes (bzw. seines umgebenden Rechtecks) angezeigt werden. Dann wäre das im Kopf erst mal etwas wie:
Java:
nostril = new Nostril(20, 50);
Nun ist die Position der Pupille (20, 50) aber keine absolute Position, sondern relativ zur Position des Kopfes, so dass Du xPos und yPos noch zur Position der Pupille addieren musst, um die absolute Koordinate zu erhalten:
Java:
leftNostril = new Nostril(xPos + 20, yPos + 50);
Im Konstruktor von Nostril dagegen einfach:
Java:
nostril = new Ellipse(10, 10, xPos, yPos, Colour.BLACK);
 
E

Erazo

Java:
public class Head {
   
    //Attribute
   
   public static int xPos;
   public static int yPos;
   private static Colour colour;
   private static Ellipse face;


   //methods
   public void draw() {
       face.draw();
       leftNostril.draw();
}

   public Head(int x, int y, Colour initialColour) {
       xPos = x;
       yPos = y;
       colour = initialColour;
       face = new Ellipse(80, 120, xPos+Sheep.xPos, yPos+Sheep.yPos, colour);
   }
 
   Nostril leftNostril = new Nostril(xPos,yPos);{
   xPos = Head.xPos+20;
   yPos = Head.yPos+84;
   }
}
Ich hab jetzt leftNostril in Head instanziiert und die Methode Head.draw() ergänzt. Jetzt wird das Nasenloch aber immer an der gleichen Stelle gezeichnet egal welche xpos und ypos ich angebe ...

Gibt es denn keine Möglichkeit die vom körper abhängigen koordinaten nochmal zu ergänzen und diese dann kombiniert in Nostril zu platzieren?
 
mihe7

mihe7

Ja, wenn Du nicht versuchst, auf die Attribute anderer Klassen zuzugreifen, kommt der Fehler nicht.
 
E

Erazo

Java:
public class Shawna {
   
    public static void main(String[] args) {
        // TODO Auto-generated method stub
Nostril leftNostril = new Nostril(20,50);
            leftNostril.draw();
hier erzeuge ich das Objekt leftNostril und übergebe die werte xPos 20 und yPos 50

Java:
public class Nostril {

    //Attribute
   public int xPos; // xPos und yPos auf public
   public int yPos;
   private static Ellipse nostril;

 
 
   public void draw() {
      nostril.draw(); // Methode um nostril zu zeichnen
}
 
 
   public Nostril(int x, int y) {
   xPos = x;
   yPos = y;
 
   nostril = new Ellipse(10, 10, xPos, yPos, Colour.BLACK); // Konstruktor für nostril

}
}
Java:
public class Head {
   
    //Attribute
   
   public int xPos;
   public int yPos;
   private static Colour colour;
   private static Ellipse face;


   //methods
   public void draw() {
       face.draw();
}

   public Head(int x, int y, Colour initialColour) {
       xPos = x;
       yPos = y;
       colour = initialColour;
       face = new Ellipse(80, 120, xPos+Sheep.xPos, yPos+Sheep.yPos, colour);
   }
 
   nostril = new Nostril(xPos +20,yPos +84); // hier wird nostril in abhängigkeit von Head verschoben
// Syntax error on token "nostril", VariableDeclaratorId expected after this token

}
 
E

Erazo

Ich glaube ich habe jetzt nostril 2 mal erzeugt aber egal welche von beiden ich entferne. Ich kriege immer die Fehlermeldung(als kommentar eingefügt)
 
mihe7

mihe7

Die Zeile muss in den Konstruktor (geschweifte Klammern beachten), aktuell ist sie außerhalb.
 
E

Erazo

Java:
   public Head(int x, int y, Colour initialColour) {
       xPos = x;
       yPos = y;
       colour = initialColour;
       face = new Ellipse(80, 120, xPos+Sheep.xPos, yPos+Sheep.yPos, colour);
     
       nostril = new Nostril(xPos +20,yPos +84); //nostril cannot be resolved to a variable
   }


}
dann kommt folgendes. Ich glaub iwie das Problem ist viel weniger umständlich zu lösen. Es müsste doch eig genau wie bei Head sein(xPos+Sheep.xPos) nur dass man jetzt eben diesen kombiierten Wert nimmt für nostril? Also iwas wie xHead+xPos nur dass das iwie nicht funktioniert
 
E

Erazo

Und nochmal: keines Deiner Attribute (auch nicht in Sheep) darf static sein.
dann kommt wieder überall:
Multiple markers at this line
- Cannot make a static reference to the non-static field
Sheep.xPos

Ja, weil Du die Variable noch deklarieren musst (wie bei xPos, yPos, colour, face).
wenn ich sie wie folgt deklariere, wird angemerkt dass sie nicht verwendet wird
Java:
   public Nostril nostril;
 
E

Erazo

aber nur wenn ich den festen wert für xPos.Sheep verwende was ja eben wermieden werden soll wenn ich die Aufgabenstellung richtig verstehe, oder nicht?
 
mihe7

mihe7

Du hast ein Schaf, das befindet sich an einer beliebigen Stelle, die im Konstruktor übergeben wird. Das Schaf kennt also seine Position. Das Schaf kann also die Position des Kopfs berechnen (xPos + relative x-Position des Kopfes, yPos + relative y-Position des Kopfes). Das Schaf erzeugt nun einen Kopf an eben dieser Stelle.

Der Kopf befindet sich also an der Stelle xPos, yPos (das sind jetzt die Koordinaten des Kopfes). Der Kopf kennt also seine Position. Der Kopf kann also die Position des Auges berechnen (xPos + relative x-Position des Auges, yPos + relative y-Position des Auges). Der Kopf erzeugt nun ein Auge an eben dieser Stelle.

Der Kopf kann auch die Position der Pupille berechnen (xPos + relative x-Position der Pupille, yPos + relative y-Position der Pupille). Der Kopf erzeugt nun die Pupille an eben dieser Stelle.

Die Pupille befindet sich also an der Stelle xPos, yPos (das sind jetzt die Koordinaten der Pupille). Die Pupille kann nun an dieser Stelle eine Ellipse der benötigten Größe erzeugen.

Usw.
 
E

Erazo

Das Schaf kann also die Position des Kopfs berechnen (xPos + relative x-Position des Kopfes, yPos + relative y-Position des Kopfes). Das Schaf erzeugt nun einen Kopf an eben dieser Stelle.
Achso, das mach ich dann in der Klasse Sheep und erzeuge das Objekt aber dann in der mainmethode shawna?
 
E

Erazo

Ich denke ich mach das jetzt einfach mit absoluten Bezügen bevor ich hier ewig rumprobiere
Java:
   nostril = new Ellipse(10, 10, xPos + 110, yPos + 60, Colour.BLACK);
 
E

Erazo

Ok, das klappt auch nicht weil ich das ganze iwann noch animieren soll. Ich geh mal Schritt für schritt durch und du kannst mir sagen wo ich den Fehler hab:
zuerst lege ich den Konstruktor wie folgt in der Klasse Nostril fest:
Java:
   public Nostril(int x, int y) {
   xPos = x;
   yPos = y;


   nostril = new Ellipse(10, 10, xPos + Head.xPos, yPos + Head.yPos, Colour.BLACK);
damit kann ich in der main methode jetzt ein Objekt Nostril erzeugen ,dass die Koordinaten die man eingibt nimmt, sie mit Head.xPos und Head.yPos addiert und dann erzeugt.

Das Problem hierbei ist, dass die Werte durch folgende zeile nicht aus dem fertigen face genommen werden, sondern einfach die Werte genommen werden, die man bei der erzeugung von Head eingegeben hat. Dadurch landen die Nasenlöcher links neben dem Zeichenbild, da man für Head als x wert -60 eingibt und ihn dann mit 20 bzw 50 addiert und es so immer negative werte werden.
Java:
   public Head(int x, int y, Colour initialColour) {
       xPos = x;
       yPos = y;
       colour = initialColour;
       face = new Ellipse(80, 120, xPos + Sheep.xPos, yPos + Sheep.yPos, colour);
auf den wert xPos+Sheep.xPos kann ich nicht zugreifen weil er nur innerhalb der Klasse Head existiert.
Ist das soweit korrekt?
 
T

temi

Ok, das klappt auch nicht weil ich das ganze iwann noch animieren soll. Ich geh mal Schritt für schritt durch und du kannst mir sagen wo ich den Fehler hab:
zuerst lege ich den Konstruktor wie folgt in der Klasse Nostril fest:
Java:
   public Nostril(int x, int y) {
   xPos = x;
   yPos = y;


   nostril = new Ellipse(10, 10, xPos + Head.xPos, yPos + Head.yPos, Colour.BLACK);
damit kann ich in der main methode jetzt ein Objekt Nostril erzeugen ,dass die Koordinaten die man eingibt nimmt, sie mit Head.xPos und Head.yPos addiert und dann erzeugt.

Das Problem hierbei ist, dass die Werte durch folgende zeile nicht aus dem fertigen face genommen werden, sondern einfach die Werte genommen werden, die man bei der erzeugung von Head eingegeben hat. Dadurch landen die Nasenlöcher links neben dem Zeichenbild, da man für Head als x wert -60 eingibt und ihn dann mit 20 bzw 50 addiert und es so immer negative werte werden.
Java:
   public Head(int x, int y, Colour initialColour) {
       xPos = x;
       yPos = y;
       colour = initialColour;
       face = new Ellipse(80, 120, xPos + Sheep.xPos, yPos + Sheep.yPos, colour);
auf den wert xPos+Sheep.xPos kann ich nicht zugreifen weil er nur innerhalb der Klasse Head existiert.
Ist das soweit korrekt?
Die Klasse Nostril darf intern nur die Koordinaten verwenden, die ihr über den Konstruktor mitgegeben werden. "Head" ist innerhalb der Klasse nicht bekannt.

Das heißt die Klasse Head enthält zwei Variablen vom Typ Nostril und die Klasse Head bestimmt über den Aufruf des Konstruktors von Nostril, wo diese gezeichnet werden. Das kann in Head relativ zur der Position von Head berechnet werden.

Ganz grob:

Java:
class Head {
    
    int xPos, yPos; // die Position von Head
    Nostril leftNostril;
    Nostril rightNostril;
    
    public Head(int x, int y) {
        //..
        leftNostril = new Nostril(x + relX, y + relY); // relX und relY kannst du auch direkt als Wert angeben
        // usw.
    }
}
 
E

Erazo

Also muss ich den Konstruktor von Nostril in Head anlegen damit ich dadurch auf die werte von face zugreifen kann?
 
T

temi

Also muss ich den Konstruktor von Nostril in Head anlegen damit ich dadurch auf die werte von face zugreifen kann?
Keine Ahnung was du meinst. "face" ist auch einfach nur eine weiteres Attribut von Head und hat mit den Nasenlöchern wenig zu tun außer, dass es zuerst gezeichnet werden muss, damit es die Nasenlöcher nicht verdeckt.

Edit:

Steht doch genau im UML Diagramm. Head hat zwei Ohren, zwei Augen und zwei Nasenlöcher. Das sind alles nur Attribute, wie oben am Beispiel der Nasenlöcher gezeigt. Ausgehend von der Position von Head musst du diese Attribute im Konstruktor von Head mit ihren Koordinaten relativ zur Basiskoordinate von Head erzeugen.
 
E

Erazo

Java:
   public Head(int x, int y, Colour initialColour) {
       xPos = x;
       yPos = y;
       colour = initialColour;
       face = new Ellipse(80, 120, xPos + Sheep.xPos, yPos + Sheep.yPos, colour);
       leftNostril = new Nostril (20 + xPos, 84 + yPos);
wen ich das jetzt so anlege und dann in der Main Methode wie folgt zeichne zeichnet er aber weiterhin nur das Gesicht oder zeichnet die Nasenlöcher immer noch links neben das Bild

Java:
        Head head = new Head(-60, -40, Colour.RED);
        head.draw();
 
T

temi

Java:
   public Head(int x, int y, Colour initialColour) {
       xPos = x;
       yPos = y;
       colour = initialColour;
       face = new Ellipse(80, 120, xPos + Sheep.xPos, yPos + Sheep.yPos, colour);
       leftNostril = new Nostril (20 + xPos, 84 + yPos);
wen ich das jetzt so anlege und dann in der Main Methode wie folgt zeichne zeichnet er aber weiterhin nur das Gesicht oder zeichnet die Nasenlöcher immer noch links neben das Bild

Java:
        Head head = new Head(-60, -40, Colour.RED);
        head.draw();
Genau wie innerhalb von Nostril kein Zugriff auf Head besteht, besteht natürlich auch innerhalb von Head kein Zugriff auf Sheep, d.h. Head wird an die Position gezeichnet, die er in seinem Konstruktor übergeben bekommt.

Wenn xPos und yPos die Position des Zentrums von Head (also das Zentrum von face) ist, dann müsste die Nasenlöcher ja rechts und links unterhalb davon liegen. Also beim linken Nasenloch muss irgendwas wie leftNostril = new Nostril (xPos - ..., yPos + ); stehen.

Generell kennt jede einzelne Klasse nur die Position ihres Zentrums.

Du erstellst also ein Sheep mit einer Position.

Innerhalb von Sheep wird damit:

Ein Kopf erstellt, der links und oberhalb dieser Position liegt.
Ein Bein erstellt, das links und unterhalb dieser Position liegt.
Noch ein Bein erstellt, ...

Innerhalb von Head wird:

Eine Ellipse als face erstellt.
Ein Nasenloch erstellt, das links unterhalb liegt.
Ein Nasenloch erstellt, das rechts unterhalb liegt.
Ein Ohr erstellt, das links oberhalb liegt.
...
 
E

Erazo

Das heißt den ganzen Block in main kann ich mir auch sparen?
Java:
public class Main {
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        
        //erstellt Körper und Schwanz
        Sheep bodyTail = new Sheep(170, 100, Colour.RED);
        
        // erstellt und zeichnet zuerst Beine, die hinter dem Körper liegen
        Leg rightRearLeg = new Leg(125, 80);
        rightRearLeg.draw();
        
        Leg rightFrontLeg = new Leg(5, 80);
        rightFrontLeg.draw();
        
        //zeichnet Körper und Schwanz
        bodyTail.draw();

        // erstellt und zeichnet Beine, die vor dem Körper liegen
        Leg leftFrontLeg = new Leg(30, 90);
        leftFrontLeg.draw();
        
        Leg leftRearLeg = new Leg(150, 90);
        leftRearLeg.draw();
        
        // erstellt und zeichnet Kopf
        Head head = new Head(-60, -40, Colour.RED);
        head.draw();
        
        // erstellt und zeichnet Nasenlöcher
 
E

Erazo

Ok das heißt auch ich packe dann Head und leg in die draw Methode von Sheep und packe Nostril,Eye und Ear in die draw Methode von Head? Oder wenn nur das Sheep erzeugt werden soll sogar alles in die draw Methode von sheep?
 
T

temi

Ok das heißt auch ich packe dann Head und leg in die draw Methode von Sheep und packe Nostril,Eye und Ear in die draw Methode von Head? Oder wenn nur das Sheep erzeugt werden soll sogar alles in die draw Methode von sheep?
In die draw-Methode kommen nur die Aufrufe weiterer draw-Methoden (für alle Attribute der jeweiligen Klasse), z.B. bei Head:

Java:
class Head {
         
    public draw() {
        face.draw();
        leftNostril.draw();
        rightNostril.draw();
        // usw.
    }
}
 
Zuletzt bearbeitet:
E

Erazo

ja genau das mein ich, sodass am ende in der main methode nur shawna.draw(); steht und damit alles gezeichnet wird
 
T

temi

ja genau das mein ich, sodass am ende in der main methode nur shawna.draw(); steht und damit alles gezeichnet wird
Steht doch alles da:
In die draw-Methode kommen nur die Aufrufe weiterer draw-Methoden (für alle Attribute der jeweiligen Klasse)
Schau dir an, welche Attribute (die gezeichnet werden müssen) in der jeweiligen Klasse vorhanden sind und rufe die entsprechenden draw-Methoden in der richtigen Reihenfolge auf.

Bei Sheep sind das der Körper, die Beine, der Kopf und der Schwanz.
Bei Head sind das das Gesicht, die Augen, die Ohren, die Nasenlöcher.
Bei Eye sind es das Auge an sich und die Pupille.
 
Zuletzt bearbeitet:
E

Erazo

Java:
public class Head {
    
    //Attribute
    
   public static int xPos;
   public static int yPos;
   public Colour colour;
   public Ellipse face;
   public Nostril nostril;
   public Nostril leftNostril;
   public Nostril rightNostril;


   //methods
   public void draw() {
       face.draw();
       leftNostril.draw();
       rightNostril.draw();

}
  

   public Head(int x, int y, Colour initialColour) {
       xPos = x;
       yPos = y;
       colour = initialColour;
       face = new Ellipse(80, 120, xPos, yPos, colour);
      
       leftNostril = new Nostril (20 + xPos, 84 + yPos);
       rightNostril = new Nostril (50 + xPos, 84 + xPos);

   }
 

}
Java:
public class Nostril {

    //Attribute
   public int xPos;
   public int yPos;
   public Ellipse leftNostril;
   public Ellipse rightNostril;

  
  
   public void draw() {
      leftNostril.draw();
      rightNostril.draw();
      
}
  
  
   public Nostril(int x, int y) {
   xPos = x;
   yPos = y;
   leftNostril = new Ellipse(10, 10, xPos, yPos, Colour.BLACK);
   rightNostril = new Ellipse(10, 10, xPos, yPos, Colour.BLACK);
  
  
  

  
}
}
jetzt zeichnet er das linke Nasenloch richtig aber das rechte ist plötzlich zu tief?
 
T

temi

Die xPos und yPos dürfen nicht statisch sein. Überhaupt darf nichts außer der main() statisch sein.

Außerdem schau in dein Klassendiagramm. Siehst du irgendwo, dass ein einzelnes Nasenloch zwei Nasenlöcher enthält?
 
E

Erazo

Immer noch das selbe Ergebnis auch wenn ich alles nicht statisch setze
 
T

temi

Mein Fehler: Die Koordinate bei der Ellipse entspricht wohl nicht dem Zentrum sondern der Ecke des umgebenden Rechtecks. Das musst du bei der Berechnung der relativen Koordinaten berücksichtigen.
 
E

Erazo

die relativen Koordinaten sind doch in der Aufgabe gegeben. Vielleicht hat sich dort ja ein Fehler eingeschlichen?
 
E

Erazo

Java:
public class Head {
    
    //Attribute
    
   public int xPos;
   public int yPos;
   public Colour colour;
   public Ellipse face;
   public Nostril leftNostril;
   public Nostril rightNostril;


   //methods
   public void draw() {
       face.draw();
       leftNostril.draw();
       rightNostril.draw();

}
  

   public Head(int x, int y, Colour initialColour) {
       xPos = x;
       yPos = y;
       colour = initialColour;
       face = new Ellipse(80, 120, xPos, yPos, colour);
      
       leftNostril = new Nostril (20 + xPos, 84 + yPos);
       rightNostril = new Nostril (50 + xPos, 84 + yPos);

   }
 

}
Java:
public class Nostril {

    //Attribute
   public int xPos;
   public int yPos;
   public Ellipse Nostril;


  
  
   public void draw() {
   Nostril.draw();
      
}
  
  
   public Nostril(int x, int y) {
   xPos = x;
   yPos = y;
   Nostril = new Ellipse(10, 10, xPos, yPos, Colour.BLACK);
  
  
  

  
}
}
 
T

temi

Schau dir mal den Attributnamen in Nostril an! Das sollte nostril heißen. Nostril ist die Bezeichnung der Klasse!

Generell ist es außerdem sinnvoll die Attribute der Klasse private zu machen. Eine Klasse sollte soviel verbergen als möglich und nur sichtbar machen was notwendig ist.

Ansonsten zieh das jetzt so weiter durch. Die Klassen ähneln sich alle.
 
E

Erazo

Ok, ich hab jetzt alles fertig gemacht und das Schaaf steht.(Danke für die Geduld :D)
In der Aufgabe ist aber die Rede davon, dass das Schaaf mithilfe der eyelid blinzeln soll. Ich nehme mal an das funktiniert über die HelperClass die ein delay beim zeichnen erzeugt. Wie implementiere ich die?
Java:
class HelperClass {

    static void wait(int milliseconds) {
        try {
            Thread.sleep(milliseconds);
        } catch (Exception e) {
            // ignoring exception at the moment
        }
    }

}
Außerdem stell ich mir die Frage ob meine Attribute richtig sind, da im UML diagramm viele der Attribute die ich zugeweisen habe nicht auftauchen
private Eye leftEye;
private Eye rightEye;
private Ear leftEar;
private Ear rightEar;
etc
Ich nehme mal an das nicht alle Attribute im UML diagramm auftauchen?
 
mihe7

mihe7

Außerdem stell ich mir die Frage ob meine Attribute richtig sind, da im UML diagramm viele der Attribute die ich zugeweisen habe nicht auftauchen
Doch die tauchen auf und zwar in Form von Assoziationen (die Linien zwischen den Klassen) und Multiplizitäten (den Zahlen an den Pfeilen, die angeben, wie viele Objekte es geben muss). Dort steht z. B. Head --- has --- 2 --> Eye(s)

Was im Diagramm nicht angegeben ist, sind die Bezeichner, die Du also frei wählen kannst. Unabhängig davon: sofern nicht ausdrücklich etwas anderes behauptet wird, erhebt ein UML-Diagramm nicht den Anspruch auf Vollständigkeit.
 
T

temi

Wie implementiere ich die?
Die HelperClass an sich ist ja bereits implementiert. ;)

Sie stellt eine statische Methode wait() bereit, die du verwenden kannst mit HelperClass.wait(1000);. Anstatt "1000" (ms) kannst du natürlich auch was anderes einsetzen. Sie bewirkt einfach, dass das Programm für eine Zeit wartet. Mach was draus. Zum Beispiel ein Zwinkern.
 
E

Erazo

Ich hab das zwinkern einfach über das ändern des Wertes in der Ellipse class erreicht. Über die Helperclass ist es aber wohl klüger.
Java:
    void draw() {
        Canvas canvas = Canvas.getCanvas();
        canvas.draw(this, colour, new Ellipse2D.Double(xPos, yPos,
                horizontalLength, verticalLength));
        canvas.wait(250);  // diesen wert meine ich
 
Thema: 

Klassen implementieren

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben