# Pfeilpolygon per Maus rotierbar machen - Kleine Schwierigkeiten



## Polone (8. Okt 2012)

Hallo an Alle. 
Bin noch relativ neu in der Java Welt und versuche ein Pfeilpolygon zu zeichnen dass ich mit der Maus in einem Radius von 180° rotieren lassen kann. Bisher hab ich es schon hingekriegt das gute Stück zu zeichnen und "einigermaßen" zu bewegen. Mein Problem ist aber :
1. Dass es ruckelt wie Hulle wenn ich rotieren will
2. Wie schaffe ich es den Pfeil per anklicken in dem Bereich (180°) zu steuern?
Bisher muss ich in den X Bereich des Panels klicken und die Maus dann bewegen
Es macht den Anschein als sei der Ursprung des Koordinatensystems für den Pfeil im Bildmittelpunkt. Der Ursprung des Panels ist aber immernoch oben links...

Über Hilfe würde ich mich sehr freuen! 


```
package arrow;
 
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Polygon;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
 
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
 
public class Polygonpfeil extends JFrame implements MouseMotionListener
{
    int p = 0;
    private double winkel;
    private Polygon s = new Polygon(new int[]{p+1,p+1,p+5,p,p-5,p-1,p-1}, new int[]{p,p-35,p-35,p-50,p-35,p-35,p}, 7);
    private int mausXPos;
    private int mausYPos;
    
    public Polygonpfeil()
    {
        this.winkel = 10.00;
        JFrame frame = new JFrame();       
        frame.addMouseMotionListener(this);
        JPanel panel = new JPanel()
        {
            @Override
            public void paintComponent(Graphics pfeil) 
            {                
                Graphics2D g = (Graphics2D)pfeil;
                g.translate(getWidth()/2, getHeight()/2);
               
                g.rotate(winkel* Math.PI / 180.0);               
                g.setColor(Color.red);
                g.fillPolygon(s);
                g.drawString("Pfeilpolygon Gradzahl: "+winkel, 50, 00);      
                setOpaque(false);
                repaint();
                updateUI();
            }
        };
 
        panel.setOpaque(false);
        frame.add(panel);
        frame.setSize(800, 200);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);   
    }
 
    @Override
    public void mouseDragged(MouseEvent e)
    {    
        this.mausXPos = e.getX();
        this.mausYPos = e.getY();
        
        if(mausXPos<=90 && mausXPos>=-90)   
        {
            this.winkel = mausXPos;
            repaint();
        }
        System.out.println("Maus Position X"+this.mausXPos);
        
    }
    @Override
    public void mouseMoved(MouseEvent e)
    {
        this.mausXPos = e.getX();
        this.mausYPos = e.getY();
        System.out.println("Maus Position X"+this.mausXPos);
    }
 
    public static void main(String[] args) 
    {
        SwingUtilities.invokeLater(new Runnable() 
        {
            public void run() 
            {
                new Polygonpfeil();
            }
        });
    }
   
}
```


----------



## jgh (8. Okt 2012)

na ja, wenn man in der paintComponent() ein repaint-Aufruf hat...muss man sich nicht wundern.

wenn du jetzt bei gedrückter Maustaste deine Winkel beachtest, sollte dir zumindest ein Problem deutlich werden 


```
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Polygon;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Polygonpfeil extends JFrame implements MouseMotionListener {
	JPanel panel;
	int p = 0;
	private double winkel;
	private Polygon s = new Polygon(new int[] { p + 1, p + 1, p + 5, p, p - 5,
			p - 1, p - 1 }, new int[] { p, p - 35, p - 35, p - 50, p - 35,
			p - 35, p }, 7);
	private int mausXPos;
	private int mausYPos;

	public Polygonpfeil() {
		this.winkel = 10.00;
		JFrame frame = new JFrame();
		frame.addMouseMotionListener(this);
		panel = new JPanel() {
			@Override
			public void paintComponent(Graphics pfeil) {
				Graphics2D g = (Graphics2D) pfeil;
				g.translate(getWidth() / 2, getHeight() / 2);
				g.rotate(winkel * Math.PI / 180.0);
				g.setColor(Color.red);
				g.fillPolygon(s);
				g.drawString("Pfeilpolygon Gradzahl: " + winkel, 50, 00);
				setOpaque(false);
			}
		};

		panel.setOpaque(false);
		frame.add(panel);
		frame.setSize(800, 200);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setLocationRelativeTo(null);
		frame.setVisible(true);
	}

	@Override
	public void mouseDragged(MouseEvent e) {
		this.mausXPos = e.getX();
		this.mausYPos = e.getY();

		// if (mausXPos <= 90 && mausXPos >= -90) {
		this.winkel = mausXPos;
		panel.validate();
		panel.repaint();
		System.out.println("Maus Position X" + this.mausXPos);

	}

	@Override
	public void mouseMoved(MouseEvent e) {
		// this.mausXPos = e.getX();
		// this.mausYPos = e.getY();
		// System.out.println("Maus Position X" + this.mausXPos);
	}

	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				new Polygonpfeil();
			}
		});
	}

}
```

[edit]





> Es macht den Anschein als sei der Ursprung des Koordinatensystems für den Pfeil im Bildmittelpunkt. Der


translate(int x, int y) 
          Translates the origin of the graphics context to the point (x, y) in the current coordinate system.  
jo, das Panel hat weiterhin seinen Ursprung oben links, das Graphics in der Methode setzt du aber anders...

btw sollte imho der erste Aufruf immer [c]super.paintComponent(pfeil);/[c] sein[/edit]


----------



## Polone (8. Okt 2012)

Also soll ich jetzt NOCHMAL ein translate benutzen um das zweite Koordinatensystem in die mitte zu legen?
Hab das repaint nu rausgenommen, aber es ruckelt dennoch. Liegt es vielleicht am fehlenden doubleBuffered oder sowas?

Sorry für vielleicht doofe Fragen :-/


----------



## jgh (8. Okt 2012)

was für ein 2. Koordinatensystem und wo ist das erste???

und nein es liegt nicht am fehlenden DoubleBuffering...das ist von Swing per default true

[java=30]System.out.println(isDoubleBuffered());[/code]

du kannst mit setRenderingHint() des Graphics-Object evt. noch etwas machen...aber na ja, evtl. kann dir jemand anders helfen...ich weiß gerade nicht, worauf du hinaus willst.
[java=31]g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
        RenderingHints.VALUE_ANTIALIAS_ON);[/code]


----------



## Polone (8. Okt 2012)

Wenn du das Ding einmal startest siehst du dass der Pfeil in der Mitte liegt. So habe ich ihn ja transformiert.
Wenn du aber mit der Maus im Panel rumbewegst zeigt dir das System.out.println. ja die Mausposition an.
Und die Location der Maus ist halt NICHT wie sie sein sollte im BILDMITTELPUNKT null ..sondern immernoch Links im Panel  Das ist das Problem.
Ich gleiche ja den Winkel des Pfeils der X-Position der Maus an. Bereich des pfeils von -90 bis +90 Grad soll halt mit der Mausposition X=-90 bis x=+90 in dem Bereich synchron sein. 



Edit: Danke für deine Mühe  und WOW das setRenderingHint lässt den Pfeil gleiten wie n heißes Messer durch Butter


----------



## jgh (8. Okt 2012)

du willst mir doch nicht sagen, dass das hier dein Prob löst???


```
public void mouseDragged(MouseEvent e) {
		this.mausXPos = e.getX() - panel.getWidth() / 2;
		this.mausYPos = e.getY() - panel.getHeight() / 2;
```


----------



## jgh (8. Okt 2012)

dein Pfeil (dein unsichbares Koordinatensystem^^) hast du durch 
	
	
	
	





```
g.translate(getWidth() / 2, getHeight() / 2);
```
 in die Mitte deines Panels gelegt...deine MouseEvents haben damit eigentlich nichts zu tun.

Wenn du bspw. auch hier dein 2. unsichtbares Koordinatensystem für die MouseEvents in das Zentrum legen willst, kannst du mit [c]	e.translatePoint(-panel.getWidth() / 2, -panel.getHeight() / 2);[/c] dieses auch machen...oder wie im vorherigen Bsp-Code


----------



## Polone (8. Okt 2012)

Ähm doch!  Vielen vielen dank!  Klingt äußerst logisch  .....


----------



## jgh (8. Okt 2012)

^^ okay 

hast du denn deine Gradzahl vernünftig hinbekommen?


----------



## Polone (8. Okt 2012)

Was meinst mit vernünftig hinbekommen?  Also im Bereich -90 und +90 bewegt sich die maus bei gedrückter maustaste. der winkel des pfeils wird gleichgesetzt mit dem mousedragged   oder is das "unsauber programmiert" ?A


----------



## jgh (9. Okt 2012)

das deine Gradzahl auch korrekt angezeigt wird


```
if(mausXPos<=90 && mausXPos>=-90)   
        {
            this.winkel = mausXPos;
            repaint();
        }
```
So wie hier oben wird ja nur der Winkel korrekt angezeigt, wenn ich mich innerhalb von 90px rechts und links des Pfeils mich befinde...


----------



## Polone (9. Okt 2012)

Der eigetnliche Gedanke dahinter war, dass ich .....
- den Pfeil anklicken und in dem 180 Grad Bereich rotieren lassen kann. Das ist bisher die erste (dreckige) Übergangslösung gewesen um das anklicken des Pfeiles zu umgehen Ich bin für Kritik, Hilfe und Verbesserung seeehr offen & Dankbar


----------



## jgh (9. Okt 2012)

dann zeig mal bitte deinen aktuellen stand ... am besten wieder als kskb


----------



## Polone (9. Okt 2012)

Sitze da gerde erst dran & tüfftel rum,....


----------



## jgh (9. Okt 2012)

dann zeig doch mal her was du gerade hast und wo du dran rumtüfftelst...evtl. kann dir ja jemand helfen, oder dich in die richtige Richtung schubsen


----------



## Polone (9. Okt 2012)

Im Prinzip ist das ja die Ausgangssituation,...wieder. 


```
package arrow;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Polygon;
import java.awt.RenderingHints;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
 
public class Polygonpfeil extends JFrame implements MouseMotionListener
{
    int p = 0;
    private double winkel;
    private Polygon s = new Polygon(new int[]{p+1,p+1,p+5,p,p-5,p-1,p-1}, new int[]{p,p-35,p-35,p-50,p-35,p-35,p}, 7);
    private int mausXPos;
    private int mausYPos;
    JPanel panel;
    JFrame frame;
    
    public Polygonpfeil()
    {
        this.winkel = 0.00;
        frame = new JFrame();       
        frame.addMouseMotionListener(this);
        panel = new JPanel()
        {
            @Override
            public void paintComponent(Graphics pfeil) 
            {                
                super.paintComponent(pfeil);
                
                Graphics2D g = (Graphics2D)pfeil;         
                g.translate(getWidth()/2, getHeight()/2);// Koordinatensystem für den Pfeil in die Bildmitte legen
                g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);// Pfeilpolygon antialiasing                
                g.rotate(winkel* Math.PI / 180.0);              
                g.setColor(Color.red);
                g.fillPolygon(s);
                g.drawString(winkel+"°", 50, 00);      
//                setBackground(Color.red);
                setOpaque(false);
                updateUI();
            }
        };

        panel.setOpaque(false);
        frame.add(panel);
        frame.setSize(800, 200);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);   
    }
 
    @Override
    public void mouseDragged(MouseEvent e)
    {    
        this.mausXPos = e.getX() - panel.getWidth() / 2;
        this.mausYPos = e.getY() - panel.getHeight() / 2;
        
        
        if(mausXPos<=90 && mausXPos>=-90)   
        {
            
            this.winkel = mausXPos;
            repaint();
        }
        System.out.println("Maus Position X"+this.mausXPos);
        
    }
    @Override
    public void mouseMoved(MouseEvent e)
    {
        this.mausXPos = e.getX() - panel.getWidth() / 2;
        this.mausYPos = e.getY() - panel.getHeight() / 2;
        System.out.println("Maus Position X"+this.mausXPos);
    }

    public static void main(String[] args) 
    {
        SwingUtilities.invokeLater(new Runnable() 
        {
            public void run() 
            {
                new Polygonpfeil();
            }
        });
    }
   
}
```

Jetzt wäre es halt cool wenn man den Pfeil! anklicken könnte und nicht einfach im Bild im X Bereich -90+90 herumwuselt.


----------



## Marco13 (9. Okt 2012)

Was genau meinst du...?

```
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Polygon;
import java.awt.RenderingHints;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
 
public class Polygonpfeil extends JFrame implements MouseMotionListener
{
    int p = 0;
    private double winkel;
    private Polygon s = new Polygon(
        new int[]{p+1,p+1,p+5,p,p-5,p-1,p-1}, 
        new int[]{p,p-35,p-35,p-50,p-35,p-35,p}, 7);
    private int mausXPos;
    private int mausYPos;
    JPanel panel;
    JFrame frame;
    
    public Polygonpfeil()
    {
        this.winkel = 0.00;
        frame = new JFrame();       
        panel = new JPanel()
        {
            @Override
            public void paintComponent(Graphics pfeil) 
            {                
                super.paintComponent(pfeil);
                
                Graphics2D g = (Graphics2D)pfeil;         
                g.translate(getWidth()/2, getHeight()/2);// Koordinatensystem für den Pfeil in die Bildmitte legen
                g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);// Pfeilpolygon antialiasing                
                g.rotate(winkel);              
                g.setColor(Color.red);
                g.fillPolygon(s);
                g.drawString((int)Math.toDegrees(winkel)+"°", 50, 00);      
//                setBackground(Color.red);
                setOpaque(false);
                updateUI();
            }
        };
        panel.addMouseMotionListener(this);
        panel.setOpaque(false);
        frame.add(panel);
        frame.setSize(800, 200);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);   
    }
 
    @Override
    public void mouseDragged(MouseEvent e)
    {    
        int centerX = panel.getWidth() / 2;
        int centerY = panel.getHeight() / 2;
        this.mausXPos = e.getX() - centerX;
        this.mausYPos = e.getY() - centerY;
        
        double angle = Math.atan2(mausYPos, mausXPos);
        this.winkel = angle + Math.PI / 2;
        repaint();
        System.out.println("Angle "+Math.toDegrees(angle));
        System.out.println("Maus Position X"+this.mausXPos);
        
    }
    @Override
    public void mouseMoved(MouseEvent e)
    {
        this.mausXPos = e.getX() - panel.getWidth() / 2;
        this.mausYPos = e.getY() - panel.getHeight() / 2;
        System.out.println("Maus Position X"+this.mausXPos);
    }
 
    public static void main(String[] args) 
    {
        SwingUtilities.invokeLater(new Runnable() 
        {
            @Override
            public void run() 
            {
                new Polygonpfeil();
            }
        });
    }
   
}
```


----------



## Polone (9. Okt 2012)

1.
Ich meine die MouseMotionListener unten. Bisher ist es ja so dass ich im Bild in den mittleren bereich reinklicke....also zwischen x=-90 und x=+90   und dragge die Mouse. Der Winkel des Pfeils ist synchron mit der X-Koordinate. Das ist meiner Meinung nach halt etwas dirty programmiert weil der Winkel halt nicht berechnet wird 

2.
Wollte ich gerne dass die Pfeilspitze anklickbar ist. Also quasi dass auf der Pfeilspitze ein rechteckiger Listenerbereich liegt der erkennt dass ich die die Spitze angeklickt habe und so fortschreite!


----------



## Marco13 (9. Okt 2012)

Bei dem geposteten zeigt der Pfeil immer in Richtung des Mousecursors. Dass das beschränkt sein soll und nur nach einem Klick auf die Pfeilspitze passieren soll ist ja unabhängig davon...


----------



## Polone (10. Okt 2012)

Ich will gerade bewerkstelligen dass ich den Pfeil öfters auf ein JFrame lege, also mehrere Objekte davon erstelle die übereinander sitzen, und jeden neuen Pfeil an die Spitze des vorherigen Pfeils hefte. Sozusagen mit beispielsweise 5 Pfeilen eine Wegstrecke darstelle. Da knabbere ich gerade dran. 

Meine Idee war es die Panels einfach übereinander zu legen und jedes Mal die Mitte des neu angelegten Pfeilpanels mit der Spitze des vorherigen Pfeiles synchron zu halten. Klingt das logisch/möglich?


----------



## jgh (10. Okt 2012)

jo, grundsätzlich ist das möglich...hier mal auf die schnelle hingecodet, die Pfeile müsstest du dann natürlich nicht in die Mitte des Panels starten lassen, sondern am unteren Ende...


```
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Polygon;
import java.awt.RenderingHints;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Polygonpfeil extends JFrame implements MouseMotionListener {
	int p = 0;
	private double winkel;
	private Polygon s = new Polygon(new int[] { p + 1, p + 1, p + 5, p, p - 5,
			p - 1, p - 1 }, new int[] { p, p - 35, p - 35, p - 50, p - 35,
			p - 35, p }, 7);
	private int mausXPos;
	private int mausYPos;
	JPanel panel;
	JFrame frame;

	public Polygonpfeil() {
		this.winkel = 0.00;
		frame = new JFrame();

		frame.setLayout(new GridLayout(5, 1));
		for (int i = 0; i < 5; i++) {
			frame.add(initPfeilPanel());
		}
		frame.setSize(800, 200);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setLocationRelativeTo(null);
		frame.setVisible(true);
	}

	public JPanel initPfeilPanel() {
		panel = new JPanel() {
			@Override
			public void paintComponent(Graphics pfeil) {
				super.paintComponent(pfeil);

				Graphics2D g = (Graphics2D) pfeil;
				g.translate(getWidth() / 2, getHeight() / 2);// Koordinatensystem
																// für
																// den
																// Pfeil
																// in
																// die
																// Bildmitte
																// legen
				g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
						RenderingHints.VALUE_ANTIALIAS_ON);// Pfeilpolygon
															// antialiasing
				g.rotate(winkel);
				g.setColor(Color.red);
				g.fillPolygon(s);
				g.drawString((int) Math.toDegrees(winkel) + "°", 50, 00);
				// setBackground(Color.red);
				setOpaque(false);
				updateUI();

			}
		};
		panel.addMouseMotionListener(this);
		panel.setOpaque(false);
		return panel;
	}

	@Override
	public void mouseDragged(MouseEvent e) {
		int centerX = panel.getWidth() / 2;
		int centerY = panel.getHeight() / 2;
		this.mausXPos = e.getX() - centerX;
		this.mausYPos = e.getY() - centerY;

		double angle = Math.atan2(mausYPos, mausXPos);
		System.out.println(angle);
		if (-90 <= Math.toDegrees(angle) && Math.toDegrees(angle) <= 90) {
			this.winkel = angle + Math.PI / 2;
			repaint();
			System.out.println("Angle " + Math.toDegrees(angle));
			System.out.println("Maus Position X" + this.mausXPos);
		}

	}

	@Override
	public void mouseMoved(MouseEvent e) {
		// this.mausXPos = e.getX() - panel.getWidth() / 2;
		// this.mausYPos = e.getY() - panel.getHeight() / 2;
		// System.out.println("Maus Position X" + this.mausXPos);
	}

	public static void main(String[] args) {
		int b = 52;
		b -= 26;
		b += 20;
		System.out.println(b);
		SwingUtilities.invokeLater(new Runnable() {
			@Override
			public void run() {
				new Polygonpfeil();
			}
		});
	}

}
```


----------



## Marco13 (10. Okt 2012)

Was soll das denn? :noe: Es geht also nicht darum, einen Pfeil zu drehen, sondern Punkte zu verschieben (die zufällig die Endpunkte von Pfeilen sind) !?


----------



## Polone (10. Okt 2012)

Ja doch. In dem Sinne ja beides. Wenn ich ein Pfeilobjekt erstelle und das Objekt dann drehe, soll an den Endpunkt des Pfeiles wenn möglich - bei nächster Objekterstellung das nächste Pfeilobjekt dranklemmen.

Ich will mit ungenauen Aussagen keine Verwirrung stiften oder sowas  Ich bin noch "Anfänger"


----------



## Marco13 (10. Okt 2012)

Ja was heißt drehen? Alle Pfeile? Nur ein Pfeil? Sollen sich die Längen der anderen ändern? Willst du eine kinematische Kette modellieren? :autsch:


----------



## Polone (11. Okt 2012)

Achso, dachte die Detailtiefe spielt noch keine Rolle. Also es sollen sich alle Pfeile im 180° Winkel "drehen" lassen. Die Länge soll gleich bleiben und weil die ja aneinander hängen, soll sich das Ende des oberen Pfeils mit der Spitze des unteren bewegen während aber die SPITZE des oberen Pfeils in der Zeit fest ist. Weißt du was ich meine? 



edit: Da sich ja die Länge nicht ändern soll, muss sich das Panel auf dem der Pfeil sitzt bewegen


----------



## Marco13 (11. Okt 2012)

Das klingt irgendwie nach http://www.java-forum.org/hausaufgaben/127992-punkt-drehen-2.html#post834208 
(nichts mit "Panel verschieben" :noe: )


----------



## Polone (11. Okt 2012)

Ja das geht ja stark in die Richtung. Nur dass es bei mir halt Pfeilobjekte sein, und im Bereich von 180° zu drehen sein sollen.
Danke dir für den Tip & sorry dass ichs nicht von vorn herein genau so beschrieben hab. Aber ich dachte ich komme mit kleinen Teil-Hilfslösungen allein zum Ziel.


----------



## Marco13 (11. Okt 2012)

Bei der ersten Beschreibung dachte ich, es ginge um sowas wie ein "Dashboard" - Ein Armaturenbrett wo man mit dem Pfeil wie auf einem Tacho irgendeinen Wert einstellen kann. Da würde man natürlich anders ansetzen.

In diesem Fall ist es wohl sowas wie eine kinematische Kette (keine "echte", aber sowas ähnliches). Man hat einen Pfeil mit Start- und Endpunkt. Und der kann rotiert werden. Und am Endpunkt hängen ggf. weitere Pfeile, die sich aber "starr" mitbewegen sollen, wenn der erste rotiert wird. Also muss man nur die Pfeile speichern, und bei jedem Pfeil sagen, dass er dort anfangen soll, wo der letzte aufgehört hat. Es wäre wohl nicht verkehrt, sich dafür eine Art "Modell" zu erstellen, mit dem man das zusammenfasst, was man eigentlich beschreiben will. (Das zu zeichnen könnte dann ein zweiter Schritt sein).


----------



## Polone (11. Okt 2012)

Ah ok. Demnach wäre aber mein Ansatz falsch oder? :

Ich habe mir (mit Netbeans) einen Frame erstellt auf welchem ein Panel liegt dass Oberfläche heißt und erstelle auf diesem Panel dann immer wieder Pfeilobjekte die halt auf Panel sitzen. dann habe ich quasi bei X mal Button klicken X Panels die übereinander "angedockt" liegen. 

Ich glaub ich hab da am Anfang den Denkfehler gehabt. Weil die Frage die sich mir bei meiner Variante stellt/gestellt hat: Wie knüpfe ich den Urpsrungspunkt von Pfeil 2 an die Spitze von Pfeil 1 ...  Das geht dann ja eigetnlich doch nur wenn alle pfeile auf *DEM SELBEN* Panel liegen und jeder Pfeil einen Anfangs und EndPointer hat?


----------



## Marco13 (11. Okt 2012)

Man könnte auch alle Pfeile auf getrennte Panels legen, und die in ein LayeredPane packen, und entsprechend transparent machen und verschieben. Man kann auch mit einer Zange eine Schraube in die Wand hämmern. Wenn man das will oder für angebracht hält. Bei kleinen, isolierten Teilaspekten von Problemen kann man oft nur sagen "Joa, das könnte man so-und-so machen", aber es ist lästig wenn man das immer macht und dann als Antwort kommt "Jaaa, aber bei mir geht das nicht, weil [irgendwas, was vorher nicht erwähnt wurde]". Wenn man sowas hätte wie

```
interface Chain
{
    List<Point2D> getPoints();
    List<Point2D> getLinks();

    void setAngle(int index, double angle);
}
```
würde das vermutlich schon für vieles dfes bisher genannten (!) ausreichen, aber ... wer weiß....


----------

