Paint funktioniert nicht richtig

Status
Nicht offen für weitere Antworten.

Arbon

Bekanntes Mitglied
Hallo habe ein Problem: Habe hier ein Paint erstellt. Wenn ich nun z.B. mit dem Pinsel striche zieh (Pinsel entspricht op == 7) tritt folgendes Problem auf: (die rote linie kennzeichnet das eigentliche Bild, wie es eigendlich ist. Beim speichern wird jedenfalls nur dieser Teil bezeichnet, also kann sich nur dieser im Bild befinden, der Rest der magischerweise auftaucht muss er wo anders zeichnen, warum auch immer Oo).

http://img113.imageshack.us/img113/5258/bugnx4.jpg

Ich hab bereits mehrmals den Code durchgegangen, kann aber keinen Fehler finden. Der Fehler ist übrigens anscheinend nur auf dem Graphics der JPanel geschrieben und nicht ins Graphics des Images, da er verschwindet wenn ich das programm minimiere und wieder maximiere. Das Panel ist in einer JTabbedPane

repaint verweist auf ein Paint Component, in welchem nur g.drawImage(); ist.

Code:
	@Override
	public void paintComponent(Graphics g) {
		if(img != null){
			g.drawImage(img, 0, 0, null);
		}
	}

Hier der Code der bei Mausbewegung und ausgewählter Operation die Zeichenoperationen durchführt

img ist ein Image. Es wurde korrekt geladen. Die ganzen Funktionen befinden sich in einer Klasse die JPanel extended

Code:
	@Override
	public void mouseDragged(MouseEvent e) {

		if (checkBounds(e.getX(), e.getY())) {
			return;
		}

		Graphics2D g2 = (Graphics2D) this.getGraphics();
		if (aa == true) {
			g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
					RenderingHints.VALUE_ANTIALIAS_ON);
		} else {
			g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
					RenderingHints.VALUE_ANTIALIAS_OFF);
		}
		g2.setColor(c);
		g2.setStroke(new BasicStroke(strokeSize, BasicStroke.CAP_ROUND,
				BasicStroke.JOIN_MITER));

		if (op == 14) {
			if (x != -1 && y != -1) {
				repaint();

				if (lx == -1 && ly == -1) {
					lx = e.getX();
					ly = e.getY();
				}
				g2.drawOval(lx, ly, e.getX() - lx, e.getY() - ly);
			}
		}

		if (op == 12) {
			if (x != -1 && y != -1) {
				repaint();

				if (lx == -1 && ly == -1) {
					lx = e.getX();
					ly = e.getY();
				}
				g2.drawRect(lx, ly, e.getX() - lx, e.getY() - ly);
			}
		}

		if (op == 15) {
			if (x != -1 && y != -1) {
				repaint();

				if (lx == -1 && ly == -1) {
					lx = e.getX();
					ly = e.getY();
				}
				g2.drawRoundRect(lx, ly, e.getX() - lx, e.getY() - ly, (e
						.getX() - lx) / 2, (e.getY() - lx) / 2);
			}
		}

		if (op == 6) {
			if (x != -1 && y != -1) {
				g2 = (Graphics2D) img.getGraphics();
				if (aa == true) {
					g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
							RenderingHints.VALUE_ANTIALIAS_ON);
				} else {
					g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
							RenderingHints.VALUE_ANTIALIAS_OFF);
				}
				g2.setColor(c);

				g2.drawLine(x, y, e.getX(), e.getY());
				repaint();
			}
		}

		if (op == 2) {
			if (x != -1 && y != -1) {
				g2 = (Graphics2D) img.getGraphics();
				if (aa == true) {
					g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
							RenderingHints.VALUE_ANTIALIAS_ON);
				} else {
					g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
							RenderingHints.VALUE_ANTIALIAS_OFF);
				}
				g2.setColor(Color.WHITE);
				g2.setStroke(new BasicStroke(strokeSize, BasicStroke.CAP_ROUND,
						BasicStroke.JOIN_MITER));

				g2.drawLine(x, y, e.getX(), e.getY());
				repaint();
			}
		}

		if (op == 7) {
			if (x != -1 && y != -1) {
				g2 = (Graphics2D) img.getGraphics();
				if (aa == true) {
					g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
							RenderingHints.VALUE_ANTIALIAS_ON);
				} else {
					g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
							RenderingHints.VALUE_ANTIALIAS_OFF);
				}
				g2.setColor(c);
				g2.setStroke(new BasicStroke(strokeSize, BasicStroke.CAP_ROUND,
						BasicStroke.JOIN_MITER));

				g2.drawLine(x, y, e.getX(), e.getY());
				repaint();
			}
		}

		if (op == 8) {

			if (x != -1 && y != -1) {
				g2 = (Graphics2D) img.getGraphics();
				if (aa == true) {
					g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
							RenderingHints.VALUE_ANTIALIAS_ON);
				} else {
					g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
							RenderingHints.VALUE_ANTIALIAS_OFF);
				}
				g2.setColor(c);
				g2.setStroke(new BasicStroke(strokeSize, BasicStroke.CAP_ROUND,
						BasicStroke.JOIN_MITER));

				for (int i = 0; i < strokeSize; i++) {
					Boolean vz = (int) Math.random() * 2 == 1;
					int tsx = (int) (Math.random() * strokeSize);
					int tsy = (int) (Math.random() * strokeSize);
					if (vz == true) {
						tsx = -tsx;
					}
					vz = (int) Math.random() * 2 == 1;
					if (vz == true) {
						tsy = -tsy;
					}
					g2.drawOval(e.getX() + tsx, e.getY() + tsy, 1, 1);
				}
				repaint();
			}
		}

		x = e.getX();
		y = e.getY();
	}

bin mir ziemlich sicher dass der Fehler hier wo auftritt, habe ja scho debugging versucht

mfg
 
S

SlaterB

Gast
public void paintComponent(Graphics g) {
super.paintComponent(g)

// dein Code
}
 

Wildcard

Top Contributor
Dein eigentliches Problem verstehe ich zwar nicht wirklich, aber man ruft eigentlich niemals getGraphics auf eine JComponent auf. Alles was du auf so einem 'gestohlenen' Graphics Objekt zeichnest ist flüchtig, wenn du zB ein anderes Fenster drüber ziehst, ist deine Zeichnung weg.
Da du also einen Großteil deines Programms direkt neu schreiben kannst, erledigt sich dein Problem ja vielleicht von selbst.
 

Arbon

Bekanntes Mitglied
Das hast du falsch Verstanden Wildcard, teilweise soll ja auf die JComponent gezeichnet werden, da nicht alles dauerhaft gezeichnet sein soll. Das was dauerhaft sein wird, zeichne ich ja eh in das Image. trotzdem danke

besonderen dank an slaterB, jetzt geht es.
 
S

SlaterB

Gast
auch was nicht dauerhaft gezeichnet werden soll, gehört normalerweise in die paintComponent-Methode,

aber hoffentlich weißt du zumindest um die Besonderheiten
 

Wildcard

Top Contributor
Arbon hat gesagt.:
Das hast du falsch Verstanden Wildcard, teilweise soll ja auf die JComponent gezeichnet werden, da nicht alles dauerhaft gezeichnet sein soll. Das was dauerhaft sein wird, zeichne ich ja eh in das Image.
Es ist auch ok auf die JComponent zu zeichnen, aber eben in paintComponent und nicht mit getGraphics. Denn auch wenn du das nicht speichern willst, kann ich mir kaum vorstellen, dass alles verschwinden soll, sobald das Betriebssystem entscheidet, dass das Fenster neu gezeichnet werden muss.
 

André Uhres

Top Contributor
"img.getGraphics()" ist OK, da es nicht direkt die Graphics der Komponente betrifft.
DrawOnImage.java ist interessant, weil es die repaint(..)-Version mit den Argumenten benutzt
und mit Hilfe von "getClipBounds" immer nur den Teil des Bildes neu zeichnet, der verändert wurde,
anstatt jedesmal das gesamte Bild neu zu zeichnen.
Wenn man repaint(..) in einer Schleife aufruft, dann optimiert der RepaintManager automatisch,
indem er die verschiedenen Anträge möglichst zu einem einzigen zusammenfasst.
Wenn mehrfache Anträge zusammengefasst werden, ist das resultierende Updaterechteck
gleich der Vereinigung der Rechtecke, die in den zusammengefassten Anträgen enthalten sind.
Siehe auch: Malen in AWT und Swing (der Artikel beschreibt die AWT und Swing Malmechanismen im Einzelnen).
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Paint-Methode in anderer Klasse funktioniert nicht AWT, Swing, JavaFX & SWT 7
H 2D-Grafik Problem mit Paint AWT, Swing, JavaFX & SWT 1
frager2345 Warum paintComponent hier und nicht paint AWT, Swing, JavaFX & SWT 2
U Was ist der Unterschied von paint und paincomponent? AWT, Swing, JavaFX & SWT 3
L 2D-Grafik Swing paint|paintComponent AWT, Swing, JavaFX & SWT 2
krgewb 2D-Grafik paint-Methode wird zu oft ausgeführt AWT, Swing, JavaFX & SWT 5
S Zeichen ohne paint-Methode AWT, Swing, JavaFX & SWT 2
J Swing Wann brauche ich @Override vor der paint()-Methode? AWT, Swing, JavaFX & SWT 1
G Eine paint-Methode, 2 Welten? AWT, Swing, JavaFX & SWT 3
H Swing + Paint: Mehrere Objekte zeichnen lassen AWT, Swing, JavaFX & SWT 3
A paint-Methode aufrufen AWT, Swing, JavaFX & SWT 13
Xanny 2D-Grafik Beginner! Probleme mit Swing, Gprahics class und paint AWT, Swing, JavaFX & SWT 13
L Berechnungen in paint AWT, Swing, JavaFX & SWT 8
S Grafik: Programm kommt nicht zur paint()-Methode AWT, Swing, JavaFX & SWT 6
S 2 Paint-Methoden in einer Klasse ? AWT, Swing, JavaFX & SWT 2
J zwei Paint methoden in einer Klasse AWT, Swing, JavaFX & SWT 3
P Paint und paintComponent AWT, Swing, JavaFX & SWT 12
F 2D-Grafik Was ruft die Paint - Methode auf ? AWT, Swing, JavaFX & SWT 2
S JButton u. Label auf paint-Methode AWT, Swing, JavaFX & SWT 1
S 2 paint-Methoden in einer Klasse ? AWT, Swing, JavaFX & SWT 2
S Paint Methode ohne implements JPanel AWT, Swing, JavaFX & SWT 1
S Farbe ändern bei der paint-Methode AWT, Swing, JavaFX & SWT 5
J ActionListener soll auf paint() Methode zugreifen AWT, Swing, JavaFX & SWT 1
J Problem mit der paint Methode AWT, Swing, JavaFX & SWT 0
Junb 2D-Grafik paint() Methode bugt? AWT, Swing, JavaFX & SWT 2
C JFrame paint ohne hintergrund nutzen AWT, Swing, JavaFX & SWT 6
I Paint-Methode von nicht statischen Objekten aufrufen AWT, Swing, JavaFX & SWT 3
A Swing Paint mit Button Clear den Hintergrund säubern um wieder zeichnen zu können AWT, Swing, JavaFX & SWT 2
K 2D-Grafik Paint - Wie binde ich repaint ein? AWT, Swing, JavaFX & SWT 8
D JSlider "laggt" nach überschreiben der paint methode AWT, Swing, JavaFX & SWT 2
S paint() verzögern AWT, Swing, JavaFX & SWT 9
K AWT begrenzte anzahl paint aufrufe AWT, Swing, JavaFX & SWT 6
B Infolabel Probleme mit Paint() ? AWT, Swing, JavaFX & SWT 8
L AWT paint mit ArrayList und Iterator AWT, Swing, JavaFX & SWT 3
Furtano AWT paint braucht ein Graphics Objekt ? AWT, Swing, JavaFX & SWT 2
L Swing 64bit Problem mit paint/paintComponent AWT, Swing, JavaFX & SWT 7
A Paint Methode externer auruf AWT, Swing, JavaFX & SWT 5
T JFrame und paint() AWT, Swing, JavaFX & SWT 5
B Ablauf der paint-Methoden von JComponents AWT, Swing, JavaFX & SWT 20
J AWT Methode paint() AWT, Swing, JavaFX & SWT 4
F 2D-Grafik Hostkomponentengröße in paint AWT, Swing, JavaFX & SWT 2
L JFrame an Paint-Inhalt anpassen AWT, Swing, JavaFX & SWT 6
E Warum übermalt paint das ganze Fenster? AWT, Swing, JavaFX & SWT 15
X Bild via FileChooser in paint-Methode laden AWT, Swing, JavaFX & SWT 2
T paint() wird nicht aufgerufen AWT, Swing, JavaFX & SWT 8
M JMenuBar im Applet und paint AWT, Swing, JavaFX & SWT 9
G paint-Methode kopiert GUI AWT, Swing, JavaFX & SWT 14
H paint überlappend AWT, Swing, JavaFX & SWT 5
E paint AWT, Swing, JavaFX & SWT 3
H Swing paint() von JPanel wird nicht aufgerufen AWT, Swing, JavaFX & SWT 10
L AWT Paint(g) im Listener aufrufen AWT, Swing, JavaFX & SWT 2
S JCheckBox Paint AWT, Swing, JavaFX & SWT 7
F AWT Probleme mit der paint() methode AWT, Swing, JavaFX & SWT 2
C Unterschiedlicher Aufruf der paint() Methode ? (AWT/Swing) AWT, Swing, JavaFX & SWT 2
L Problem mit paint Methode und Bild AWT, Swing, JavaFX & SWT 7
F Swing Paint mit Canvas Element AWT, Swing, JavaFX & SWT 35
K AWT paint wird nicht aufgerufen AWT, Swing, JavaFX & SWT 7
R LayoutManager Image Paint + Text Panel AWT, Swing, JavaFX & SWT 10
F paint-Methode des JComboboxEditorComponent AWT, Swing, JavaFX & SWT 2
S Threads in einen Frame zeichnen lassen (Paint()?!) AWT, Swing, JavaFX & SWT 5
radiac Swing JFrame - paint(g) - FrameObjects bei activeRendering AWT, Swing, JavaFX & SWT 3
I AWT paint() in MouseEvent aufrufen klappt nicht AWT, Swing, JavaFX & SWT 8
T paint() wird zweimal ausgeführt AWT, Swing, JavaFX & SWT 6
hdi Swing JLabel & paint-Methode gemixt - wie schlimm wirklich? AWT, Swing, JavaFX & SWT 5
N Paint methode anhalten und neustarten AWT, Swing, JavaFX & SWT 5
H AWT Wann ist paint() fertig? AWT, Swing, JavaFX & SWT 7
R [gelöst]Fenster schließen - trotz Endlosschleife in der Paint-Methode? AWT, Swing, JavaFX & SWT 3
W Steuerelemente und paint() in einem JPanel AWT, Swing, JavaFX & SWT 3
M Allgemeines zur paint Methode AWT, Swing, JavaFX & SWT 5
M AWT Component/Canvas erzeugt unerwünschten Rahmen bei paint AWT, Swing, JavaFX & SWT 3
T Dialog ohne Frame, direktes paint in graphics AWT, Swing, JavaFX & SWT 5
G Probleme mit repaint / paint AWT, Swing, JavaFX & SWT 6
A paint()-Methode für Videoexport nutzen AWT, Swing, JavaFX & SWT 2
K repaint() ruft paint() nicht auf AWT, Swing, JavaFX & SWT 14
J Canvas / paint() AWT, Swing, JavaFX & SWT 2
bugmenot paint() verzögert ausgeführt? AWT, Swing, JavaFX & SWT 4
S paint() in anderen Methoden AWT, Swing, JavaFX & SWT 5
J getFontMetrics außerhalb von paint(Graphics g) AWT, Swing, JavaFX & SWT 8
D Paint() Methode aus einer anderen Klasse aufrufen AWT, Swing, JavaFX & SWT 6
H paint verwenden AWT, Swing, JavaFX & SWT 3
S java.awt.Component und paint() AWT, Swing, JavaFX & SWT 4
L Dynamisches Ändern der Größe in JPanel mit paint()-Methode AWT, Swing, JavaFX & SWT 8
G JScrollPane mit "paint" scrollt nicht AWT, Swing, JavaFX & SWT 2
C paint-Methode überschreiben AWT, Swing, JavaFX & SWT 19
hdi meine paint-methode macht faxen? AWT, Swing, JavaFX & SWT 21
T Variable Menge an Bildern außerhalb paint() zeichnen? AWT, Swing, JavaFX & SWT 2
G Paint und Buttons AWT, Swing, JavaFX & SWT 8
G JFrame JPanel und Paint(Image)? AWT, Swing, JavaFX & SWT 6
S Programm aufgrund von paint() zu langsam AWT, Swing, JavaFX & SWT 18
G paint() wird aufgerufen, aber nicht angezeigt AWT, Swing, JavaFX & SWT 10
G 2x Graphics in einer paint() miteinander verbinden AWT, Swing, JavaFX & SWT 11
M Probleme mit paint() aus JFrame AWT, Swing, JavaFX & SWT 2
G paint() Methode aus anderer klasse aufrufen? AWT, Swing, JavaFX & SWT 6
G Frage zum paint Prozess AWT, Swing, JavaFX & SWT 3
D JPanel und Paint AWT, Swing, JavaFX & SWT 2
B Gui und Zeichnen (paint ? ) AWT, Swing, JavaFX & SWT 4
L Anzeigen von fotos: ImageIcon oder BufferedImage + paint() ? AWT, Swing, JavaFX & SWT 5
G Frage zur paint-Methode (AWT) AWT, Swing, JavaFX & SWT 9
B Button anzeigen bei überschrieber paint() AWT, Swing, JavaFX & SWT 12
N paint Methode im JFrame AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben