Shape bewegen

ganonlight

Mitglied
Also ich will einfach nur einer Shape eine neue Position zuweisen.
Ich habs schon gegoogled, aber entweder hab ichs nicht verstanden, oder es kam nicht das, was ich gemeint hab.
Wenn ich schreib:
Java:
Ellipse2D.Double e = new Ellipse2D.Double( xPos, yPos, breite, hoehe );
   e.y = 400;
Funktionierts ja ganz leicht, aber wenn ich schreib:
Java:
Shape e = new Ellipse2D.Double( xPos, yPos, breite, hoehe );
kann ich leider nicht einfach e.y = 400; benutzen.
Es wär für mein Projekt aber deutlich besser, wenn ich durch die Shape-Klasse möglichst allgemein bleibe.
 
Hallo ganonlight,

Hier ist ein kleines Beispiel:

Java:
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.*;

class Zeichenfeld extends JPanel {

    private Shape shape = new Ellipse2D.Double(0, 0, 100, 60);
    private Point point;
    private final MouseListener listener = new MouseAdapter() {

        @Override
        public void mousePressed(final MouseEvent e) {
            point = e.getPoint();
            repaint();
        }
    };

    public Zeichenfeld() {
        addMouseListener(listener);
    }

    @Override
    protected void paintComponent(final Graphics g) {
        super.paintComponent(g);
        moveTo((Graphics2D) g, shape, point);
    }

    private void moveTo(final Graphics2D g2, final Shape shape,
            final Point point) {
        if (point != null) {
            AffineTransform oldTransform = g2.getTransform();
            g2.translate(point.x, point.y);
            g2.draw(shape);
            g2.setTransform(oldTransform);
        }
    }

    public static void main(final String... args) {
        Runnable gui = new Runnable() {

            public void run() {
                createAndShowGui();
            }
        };
        //GUI must start on EventDispatchThread:
        SwingUtilities.invokeLater(gui);
    }

    private static void createAndShowGui() {
        Zeichenfeld zeichenfeld = new Zeichenfeld();
        JFrame f = new JFrame("Klicke bitte mit der Maus auf das Zeichenfeld");
        f.add(zeichenfeld);
        f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        f.setSize(400, 300);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }
}

Gruß,
André
 
Das Problem ist, dass Shape ein Interface ist.

Daher hat es keine Felder (so wie x,y) daher kannst du natürlich nicht auf x,y zugreifen.
 
Allerdings stimmt die Aussage von AmunRa ("Das Problem ist, dass Shape ein Interface ist.") nicht so ganz.

Auch ein Interface kann nämlich Methoden zur Verfügung stellen, die auf Felder zugreifen, ohne selbst die Felder zu enthalten. In dem Fall ist es Aufgabe der Implementierungsklasse, in diesen Methoden auf tatsächliche Felder zuzugreifen.

Das Problem ist demnach nicht, dass Shape ein Interface ist, sondern dass das Shape Interface keine Methoden bereitstellt, mit denen wir bequem auf die Koordinaten zugreifen könnten.

Gruß,
André
 

Neue Themen


Zurück
Oben