Interface - Problem

Status
Nicht offen für weitere Antworten.

kulturfenster

Bekanntes Mitglied
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:
Code:
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!
 

kulturfenster

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

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

kulturfenster

Bekanntes Mitglied
nun, ich habs zuerst ohne Cast versucht:
Code:
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

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

AlArenal

Top Contributor
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...
 
Status
Nicht offen für weitere Antworten.

Oben