Zeichenprogramm - selektierte Objekt feststellen

a_w

Grünschnabel
Ich arbeite gerade an einen Zeichenprogramm und eine Stelle bereitet mir große Probleme. Die Zeichenobjekte sind alle Klassen, die eine contains - Methode aufrufen, das funktioniert . Das eigentliche Problem besteht darin, wenn das Objekt1 sich mit den Objekt2 überschneidet oder Objekt1 innerhalb von Objekt2 liegt.
Alle Zeichenobjekte speichere ich in einen Vektor ab und dann rufe ich die contain Methode aller Objekte auf.
Wie kann ich feststellen, welches Objekt selektiert wurde, wenn die contain - Methode mehrfach true zurückliefert.

Könnte mir jemand einen Tipp gehen, wie ich feststellen kann, welche Objekt tatsächlich selektiert wurde. Ein Link wäre schon hilfreich.
 
Zuletzt bearbeitet:
Ich würde die Sache wie folgt angehen.
Durchlaufe alle Componenten des betreffenden Containers und prüfe, welches Objekt selektiert ist:
Code:
private Component getSelectedComponent(Container c) {
Component[] comp = c.getComponents();
for (int i = 0; i < comp.length; i++) {
	if (comp[i].isFocusOwner()) return comp[i];
}
return null;
}
Cu schnuffie ;)
 
Danke erstmal.
Ich habe an den Problem ziemlich viel Zeit verbraten ohne ein brauchbares Ergebnis.
Könntest du mir das bitte näher erklären? Ich habe von Java nicht sehr viel Ahnung.
Meine Zeichenobjekte ergeben alle der Klasse Objekt. Die ganzen Objekte stecke ich dann ich einen Vektor. Ich zeichne die ganzen Objekte in einen Panel.
 
Zuletzt bearbeitet:
Deine Objekte sind grafisch und damit Komponenten.

Ob Vector als Collection geeigneter ist als z.B. die ArrayList, die ich bevorzuge, bleibt dahingestellt. Dein Panel befüllst Du sicherlich über eine Schleife, oder?

Code:
Enumeration enum = myVector.elements();
while (enum.hasMoreElements()) {
myPanel.add((Component)enum.nextElement());
}

Deinem Panel kannst Du natürlich auch noch einen LayoutManager "verpassen"... :)

CU schnuffie
 
Ich meine, wenn seine Zeichenobjekte nicht vom java.awt.Component abgeleitet sind, dann kann er Deinen Code kaum gebrauchen. ;)
 
Hallo!

Schau mal hier:
Code:
/*
 * Created on 29.10.2004
 */
package de.tutorials;

import java.awt.BasicStroke;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.image.BufferStrategy;

import javax.swing.JFrame;
import javax.swing.plaf.basic.BasicGraphicsUtils;

/**
 * @author Darimont
 *  
 */
public class Test39 extends JFrame {

    private static final long serialVersionUID = 2868863481341142806L;

    private BufferStrategy strategy;

    private Point p0, p1;

    private Rectangle selRect;
    
    private Rectangle[] rects;
    
    private BasicStroke storke = new BasicStroke(3.0F);

    private Thread runner = new Thread() {
        {
            setPriority(MIN_PRIORITY);
        }

        public void run() {
            while (true) {

                Graphics2D g = (Graphics2D)strategy.getDrawGraphics();
                g.clearRect(0, 0, 400, 300);
                g.setStroke(storke);

                if (p0 != null && p1 != null) {
                    int xMin = 0, xMax = 0, yMin = 0, yMax = 0, dx = 0, dy = 0;
                    xMin = Math.min(p0.x, p1.x);
                    xMax = xMin == p0.x ? p1.x : p0.x;
                    yMin = Math.min(p0.y, p1.y);
                    yMax = yMin == p0.y ? p1.y : p0.y;
                    dx = xMax - xMin;
                    dy = yMax - yMin;
                    BasicGraphicsUtils.drawDashedRect(g, xMin, yMin, dx, dy);

                    selRect = new Rectangle(xMin, yMin, dx, dy);

                    for (int i = 0; i < rects.length; i++) {
                        Rectangle r = rects[i];
                        if (selRect.intersects(r)) {
                            g.fillRect(r.x, r.y, r.width, r.height);
                        }
                    }
                }
                
                for (int i = 0; i < rects.length; i++) {
                    Rectangle r = rects[i];
                    g.drawRect(r.x, r.y, r.width, r.height);
                }

                
                
                g.dispose();
                strategy.show();

                try {
                    sleep(30L);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    break;
                }
            }
        }
    };

    public Test39() {
        super("Test39");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setIgnoreRepaint(true);

        addMouseMotionListener(new MouseMotionAdapter() {
            public void mouseMoved(MouseEvent evt) {
                p1 = evt.getPoint();
            }
        });

        addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent evt) {
                p0 = evt.getPoint();
            }
        });

        createRects(rects = new Rectangle[5]);

        setSize(400, 300);
        setResizable(false);
        setVisible(true);
        createBufferStrategy(2);
        strategy = getBufferStrategy();
    }

    private void createRects(final Rectangle[] rs) {
        final int WIDTH = 50;
        final int HEIGHT = 25;
        
        rs[0] = new Rectangle(50,75,WIDTH,HEIGHT);
        rs[1] = new Rectangle(100,320,WIDTH,HEIGHT);
        rs[2] = new Rectangle(150,240,WIDTH,HEIGHT);
        rs[3] = new Rectangle(250,190,WIDTH,HEIGHT);
        rs[4] = new Rectangle(300,56,WIDTH,HEIGHT);
        
    }

    public static void main(String[] args) {
        new Test39().start();
    }

    private void start() {
        runner.start();
    }
}

Gruß Tom
 
Zurück