Zeichnen

mal2000b

Grünschnabel
hallo ich hab eine frage und zwar wie kann ich mit hilfe von
java.awt.point und java.util.vector ein Applet oder eine Applikation zum Freihandzeichnen mit der maus schreiben?
 
Was möchtest du machen? Freihandschreiben?
Also so wie man im Winter normalerweise seinen Namen in den Schnee pinkelt? *g*

Du musst einen MouseMotionListener oder so implementieren und dort die aktuelle Position des Mauszeigers feststellen und dort einen Punkt/Pixel setzen. Das geht mit der Methode drawLine() aus deinem Graphics-Kontext.

Was du mit der Vector-Klasse willst, weiß ich momentan nicht. Evtl. zum Speichern bereits gezeichneter Punkte, um sie später wieder zu löschen? Sorry, aber deine Frage ist unverständlich gestellt. Was willst du überhaupt machen?

Hier ist ein Beispiel jedoch mit einer geraden Linie von einem Startpunkt bis zum Loslassen der Maus.

Ich hoffe das hilft Dir weiter.

Code:
import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JPanel;

public class Freihandzeichnen extends Applet implements MouseListener
{
	private static final long serialVersionUID = 1L;
	private JPanel drawPanel = new JPanel();
	private Point startPoint = new Point();
	
	@Override
	public void init() {
	    setLayout(new BorderLayout());
		drawPanel.addMouseListener(this);
	    add( drawPanel );
	    setVisible( true ); 
	}

	public void mouseClicked(MouseEvent e) {}
	public void mouseEntered(MouseEvent e) {}
	public void mouseExited(MouseEvent e)  {}

	public void mousePressed(MouseEvent e) {
		startPoint.x = e.getX();
		startPoint.y = e.getY();
	}

	public void mouseReleased(MouseEvent e) {
		Graphics g = drawPanel.getGraphics();
		g.drawLine(startPoint.x, startPoint.y, e.getX(), e.getY());
	}
}
 
Habe mich gerade kurz hingesetzt und die o. g. Klasse etwas modifiziert. Sie ist aber nicht für Produktiveinsatz geeignet, da beim Resizen nicht repainted wird. Musst mal selbst gucken, wie du das machst. Ist normalerweise einfach...

Hier soll vielmehr der Einsatz der Klassen Point und Vector demonstriert werden.

Hast Du es Dir in etwa so vorgestellt?

Hier der Code:

Code:
import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JPanel;

public class Freihandzeichnen extends Applet implements MouseMotionListener, ActionListener
{
	private static final long serialVersionUID = 1L;
	private JPanel drawPanel = new JPanel();
	private Vector<Point> pointCache = new Vector<Point>();
	private JButton changeColorButton = new JButton("Change Color");
	private Graphics g;
	private Vector<Color> colorCache = new Vector<Color>();
	private Color cachedColor;
	
	@Override
	public void init() {
	    setLayout(new BorderLayout());
		drawPanel.addMouseMotionListener(this);
	    add( drawPanel, BorderLayout.CENTER );
	    
	    changeColorButton.addActionListener(this);
	    add(changeColorButton, BorderLayout.SOUTH);
	    colorCache.add(Color.RED);
	    setVisible( true );
	}

	public void mouseDragged(MouseEvent e) {
		
		Point p = new Point(e.getX(), e.getY());
		g = drawPanel.getGraphics();
		// draw point
		g.drawLine(p.x, p.y, p.x, p.y);
		
		//cache drawed point
		pointCache.add(p);
	}

	public void mouseMoved(MouseEvent e) {}

	public void actionPerformed(ActionEvent e) {
		if(e.getActionCommand().equals(changeColorButton.getActionCommand())){
			changeColor();
		}
		
	}
	
	public void changeColor(){
		if(g != null){
			Point p;
			
			// get cached color
			cachedColor = colorCache.firstElement();
			
			// delete cached color
			colorCache.remove(0);
			
			// add current color
			colorCache.add(g.getColor());
			g.setColor(cachedColor);
			
			// change color for each point
			for(int i=0; i < pointCache.size(); i++ ){
				p = pointCache.get(i);
				g.drawLine(p.x, p.y, p.x, p.y);
			}
		}
	}
}

Und so sieht es aus: (siehe Anhang ;-))
 

Anhänge

  • MeinNameImSchnee.jpg
    MeinNameImSchnee.jpg
    23,7 KB · Aufrufe: 72
Wo ist das Problem? Mach das doch! ;-)

Das, was ich dir gepostet hatte ist ja schon im weitesten Sinne das, was du willst. Du musst bedenken, dass ich es innerhalb von einer viertel Stunde schnell gemacht hatte. Wenn du was vernünftiges haben willst, musst du dir schon die Mühe machen, sich für einige Stunden hinzusetzen.

Viel Erfolg noch!
 
Zurück