# Interface - Problem



## kulturfenster (17. Mai 2007)

Guten Tag allerseits,
Ich habe eine kleine Interface-Aufgabe zu lösen und komme nun ned mehr weiter.
Gegeben ist das Interface "Drawable". Nun gilt es 2 Klassen zu schreiben, die von dem I Gebrauch machen und je ein Auto bzw eine Ellipse zeichnen. Des Weitern sollen die Zeichnungen nacheinander an 3 verschiedenen Orten erscheinen.

Mit dem Interface und den beiden Klassen für Auto/Ellipse stimmt glaub alles. Hier deshalb die problematische main-Methode:

```
import java.util.Random;
import javax.swing.JFrame;
import java.awt.geom.Ellipse2D;

public class PictureViewer {

	private static int breite = 200;
	private static final int laenge = 200;
	
	public static void main(String[] args)
	{
		Random generator = new Random();
		JFrame frame = new JFrame("Viewer");
		
		frame.setSize(breite, laenge);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		int count = 0;
		while(count < 3)
		{
			int z = generator.nextInt(2);
			
			// Koordinaten der Grafiken
			int x = generator.nextInt(200);
			int y = generator.nextInt(200);
			
			if(z == 0)
			{
				Drawable e = new Ellipse(x,y);
				frame.add((Ellipse2D.Double)e);
			}
			
			if(z == 1)
			{
				Drawable c = new Charre(x,y);
				frame.add((Ellipse2D.Double) c);
			}
			
			count++;
		}
		
		frame.setVisible(true);
	}
}
```

Das Problem liegt beim Casten. Sieht jemand den Fehler?

Vielen Dank für alle Tipps!


----------



## AlArenal (17. Mai 2007)

Wie wäre es mal mit einer Fehlerbeschreibung, Fehlermeldung, Stacktrace?


----------



## kulturfenster (17. Mai 2007)

wie gesagt, das Casten ist das Problem:

Ellipse cannot be cast to java.awt.geom.Ellipse2D$Double
	at P11_11.PictureViewer.main(PictureViewer.java:33)


----------



## AlArenal (17. Mai 2007)

Und was verstehst du an der Mledung nicht? Wozu soll der Cast überhaupt gut sein? Was zum Henker ist Ellipse2D.Double!?


----------



## kulturfenster (17. Mai 2007)

nun, ich habs zuerst ohne Cast versucht:

```
Drawable e = new Ellipse(x,y);
	frame.add(e);
```
dann gabs folgende Fehlermeldung: The method add(Component) in the type Container is not applicable for the arguments (Drawable).

Deshalb hab ichs mit nem Cast versucht.


----------



## André Uhres (17. Mai 2007)

Zum JFrame muss du ein JComponent hinzufügen.
Ellipse2D.Double ist aber kein JComponent.
Ich weiss nicht genau wie du das machen willst.
Hier mal eine Möglichkeit:

```
package thread;
/*
* PictureViewer.java
*/
import java.awt.*;
import java.util.*;
import javax.swing.*;
import java.awt.geom.*;
public class PictureViewer {
    private Image image;
    private Graphics2D g2d;
    private int breite = 400;
    private final int laenge = 400;
    private Drawing drawing;
    private Random generator;
    public PictureViewer(){
        generator = new Random();
        JFrame frame = new JFrame("Viewer");
        frame.setSize(breite, laenge);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        drawing = new Drawing();
        frame.add(drawing);
        frame.setVisible(true);
        doDrawing();
    }
    private void doDrawing(){
        new Thread(new Runnable() {
            public void run() {
                try {
                    Thread.sleep(300);
                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                }
                int count = 0;
                while(count < 3) {
                    int z = generator.nextInt(2);
                    // Koordinaten der Grafiken
                    int x = generator.nextInt(200);
                    int y = generator.nextInt(200);
                    if(z == 0) {
                        Drawable e = new Ellipse(x,y);
                        System.out.println(e);
                        drawing.drawDrawable(e);
                    }
                    if(z == 1) {
                        Drawable c = new Charre(x,y);
                        System.out.println(c);
                        drawing.drawDrawable(c);
                    }
                    count++;
                }
            }
        }).start();
    }
    public static void main(final String[] args) {new PictureViewer();}
    class Drawing extends JPanel{
        public void paintComponent(final Graphics g) {
            super.paintComponent(g);
            if (image == null) {
                image = createImage(getWidth(), getHeight());
                g2d = (Graphics2D)image.getGraphics();
                g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                        RenderingHints.VALUE_ANTIALIAS_ON);
                g2d.setColor(Color.white);
                g2d.fillRect(0, 0, getWidth(), getHeight());
                g2d.setColor(Color.black);
            }
            Rectangle r = g.getClipBounds();
            g.drawImage(image, r.x, r.y, r.width+r.x, r.height+r.y,
                    r.x, r.y, r.width+r.x, r.height+r.y, null);
        }
        private void drawDrawable(final Drawable e){
            g2d.draw(e);
            drawing.repaint();
        }
    }
}
class Ellipse extends Ellipse2D.Double implements Drawable{
    private int x, y;
    public Ellipse(final int x, final int y){
        super(x,y, 50, 40);
        this.x = x;
        this.y = y;
    }
    public String toString() {return "Ellipse: x="+x+", y="+y;}
}
class Charre extends Rectangle implements Drawable{
    private int x, y;
    public Charre(final int x ,final int y){
        super(x,y, 50, 40);
        this.x = x;
        this.y = y;
    }
    public String toString() {return "Charre: x="+x+", y="+y;}
}
interface Drawable extends Shape{}
```
EDIT: 17.5.2007 16:54


----------



## André Uhres (17. Mai 2007)

upps


----------



## AlArenal (17. Mai 2007)

Und du meinst ein Cast in bester Rate-mal-mit-Rosenthal-Manier würde was bringen? Grundsätzlich ist Trial & Error keine Vorgehensweise, die einen groß weiterbringt. Und wie bist du ausgerechnet auf die Ideen, dein Kram wäre vom Typ Ellipse2D.Double und dieser wäre eine Component?

Hölle...


----------

