# Bei Klick zeichnen



## d3vixt (30. Dez 2011)

Hey,

ich schreibe grad an einer Art Paint in Java(zu übungszwecken), komme dort aber nicht weiter...Ich habe ein JPanel, auf das gezeichnet werden soll und einen Button, der das ganze wieder leert. Nun habe ich gedacht füge ich dem Panel einen MouseMotionListener hinzu, sodass ich bei einem Ziehen des Benutzers(also wenn die MouseDragged Methode aufgerufen wird) einen Punkt an der aktuellen Mausposition zeichne. Da allerdings hakt es, da ich nicht weiß, wie ich die paint Methode des Frames aufrufen kann.

Wie kann ich das ganze umsetzen?

Danke schonmal


----------



## Gast2 (30. Dez 2011)

Da gibt es mehrere Ansätze. Am einfachsten wäre so was:
Du zeichnest die Punkte in ein BufferedImage und zeichnest das in der paintComponent Methode des JPanels. Die kannst du einfach per repaint() aufrufen lassen.


----------



## d3vixt (30. Dez 2011)

Danke schonmal für den Ansatz.

Wie sähe das ganze als Code aus? Ich habe es versucht, aber krieg es irgendwie nicht gebacken -.- Also es gibt keine Fehler, gezeichnet wird aber auch nichts... 

Danke!

PS: Hier mein Ansatz: 


```
import java.awt.event.*;
import java.awt.image.BufferedImage;

import javax.swing.*;
import java.awt.*;
public class GUI extends JFrame{
	
	JPanel p;
	JButton b;
	
	BufferedImage bi;
	
	Handler h=new Handler();
	private void initComp(){
		b=new JButton("Clear");
		b.addActionListener(h);
		
		
		p=new JPanel();
		p.setBackground(Color.WHITE);
		p.addMouseMotionListener(h);
		p.setSize(300,300);
		
		bi=new BufferedImage(p.getWidth(),p.getHeight(),BufferedImage.TYPE_BYTE_BINARY);
	}
	
	private void addComp(){
		add(b,BorderLayout.SOUTH);
		add(p,BorderLayout.CENTER);
	}
	
	public GUI(){
		super("Test");
		setLayout(new BorderLayout());
		initComp();
		addComp();
		pack();
		setVisible(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	private class Handler implements ActionListener,MouseMotionListener{

		@Override
		public void actionPerformed(ActionEvent arg0) {
			if(arg0.getSource()==b){
				
			}
			
		}

		

		@Override
		public void mouseDragged(MouseEvent e) {
			//p.setRGB(e.getPoint().x, e.getPoint().y,Color.GREEN.getRGB());
			bi.setRGB(e.getPoint().x, e.getPoint().y,Color.BLACK.getRGB());
			p.paint(bi.getGraphics());
			p.repaint();
			
			
		}

		@Override
		public void mouseMoved(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}
		
	}
}
```


----------



## GUI-Programmer (30. Dez 2011)

Ich habe sowas auch schon mal so ähnlich gemacht. Vielleicht hilfst dir weiter. Hier mein Code im Anhang:


mfg GUI-Programmer


----------



## Schandro (30. Dez 2011)

du musst die paintComponent-Methode deines JPanels überschreiben und dort das Image zeichnen. Immer wenn sich das Image ändert rufst du dann p.repaint() auf


----------



## d3vixt (30. Dez 2011)

Also ist das Buffered Image ein Attribut der eigenen Panel Klasse?


----------



## Schandro (30. Dez 2011)

d3vixt hat gesagt.:


> Also ist das Buffered Image ein Attribut der eigenen Panel Klasse?


Geht auch einfacher indem du eine anonyme innere Klasse benutzt:

```
JPanel p = new JPanel(){@Override public void paintComponent(Graphics g){super.paintComponent(g);g.drawImage(bi,0,0,null)};
```
bin zu faul Eclipse zu starten, deswegen die fehlende Formatierung und eventuelle Rechtschreibfehler


----------



## GUI-Programmer (30. Dez 2011)

Schandro hat gesagt.:


> Geht auch einfacher indem du eine anonyme innere Klasse benutzt:
> 
> ```
> JPanel p = new JPanel(){@Override public void paintComponent(Graphics g){super.paintComponent(g);g.drawImage(bi,0,0,null)};
> ...



Merkt man, es fehlt noch eine geschweifte Klammer am Ende. Trozdem kann man aber ein paar Tabs einbauen:

```
JPanel p = new JPanel(){
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(bi,0,0,null)
    }
};
```


----------



## Der der es weiß (1. Jan 2012)

Also das geht relativ einfach.
Die Sache ist die, dass wenn man das Problem erst erkannt hat, man einen wesentlichen in Richtung der Lösung des Problems gemacht hat.
Hoffe, ich konnte von Assistenz sein.


----------



## Dambo (1. Jan 2012)

@Der der es weiß:
Es liegt auf der Hand, dass du beschränkt bist.


----------



## Schandro (1. Jan 2012)

GUI-Programmer hat gesagt.:


> Merkt man, es fehlt noch eine geschweifte Klammer am Ende. Trozdem kann man aber ein paar Tabs einbauen:


Schonmal versucht im Antwort-schreiben Textfeld dieses Forums Tabs einzubauen?


----------



## bERt0r (1. Jan 2012)

Es gibt so ein schönes Tutorial, ganz oben in diesem Forum: http://www.java-forum.org/awt-swing-swt/43939-zeichnen-swing-tutorial.html
Du machst genau die Sachen falsch, die in dem Tutorial beschrieben sind. Einfach mal durchlesen.


----------



## GUI-Programmer (1. Jan 2012)

Schandro hat gesagt.:


> Schonmal versucht im Antwort-schreiben Textfeld dieses Forums Tabs einzubauen?



Ich will dich ja jetzt nich verärgern oder gar ne weitere unnötige Diskussion auslösen, aber meist entspricht ein normaler Tab 4 Leerzeichen. Deswegen ist es mir auch ein Leichtes ein Antwort im Antwortfeld mit Java-Code zu geben, selbst mit mein Samsung Galaxy Ace.


Nochmals zum Problem:
Schau dir meinen hochgeladenen Code an, v.a. das Interface Paintable sowie dessen Verwendung in der ArrayList, sowie deren Gebrauch in der paintComponent des Zeichenpanels.


----------



## André Uhres (1. Jan 2012)

d3vixt hat gesagt.:


> sodass ich bei einem Ziehen des Benutzers(also wenn die MouseDragged Methode aufgerufen wird) einen Punkt an der aktuellen Mausposition zeichne.



Hier findest Du sicher alles Nötige:
Malen in Swing Teil 1: der grundlegende Mechanismus
Malen in Swing Teil 2: ein einfaches Malprogramm

Gruß,
André


----------

