Paint Anwendung: Freihandlinien zeichnen

Sessiolog

Mitglied
Grüße!

Ich habe ein kleines Problem mit meiner Paint-Anwendung. Diese soll das Feature beinhalten, Freihandlinien durch das Drücken/Ziehen der Maus zu zeichnen. Vergleichbar mit dem Bleistift-Tool in dem Microsoft-Paint-Programm. Das Programmieren des besagten Features stellt sich für mich jedoch als schwierig heraus. Meine Idee war es, in der mouseDragged-Methode die X und Y Koordinaten in zwei Arrays zu speichern. Die paintComponent-Methode kann daraus dann eine polyLine zeichnen. Soweit funktioniert es wie es funktionieren soll. Wenn ich allerdings nach dem Loslassen der Maus eine zweite Linie zeichnen möchte, verbindet das Programm unwillentlich den letzten Punkt der vorangeganen polyLine mit dem ersten Punkt der neuen polyLine. Gibt es unter euch Profi-Hackern vielleicht jemanden, der mir da ein bisschen auf Sprünge helfen könnte?

Java:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.Graphics;
import java.awt.GridLayout;

class Malen2 extends JFrame implements ActionListener {
	int 		x,y,x2,y2;
	boolean 	drawL = false;
	JButton 	line;
	JPanel		pan;
	
	int [] pixelX = new int[10000];
	int [] pixelY = new int[10000];
	int i = 0;							//"int i" wird erst in der mouseDragged Methode verwendet
										// um Indexe für die beiden Arrays zu halten.
	public static void main (String [] args) {
		Malen frame = new Malen("Malen2");
		frame.setVisible(true);
		frame.setSize(400,400);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	} 		
	
	public Malen2 (String str) {
		super(str);
		line = new JButton("Freihand");
		line.setActionCommand("l");
		line.addActionListener(this);
		
		ZeichenPanel2 drawPanel = new ZeichenPanel2();
		//drawPanel.setBackground(Color.BLACK);
		
		pan = new JPanel();
		pan.setLayout(new GridLayout(0,1,0,0));
		pan.add(line);
		
		add(pan, BorderLayout.NORTH);
		add(drawPanel, BorderLayout.CENTER);
		
		addMouseListener(new InMalen2());
		addMouseMotionListener(new InMalen2());
		
		//Insets inset = circle.getInsets(); 		 
		//System.out.println(inset);
	}
	
	public void actionPerformed(ActionEvent e) {
		if (e.getActionCommand().equals("l")) {
			drawL = true;
		}
	}
	
	class InMalen2 extends MouseAdapter implements MouseMotionListener {
		
		public void mousePressed(MouseEvent m) {
			x = m.getX();
			y = m.getY();
		}
		
		public void mouseDragged(MouseEvent m) {
			x2 = m.getX();
			y2 = m.getY();
			
			if (drawL) {				// Sollte der boolsche Wert "drawL" == true sein,
				pixelX[i] = x2 - 8;		// wird jede Veränderung der Mausposition bei
				pixelY[i] = y2 - 56;	// gedrückter Maustaste in diese zwei Arrays gespeichert.
				i+= 1;					// von x2 und y2 müssen noch festgelegt Werte subtrahiert 
			}							// werden, damit die PolyLine nicht versetzt gezeichnet wird
		}
	}

	class ZeichenPanel2 extends JPanel {
		protected void paintComponent(Graphics g) {
			super.paintComponent(g);
			g.setColor(Color.RED);
		
			if (drawL) {
				g.drawPolyline(pixelX, pixelY, i);
				repaint();
			}
		}
	}
}

Ich bedanke mich im Voraus für eure Hilfe! :)
 

DarXun

Aktives Mitglied
Beim Neuansetzen verbindest du ja wieder mit deinem letzten Koordinaten-Paar, da liegt das Problem.
Durch das Absetzen sollte allerdings eine "Linie", also eine Vielzahl von Koordinaten-Paaren, abgeschlossen sein. Diese Information kannst du aktuell noch nicht abspeichern.

Du könntest hier ja eine weitere Klasse einführen, z.B. "Line" - Jede Line enthält dann eine Vielzahl von x- und y-Koordinaten-Paaren. In deiner Clicked-Methode erzeugst du eine neue Linie und initialisiert diese mit den entsprechenden x- und y-Koordinaten. Beim "draggen" werden neue Koordinaten-Paare hinzugefügt. Beim "Release" wird dieses Line-Objekt dann einer Liste von Lines hinzugefügt.

In deiner Draw-Methode iterierst du dann über die Lines der Liste und zeichnest sie alle (hier ist es wohl am einfachsten, wenn "Line" eine eigene Draw-Methode umsetzt, dann brauchst du nicht so viele Getter usw.)

MfG

DarXun
 

MR_UNIX

Bekanntes Mitglied
Ich denke mal, es liegt daran, dass du das Array mit den Koordinaten nie leerst.
Vermutlich musst du mouseReleased entsprechend implementieren, dass dann das Array geleert und alles auf Anfang gesetzt wird, damit es eine neue Linie ist.
 

MR_UNIX

Bekanntes Mitglied
Ja und? Ist ja schon gezeichnet :p
Ne, du hast natürlich Recht. Ein Linien-Objekt mit Punkten wäre besser. Und dann eine Methode, mit der man ein Linienobjekt direkt zeichnen kann. Das wäre die optimale Lösung.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Erste Schritte drawOval Problem in Paint Anwendung Java Basics - Anfänger-Themen 1
F Swing - Fehler - Paint Methode Java Basics - Anfänger-Themen 7
S awt: paint Methode zeigt nichts an Java Basics - Anfänger-Themen 9
R Begrenzer Anzahl von paint() ? Java Basics - Anfänger-Themen 3
S KeyListener/ActionListener/paint()/repaint() Java Basics - Anfänger-Themen 3
thet1983 start & paint Methode? Java Basics - Anfänger-Themen 0
S Interface JButton etc. wird in JFrame mit paint() nicht angezeigt Java Basics - Anfänger-Themen 6
M Probleme mit paint() aus java.awt.Graphics Java Basics - Anfänger-Themen 2
D Wert einer Variable in paint-Methode verwenden Java Basics - Anfänger-Themen 2
OnDemand Berechnung in die start und paint Methode eines Applets Java Basics - Anfänger-Themen 28
T Vererbung Wann wird die Methode paint aufgerufen? Java Basics - Anfänger-Themen 4
L Paint() wird scheinbar nicht richtig ausgeführt Java Basics - Anfänger-Themen 8
N aus Container components paint Java Basics - Anfänger-Themen 2
J paint() vs repaint() Java Basics - Anfänger-Themen 3
A Problem mit paint() Java Basics - Anfänger-Themen 2
A Aufruf der paint() Methode Java Basics - Anfänger-Themen 3
Dogge Problem mit paint(Graphics g) im Applet Java Basics - Anfänger-Themen 13
J Problem mit paint(Graphics g) Java Basics - Anfänger-Themen 4
L Erste Schritte Swing oder SWT Paint mit Grafikkarte? Java Basics - Anfänger-Themen 7
T paint() wird nicht aufgerufen Java Basics - Anfänger-Themen 2
K paint() mit einfügen Java Basics - Anfänger-Themen 14
K doppeltes paint beim Drucken Java Basics - Anfänger-Themen 8
J paint-methode blockiert settings von JComponents Java Basics - Anfänger-Themen 5
F Eine Frage über paint() Funktion Java Basics - Anfänger-Themen 2
S [Applet] Objekte von init bei paint benutzen Java Basics - Anfänger-Themen 9
R Methoden Zeichnen auf Button-Druck durch Paint-Methode Java Basics - Anfänger-Themen 2
W repaint() ruft paint() nicht auf Java Basics - Anfänger-Themen 9
J Zweimal im gleichen Paint-Fenster malen Java Basics - Anfänger-Themen 8
A paint() methode von externer Klasse aufrufen Java Basics - Anfänger-Themen 3
J Paint Methode von JPanel aufrufen Java Basics - Anfänger-Themen 15
V paint funktioniert nicht Java Basics - Anfänger-Themen 14
Q Zeichnen außerhalb der paint-methode Java Basics - Anfänger-Themen 7
O Paint Programm mit Fehler Java Basics - Anfänger-Themen 2
A Methoden Variablen in paint methode Java Basics - Anfänger-Themen 4
K Problem mit Parameter von paint(Graphics g) Java Basics - Anfänger-Themen 3
Y im applet malen ohne repaint paint ? Java Basics - Anfänger-Themen 6
S Datentypen Paint Programm Java Basics - Anfänger-Themen 7
M paint-Methode funzt nicht Java Basics - Anfänger-Themen 11
L Paint zeichnet nicht gespeicherte Objekte Java Basics - Anfänger-Themen 3
D OOP paint() Methode aus Unterklasse anstoßen Java Basics - Anfänger-Themen 3
A paint() - warum nicht aufrufen? Java Basics - Anfänger-Themen 3
K Scrollbar - Bild - paint-Methode - zoom Java Basics - Anfänger-Themen 10
S super.paint() Java Basics - Anfänger-Themen 4
S Bild aus paint() Methode auslagern Java Basics - Anfänger-Themen 14
T Etwas an paint()-Methode übergeben? Java Basics - Anfänger-Themen 6
TheKing Paint-Methode aufrufen Java Basics - Anfänger-Themen 14
N paint methode statt Event-Handling-Methode Java Basics - Anfänger-Themen 3
M Paint und JColorChooser Java Basics - Anfänger-Themen 12
G hintergrund wird nicht gezeichnet bei paint() Java Basics - Anfänger-Themen 3
H Paint Methode malt nicht im Panel Java Basics - Anfänger-Themen 4
S Frage zur paint-Methode Java Basics - Anfänger-Themen 3
B Applet: Event-Handling-Methode in start- bzw. paint-Methode Java Basics - Anfänger-Themen 7
G Nichtstatische Objekte in der paint()-Methode Java Basics - Anfänger-Themen 16
K Wieso wird "paint" nicht ausgeführt ? Java Basics - Anfänger-Themen 2
K JPanel, JFrame, paint() und wo ist mein Viereck ? Java Basics - Anfänger-Themen 19
F Frage zu JPanel und Paint Java Basics - Anfänger-Themen 5
P paint Methode Java Basics - Anfänger-Themen 3
M Problem mit paint() und Container. Java Basics - Anfänger-Themen 8
B Paint(Component) und externe Objekte Java Basics - Anfänger-Themen 6
T rotes herz public void paint(Graphics g) Java Basics - Anfänger-Themen 2
F Applets und die paint-Methode Java Basics - Anfänger-Themen 3
G frage zu paint Java Basics - Anfänger-Themen 3
T Mehrere paint Methoden in unterschiedlichen Klassen Java Basics - Anfänger-Themen 7
G start-oder paint-Methode anstatt Event-Handling-Methode? Java Basics - Anfänger-Themen 3
G Hilfe in paint() ; zeichnen Java Basics - Anfänger-Themen 15
C Einfaches Paint-Programm Java Basics - Anfänger-Themen 9
T .paint() aufrufen Java Basics - Anfänger-Themen 23
S Paint Teilweise Zeitverzögert Java Basics - Anfänger-Themen 6
R paint problem Java Basics - Anfänger-Themen 6
G mit paint() ins JPanel malen. Java Basics - Anfänger-Themen 6
M Auf Panels oder Labels malen? (paint) Java Basics - Anfänger-Themen 9
G repaint in paint aufrufen? Java Basics - Anfänger-Themen 9
V paint()-methode manuell aufrufen? kein autostart erwuenscht Java Basics - Anfänger-Themen 3
B Problem mit Einfügen von Choice (in ein Applet) aus Paint Java Basics - Anfänger-Themen 13
7 In Paint keine Schleife? Java Basics - Anfänger-Themen 13
T paint() wieder aus einder anderen methode aufrufen funzt nid Java Basics - Anfänger-Themen 2
G Paint auf Panel Java Basics - Anfänger-Themen 4
G Paint Methode löscht alles Java Basics - Anfänger-Themen 4
S paint() direkt auf JFrame seit 1.5 nicht mehr möglich? Java Basics - Anfänger-Themen 5
A Variablenübergabe in die Paint-Funktion Java Basics - Anfänger-Themen 4
D Zeichnen mit Paint zerstört ganzes Fenster Java Basics - Anfänger-Themen 5
G Klassen und paint methode Java Basics - Anfänger-Themen 2
T paint() ohne konstruktor aufzurufen? Java Basics - Anfänger-Themen 5
P paint() Java Basics - Anfänger-Themen 6
U paint Java Basics - Anfänger-Themen 8
X Malen außerhalb der paint() Methode Java Basics - Anfänger-Themen 4
C zu viele paint()'s. Java Basics - Anfänger-Themen 6
G Zeichnen ausserhalb der paint Methode Java Basics - Anfänger-Themen 4
V Problem mit der Anzeige einer paint-Methode in einem Panel Java Basics - Anfänger-Themen 2
N Probleme mit paint() bei Implementierung in ein Panel Java Basics - Anfänger-Themen 4
Dilandau paint(Graphics g) { unbekannt in try{} / catch{} }? Java Basics - Anfänger-Themen 5
D von paint() und repaint() im Applet Java Basics - Anfänger-Themen 4
C Ausgaben mit der Paint-Methode Java Basics - Anfänger-Themen 5
I In unterschiedlichen Applikation Zugriff auf eine gemeinsame Anwendung? Java Basics - Anfänger-Themen 8
A Wie führe ich eine Batch-Datei von meiner Java-Anwendung aus? Java Basics - Anfänger-Themen 18
A JavaFX-Anwendung läuft nicht mit Selenium WebDriver Java Basics - Anfänger-Themen 0
K Mail senden, nachdem Anwendung beendet wurde (gleich wie) Java Basics - Anfänger-Themen 4
P Best Practice Druck aus Java Anwendung in MacOs Java Basics - Anfänger-Themen 0
T Start-Activity für Java Maven Web-Anwendung festlegen Java Basics - Anfänger-Themen 2
J Was mache ich falsch in meiner Java Anwendung? Java Basics - Anfänger-Themen 11

Ähnliche Java Themen

Neue Themen


Oben