2D-Objekte werden nicht vollständig gezeichnet

  • Themenstarter Themenstarter Guest
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo,

ich möchte in einem JFrame verschiedene 2D-Objekte zeichnen. Zum Zeichnen benutze ich eine eigene Klasse, die von der Klasse JComponent abgeleitet ist. In dieser überschreibe ich die paintComponent()-Methode, die für das Zeichnen zuständig ist. Soweit so gut.
Das Problem ist aber nun, dass die dargestellten Objekte (z. B. Rechtecke, Ovale, ...) nicht vollständig gezeichnet werden. Von einem Rechteck werden nur 2 Seiten gezeichnet, die Linke und die Obere. Ein Oval z. B. hat auf der rechten und unteren Seite eine Lücke.

Habe schon alles mögliche ausprobiert, aber leider ohne Erfolg und bin für jede Hilfe und jeden Hinweis dankbar. Es scheint sich um ein generelles Probelm zu handeln, evtl. auch was mein Verständnis dafür betrifft.

Hier aber erst mal der Code (funktionsfähig), die Klasse mit der main():

Code:
package layout;

import javax.swing.JFrame;


public class GraphicsLayout extends JFrame {
//	private DrawerPainter.Shape paint;
 
	public GraphicsLayout() {
		super("GraphicsLayout");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(800, 600);
		setLayout(null);
		DrawerPainter drawerPainter = new DrawerPainter();
		drawerPainter.setLocation(10, 10);
		drawerPainter.setSize(100, 100);
		getContentPane().add(drawerPainter);
//-------------------- inner class --------------------
//		paint = drawerPainter.new Shape();
//		paint.setLocation(50, 10);
//		paint.setSize(200, 100);
//		getContentPane().add(paint);
//-------------------- inner class --------------------
	}
 
	public static void main(String[] args) {
		GraphicsLayout graphicsLayout = new GraphicsLayout();
		graphicsLayout.setVisible(true);
		graphicsLayout.repaint();
	}
}


...und die Klasse zum Zeichnen:

Code:
package layout;
 
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
 
import javax.swing.JComponent;
 
public class DrawerPainter extends JComponent {
	public DrawerPainter() {
	}
 
	protected void paintComponent(Graphics g) {
		Graphics2D g2d = (Graphics2D) g;
		g2d.setBackground(Color.ORANGE);
		g2d.drawRect(getX(), getY(), getWidth(), getHeight());
	}
//	class Shape extends JComponent {
//		protected void paintComponent(Graphics g) {
//			Graphics2D g2d = (Graphics2D) g;
//			g2d.drawRect(getX(), getY(), getWidth(), getHeight());
//		}
//	}
}


Hoffe auf viele Hinweise/Lösungsvorschläge!
Schöne Grüße
 
Anonymous hat gesagt.:
Code:
g2d.drawRect(getX(), getY(), getWidth(), getHeight());

Damti zeichnest DU ein rechteck in der Breite und Höhe der Zeichenfläche. Da du auf der zeichen Fläche aber nicht bei den Koordinaten 0/0 anfängst zu zeichnen siehst Du auch nicht alles. Ersetze mal getX() und getY() durch 0, dann solltest Du es ganz sehen.
 
OK, hab mir schon gedacht, dass ich da irgend ein Problem mit dem Verständis hab. Ich war der Annahme mit den Methoden setLocation() und setSize() lege ich die Abmessungen des Rechtecks fest, die ich dann einfach in der paintComponent()-Methode abfrage.
Also wenn ich vom Ursprung (0|0) zeichne, wird das Objekt fast komplett gezeichnet. Es handelt sich nur noch um einen Pixel der das komplette Zeichnen verhindert (anscheinend ist das zu zeichnende Object einfach einen Pixel größer als die Zeichenfläche). Wenn ich also von Breite und Höhe je 1 Pixel abziehe erhalte ich einkomplettes Object:

Code:
g2d.drawRect(0, 0, getWidth() - 1, getHeight() - 1);

Daher noch eine Frage: Lässt sich das auch ohne diesen Behelf realisieren? Es muss doch möglich sein das Objekt ohne eine nachträgliche Korrektur zu zeichnen. Wie wird die Zeichenfläche fest gelegt?

Danke für die Hilfe!
 
Mit "setSize" und "setLocation" legst du die Position und Grösse der JComponent fest. Wenn du innerhalb einer Component zeichnest, beginnt das Koordinatensystem immer oben links mit 0/0, und hat eine Grösse von "getWidth"/"getHeight".

Das bedeutet, du musst dich überhaupt nicht darum kümmern, wo deine Component wie angezeigt ist, du kannst ganz lokal deine paar Striche zeichnen, und das System wird sie schon an die richtige Stelle setzen.

Bei "drawRect" ist es so, dass man mit x/y die linke obere Ecke angibt, und "x+width"/"y+height" wird die untere rechte Ecke.
Wenn deine Component nun die Breite 5 hat, ist die grösste x-Koordianten der sichtbaren Pixel 4 (weil man bei 0 zu zählen beginnt), dementsprechend musst du dem "drawRect" als Breite 4 übergeben.
 
Ah, ja. Jetzt wird mir das ganze klar - keine Ahnung warum ich nicht selber drauf gekommen bin. Funktioniert jetzt einwandfrei...

Vielen Dank für die Hilfe!
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben