# Zeichnen



## Guest (9. Sep 2008)

Hey Leute,
Hab ein Problem, ich möchte ne Anwendung machen, wo mal auf klick bestimmte Grafiken etc hinzufügen kann und diese verschieben kann... Hab da schon an Panels gedacht (in die die Grafiken kommen) aber weiß gerade nicht wirklich wie das gehn soll. Kann mir jemand sagen wonach ich suchen muss/wie ich das anstellen soll?

Danke


----------



## Gast2 (9. Sep 2008)

auf was willst du klicken ? auf die grafik oder auf einen button??? und wo hinzufügen???  zu einem bestehenden frame??? und wo rechts,mitte,links????

um ein bild in einem panel anzuzeigen kannst du die paintComponent überschreiben und deine bilder mit g.drawImgae(image,........); zeichnen


----------



## Gast (9. Sep 2008)

Es soll die Grafik per klick verschoben werden können (so Drag n Drop mäßig). Die neuen Grafiken sollen da erscheinen wo der User klickt(wenn da noch keine ist). Perfekt wäre es, wenn man erstellte/vorhandene Grafiken zB per Rechtsklick löschen könnte...


----------



## Gast (9. Sep 2008)

Also wenn ich das mit Panels löse soll das Panel in dem die Grafik ist verschoben werden können.


----------



## Gast2 (9. Sep 2008)

weiß zwar nicht was du genau machen willst ... aber ich denk du brauchst ein MouseMotionListener

damit kannst du dein bild solange irgendwo hinziehen bist du es loslässt... bzw. dadurch bekommst du die Koordinaten wo du es losgelassen hast


----------



## Gast (9. Sep 2008)

Kann schon sein... Wie kann ich denn überhaupt Bilder verschieben? Bin ich mit Panels auf dem richtigem Weg??


----------



## Michael... (9. Sep 2008)

Gast hat gesagt.:
			
		

> Bin ich mit Panels auf dem richtigem Weg??


Ja. Ich würde das mit den Bildern erst mal weglassen ist ja schliesslich das Panel, das verschoben wird. Die Bilder kann man dann jederzeit reinzeichnen.
Allerdings brauchst Du dann einen Container für die Panels/Bilder mit einem dazu passenden LayoutManager. Zu Beginn kann man ja mit einem "NullLayout" arbeiten. Ich würde aber empfehlen sich einen eigenen zu schreiben.


----------



## Gast2 (9. Sep 2008)

> Wie kann ich denn überhaupt Bilder verschieben?



MouseMotionListener...

Sind alle Bilder gleich groß??? wie ist die anordnung der bilder??? z.B. wie bei einem memory spiel oder sowas????
wenn du die bilder einfach irgendwo hinziehen willst wo du willst musst du sowieso ein nulllayout verwenden...


----------



## Gast (9. Sep 2008)

Die Bilder haben verschiedene größen ich würde sagen so maximal 50*50px in nem JFrame welches ne größe von 1000*600 hat.


----------



## Gast2 (9. Sep 2008)

ja gibt es eine bestimmte anordnung???? einen abstabnd zwischen 2 bilder???  

wenn du z.B wie 10 auf bilder hast kannst du erstmal leere panels erstellen lassen und dann die bilder iin immer einen freien panel schieben aber wie gesagt ich weiß nicht wie ich es mir vorstellen soll....

also wie gesagt um JPanles zu verschieben brauchst du einen MouseMotionListener damit kannst du die Koordinaten heruasfinden wo losgelassen wurde und da kannst du dein panel dann hinsetzen(setLocation(x,y))...


----------



## Gast (9. Sep 2008)

Es gibt keine abstände. Die Bilder sind frei platzierbar... Und es sind auch neue hinzufügbar... Ich setz ich jetzt mal mit dem MouseMotionListener außeinander...


----------



## Gast (9. Sep 2008)

Hab jetzt 1 Panel, was ich frei bewgen kann... Kann mir aber nicht vorstellen, wie ich das mit nem zweiten machen soll...


----------



## Gast (9. Sep 2008)

Hierder Code:


```
import java.awt.Color;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.*;

public class move extends JFrame{
	JPanel movable;
	public move(){
		super("JPanels frei bewegen und platzieren");
		setSize(1000, 500);
		JPanel main = new JPanel();
		main.setLayout(null);
		add(main);
		
		movable = new JPanel();
		movable.setBounds(490, 390, 20, 20);
		movable.setBackground(Color.blue);
		main.add(movable);
		setVisible(true);
		addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent e) {
                movePanel(e.getX(),e.getY());
            }
        });

        addMouseMotionListener(new MouseAdapter() {
            public void mouseDragged(MouseEvent e) {
                movePanel(e.getX(),e.getY());
            }
        });
		
	}
	public void movePanel(int x, int y){
		movable.setBounds(x, y, 20, 20);
	}
	
	public static void main(String[] args){
		new move();
	}
}
```


----------



## Gast (9. Sep 2008)

Wie kann ich da ein zweites ebenfalls per Mausklick frei platzierbares JPanel hinzufügen??


----------



## Gast (9. Sep 2008)

Hab jetzt ne lösung... kann mir jemand sagen, warum die Panels sich nicht so schnell wie dei Maus bewegen?? die hängen immer hinterher...

move Klasse (meine haupts klasse)

```
import java.awt.Color;

import javax.swing.*;

public class move extends JFrame{

   public move(){
      super("JPanels frei bewegen und platzieren");
      setSize(1000, 500);
      JPanel main = new JPanel();
      main.setLayout(null);
      add(main);
      
      JPanel movable = new moveablePanel(20, 20, 50, 50);
      movable.setBackground(Color.blue);
      main.add(movable);
      
      JPanel movable1 = new moveablePanel(30, 30, 100, 100);
      movable1.setBackground(Color.red);
      main.add(movable1);
      
      JPanel movable2 = new moveablePanel(40, 40, 200, 200);
      movable2.setBackground(Color.yellow);
      main.add(movable2);
      
      setVisible(true);
      /**
      addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent e) {
                movePanel(e.getXOnScreen()-15,e.getYOnScreen()-40);
            }
        });

        addMouseMotionListener(new MouseAdapter() {
            public void mouseDragged(MouseEvent e) {
                movePanel(e.getX()-15,e.getY()-40);
            }
        });
      **/
   }
   /**
   public void movePanel(int x, int y){
      movable.setBounds(x, y, 20, 20);
   }
   **/
   public static void main(String[] args){
      new move();
   }
}
```

movablePanel Klasse

```
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;

public class moveablePanel extends JPanel {
	int width, height;
	public moveablePanel(int width, int height, int startX, int startY){
		this.width = width;
		this.height = height;
		this.setBounds(startX, startY, width, height);
		addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent e) {
                movePanel(e.getXOnScreen(),e.getYOnScreen());
            }
        });

        addMouseMotionListener(new MouseAdapter() {
            public void mouseDragged(MouseEvent e) {
                movePanel(e.getX(),e.getY());
            }
        });
	}
	private void movePanel(int x, int y){
		setBounds(x, y, width, height);
	}
}
```


----------



## Gast2 (9. Sep 2008)

ja genau gleich du musst halt herausfinden welches du gerade angeklickt hast udn dass  musst du verschieben...


----------



## Gast (9. Sep 2008)

Hab schon siehe letzter Post du warst wahrscheinlich am schreiben... nur die Panels sind langsamer als die Maus...


----------



## Gast2 (9. Sep 2008)

Klassennamen schreibt man groß weiß gar nicht waurm du auf alles und jeden einen Listener draufsetzt...


----------



## Gast2 (9. Sep 2008)

```
package test;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

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


public class Main extends JFrame{

	JPanel main;
	JButton add;
	
	public Main()
	{
		super("Test");
		main = new JPanel();
		main.setLayout(null);
		
		setSize(1000,1000);
		
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		add = new JButton("add");
		add.addActionListener(new ActionListener(){

			@Override
			public void actionPerformed(ActionEvent e) {
				MovePanel panel = new MovePanel(100,100);
				main.add(panel);
				main.repaint();
				main.validate();
				
			}
			
		});
		
	
		
		add(main,BorderLayout.CENTER);
		add(add,BorderLayout.SOUTH);
		setVisible(true);
		
	}
	
	class MovePanel extends JPanel
	{
		public MovePanel(int x, int y)
		{
			setBackground(Color.BLACK);
			setSize(100,100);
			setLocation(x,y);
			addMouseMotionListener(new MouseMotionListener(){

				@Override
				public void mouseDragged(MouseEvent e) {
					setLocation(e.getXOnScreen(), e.getYOnScreen());
					
				}

				@Override
				public void mouseMoved(MouseEvent e) {
					// TODO Auto-generated method stub
					
				}
				
			});
			
			
		}
	}
	
	public static void main(String[] args) {
		
		SwingUtilities.invokeLater(new Runnable(){

			@Override
			public void run() {
				new Main();
				
			}
			
		});
		
	}

}
```


----------



## Gast (9. Sep 2008)

Hab das mit den Action Listenern mal irgendwo so gelernt... wusste nicht das das auch anders geht. Danke.


----------



## Gast (9. Sep 2008)

Wie könnte man da ein Panel wieder löschen?


----------



## Gast2 (10. Sep 2008)

mit remove(index) oder remove(comp) ...


----------



## André Uhres (15. Sep 2008)

Ist zwar ein wenig anders, aber vielleicht hilft auch diese Demo: ShapeEditor.jar (Quellcode im jar)


----------



## Gast (16. Sep 2008)

wie bekomme ich den index??


----------



## Gast2 (16. Sep 2008)

ich denk mal die reihenfolge in der du deine panels addest ... ich denke besser wäre die componente zu removen...
oder deine panels in eine ArrayList speichern...


----------



## Gast (17. Sep 2008)

Danke. Das mit der ArrayList ist ne Idee! Ich werd mir das heute abend mal angucken!


----------



## Gast (22. Sep 2008)

Habs ohne ArrayList geschafft


----------



## Gast (22. Sep 2008)

Das Problem ist aber, dass die Instanz der Klasse bleibt. Kann man die auch irgendwie schließen? oder geht das bei Java automatisch?


----------



## Gast2 (22. Sep 2008)

was heißt für dich instanz?? sobald sie irgendwann null ist oder kein zugriff mehr drauf hast geht der GC irgendwann drüber...


----------



## Gast (25. Sep 2008)

Der "Verweis"/die Zugriffsvariable für die Klasse oder macht Java das automatisch?


----------

