Klassen implementieren

Erazo

Aktives Mitglied
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

  • Aufgabe.png
    Aufgabe.png
    119,7 KB · Aufrufe: 38
Zuletzt bearbeitet:

httpdigest

Top Contributor
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

Top Contributor
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.
 

Erazo

Aktives Mitglied
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
 
K

kneitzel

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

httpdigest

Top Contributor
@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??
 

Erazo

Aktives Mitglied
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;
}
 
K

kneitzel

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

Erazo

Aktives Mitglied
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:

Erazo

Aktives Mitglied
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?
 
K

kneitzel

Gast
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?
 

Erazo

Aktives Mitglied
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

Top Contributor
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?
 

Erazo

Aktives Mitglied
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

  • 05-Aufgabe-Klassen-Implementieren (5).pdf
    375,5 KB · Aufrufe: 4
K

kneitzel

Gast
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?
 

Erazo

Aktives Mitglied
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

Top Contributor
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.
 
K

kneitzel

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

Erazo

Aktives Mitglied
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

Top Contributor
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.
 
K

kneitzel

Gast
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?
 

Erazo

Aktives Mitglied
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?
 
K

kneitzel

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

Erazo

Aktives Mitglied
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

Top Contributor
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);
   }
 

Erazo

Aktives Mitglied
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?
 

Erazo

Aktives Mitglied
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);
    }
 

Erazo

Aktives Mitglied
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

Top Contributor
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?
 

Erazo

Aktives Mitglied
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)
 
K

kneitzel

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

Erazo

Aktives Mitglied
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);
}




}
 

Erazo

Aktives Mitglied
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);

}
}
 

Erazo

Aktives Mitglied
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

Top Contributor
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.
 

Erazo

Aktives Mitglied
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

Top Contributor
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.
 

Erazo

Aktives Mitglied
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

Top Contributor
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);
 

Erazo

Aktives Mitglied
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?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
CptK Generics: Klassen die Interface implementieren, aber selbst nicht das Interface sind Java Basics - Anfänger-Themen 8
S Implementieren zweier Klassen Java Basics - Anfänger-Themen 5
K Klassen implementieren Java Basics - Anfänger-Themen 7
D Interface Interfaces und abstrakte Klassen implementieren Java Basics - Anfänger-Themen 4
C Klassendesign / Wann Interface implementieren und wann Klassen vererben? Java Basics - Anfänger-Themen 3
R Alle Klassen ermitteln, die Interface implementieren / Reflection Java Basics - Anfänger-Themen 51
B Liste aller Klassen die ein Interface implementieren. Java Basics - Anfänger-Themen 7
G Klassen finden die gegebenes Interface implementieren. Java Basics - Anfänger-Themen 11
G Klassen implementieren Java Basics - Anfänger-Themen 25
J Methodenaufrufe abstrakte Klassen, Interfaces Java Basics - Anfänger-Themen 17
M Abstrakte Klassen - Notation Java Basics - Anfänger-Themen 9
Detlef Bosau Nachladen von Klassen zur Laufzeit Java Basics - Anfänger-Themen 24
M Anonyme Klassen - Warum wird in der Konsole nichts ausgegeben? Java Basics - Anfänger-Themen 1
MoxMorris Einige Methoden aus verschiedenen Klassen nacheinander auszuführen läuft seltsam Java Basics - Anfänger-Themen 2
I Klassen von einem package laden, Statisches Feld auslesen und Objekt erstellen Java Basics - Anfänger-Themen 8
I 2 verschiedene Klassen mit gleichen Property vergleichen Java Basics - Anfänger-Themen 13
C Array von Klassen Java Basics - Anfänger-Themen 2
monsterherz 2 Klassen daher Probs mit dem Dateinamen Java Basics - Anfänger-Themen 9
C Kommunikation zwischen 2 Klassen Java Basics - Anfänger-Themen 9
I JPA Query für mehrere Klassen Java Basics - Anfänger-Themen 3
I @Entity Klassen, Service Beans etc. aus einem Share Projekt beziehen? Java Basics - Anfänger-Themen 26
S IntelliJ geht alle Klassen durch Java Basics - Anfänger-Themen 9
I Gleiche Klassen und Methoden in unterschiedlichen Projekten nutzen Java Basics - Anfänger-Themen 2
T variablen klassen übergreifend Java Basics - Anfänger-Themen 12
N Klassen Methoden anderer Klassen aufrufen Java Basics - Anfänger-Themen 4
D Klassen Klassen Kommunikation Java Basics - Anfänger-Themen 12
Encera Auf Objekte aus anderer Klassen zugreifen Java Basics - Anfänger-Themen 20
berserkerdq2 Zwei Klassen Erben von der Klasse A, die eine Klasse kann ich an Methoden übergeben, die als Parameter A haben, die andere nicht? Java Basics - Anfänger-Themen 3
M Andere Methoden in anderen Klassen aufrufen Java Basics - Anfänger-Themen 11
L Methoden in anderen Klassen nutzen Java Basics - Anfänger-Themen 6
D Klassen und Vererbung Java Basics - Anfänger-Themen 2
L Best Practice Annotierte Klassen im Classpath herausfinden Java Basics - Anfänger-Themen 1
P Mit dem Scanner Klassen aufrufen Java Basics - Anfänger-Themen 3
O Klassen Zusammenspiel zwischen 2 Klassen Java Basics - Anfänger-Themen 1
K Zweite Ausgabe von vererbten Klassen Java Basics - Anfänger-Themen 3
M Wie können Klassen nicht-materialisierte Attribute haben, die nur über get/ set-Mehoden simuliert sind? Java Basics - Anfänger-Themen 6
Speedrunner klassen aufrufen Java Basics - Anfänger-Themen 41
M Log4J (v2) nachträglich in allen Klassen hinzufügen Java Basics - Anfänger-Themen 9
D importieren eigener Klassen Java Basics - Anfänger-Themen 12
W Wo ist der Wurm in meinem Grundverständnis von Klassen? Java Basics - Anfänger-Themen 22
S Daten/Klassen/Packages richtig updaten!? Java Basics - Anfänger-Themen 2
alice98 Erste Schritte Liste erstellen ohne vorgefertigte Klassen Java Basics - Anfänger-Themen 1
C Archiv für eigene Klassen Java Basics - Anfänger-Themen 9
S Objekte von zwei klassen in zwei verschiedene Textdateien schreiben Java Basics - Anfänger-Themen 5
elsaaaaaa Wochentag als String ausgeben mit JDK Klassen Java Basics - Anfänger-Themen 6
Z Mehtode bei Start des Programms ausführen (Klassen übergreifend) Java Basics - Anfänger-Themen 12
J Allgemeines Problem mit Klassen Java Basics - Anfänger-Themen 5
TimoN11 Java Klassen Global einbinden Java Basics - Anfänger-Themen 1
B Inventar als einzelne Klassen anlegen? Java Basics - Anfänger-Themen 12
G Java Klassen und Instanzmethoden Java Basics - Anfänger-Themen 15
C Kommunikation zwischen 2 Klassen Java Basics - Anfänger-Themen 3
T Vererbung Verschiedene Attribute für vererbte Klassen Java Basics - Anfänger-Themen 4
S Klassen instanziieren und verwenden von Getter und Setter Java Basics - Anfänger-Themen 4
B Variablen Variablen übertragen ohne Klassen Java Basics - Anfänger-Themen 5
C Fernseher-Aufgabe (Methoden, Klassen und Objekte) Java Basics - Anfänger-Themen 63
H Methoden in großen Klassen gruppieren oder auslagern? Java Basics - Anfänger-Themen 10
G Abstrakte Klassen Java Basics - Anfänger-Themen 11
Y Klassen Klassen und Objekte Java Basics - Anfänger-Themen 3
Y Klassen Klassen und Objekte mit set und get Java Basics - Anfänger-Themen 0
A Generischen Klassen Java Basics - Anfänger-Themen 8
A Vererbung Klassen im Bezug auf Auto´s Java Basics - Anfänger-Themen 18
A Generische Klassen/Interface Java Basics - Anfänger-Themen 1
A Klassen Vererbung und zusätzliche Unterklassen Java Basics - Anfänger-Themen 23
J 2 klassen benutzen Java Basics - Anfänger-Themen 5
A Klassen und methoden Java Basics - Anfänger-Themen 15
A Bankweverwaltung mit Klassen und Methoden Java Basics - Anfänger-Themen 14
J Klassen Problem Java Basics - Anfänger-Themen 8
I Java Klassen "Graphics" und "MouseEvent" kombinieren Java Basics - Anfänger-Themen 7
I Klassen als Datentyp nutzen? Java Basics - Anfänger-Themen 11
M Aufsplitten von Methoden in andere Klassen Java Basics - Anfänger-Themen 2
M (Sehr großes Problem) Listen als static in anderen Klassen verwendet Java Basics - Anfänger-Themen 12
C Klassen objektorientiert aufteilen Java Basics - Anfänger-Themen 6
hello_autumn Klassen Anzahl sowie die Anzahl der Junit Tests ermitteln? Java Basics - Anfänger-Themen 8
A Auf Eigenschaften von Objekten anderer Klassen zugreifen Java Basics - Anfänger-Themen 5
F Klassen und Pakete Projektübergreifend (Eclipse) Java Basics - Anfänger-Themen 6
V_Fynn03 Klassen Überweisungen tätigen und einzahlen mit 2 Klassen Java Basics - Anfänger-Themen 1
W Abarbeitungsreihenfolge Anonyme Klassen Java Basics - Anfänger-Themen 2
V_Fynn03 Bruchrechner programmieren (2 Klassen) Java Basics - Anfänger-Themen 9
D OOP- Eine Klasse in mehrere Klassen aufteilen Java Basics - Anfänger-Themen 7
J Problem mit Array: 2 Klassen Java Basics - Anfänger-Themen 2
W Frage zu anonymen Klassen Java Basics - Anfänger-Themen 4
Curtis_MC Parameter-Übergabe bei Klassen und Methoden Java Basics - Anfänger-Themen 12
T Interfaces in erbenden Klassen Java Basics - Anfänger-Themen 2
C Methoden/Klassen Übergabewerte Java Basics - Anfänger-Themen 8
C Java Klassen/Methoden/Übergabeparameter Java Basics - Anfänger-Themen 4
L Wie geht man bei mehreren Action Klassen vor? Java Basics - Anfänger-Themen 0
P Datentypen, Klassen, Operatoren, Wrapperklassen Java Basics - Anfänger-Themen 2
L Wie teilt man ein Programm in vernünftige Klassen ein? Java Basics - Anfänger-Themen 10
T Klassen Denkfehler im Klassen "dynamisch" instanzieren? Java Basics - Anfänger-Themen 4
P Zugriff auf Variablen anderer Klassen in Greenfoot Java Basics - Anfänger-Themen 1
A Methode, Klassen Java Basics - Anfänger-Themen 3
B UML Klassen Diagramm zu Java Code Programmieren und ausführen Java Basics - Anfänger-Themen 21
J Zwei Klassen die sich gegenseitig referenzieren - Bad practice? Java Basics - Anfänger-Themen 4
G Klassen und Objekte Java Basics - Anfänger-Themen 2
Java The Hutt SetWerte über verschiedene Klassen Java Basics - Anfänger-Themen 16
D Klassen ausgeben Java Basics - Anfänger-Themen 2
H linkedlist generische klassen Java Basics - Anfänger-Themen 169
B CSS Klassen in eine Liste schreiben Java Basics - Anfänger-Themen 4
Queiser Nicht statische Klassen Java Basics - Anfänger-Themen 6
neerual Klassen Wie rufe ich Klassen, die andere Klassen extenden in einer Test Unit auf? Java Basics - Anfänger-Themen 10

Ähnliche Java Themen

Neue Themen


Oben