Graphics2D - DrawRect - Warum Linien teilweise gefüllt?

C

chipper

Gast
Java:
public void paint(Graphics g)
  {
     Graphics2D g2d= (Graphics2D) g;
     int breite = getWidth();
     int hoehe = getHeight();
     int rot, gruen, blau;
     Color farbe;
     int x1, y1, r_breite, r_hoehe;
     for ( int i = 1; i <= 5; i++ )
     {
       rot = (int) (Math.random() * 255);
       gruen = (int) (Math.random() * 255);
       blau = (int) (Math.random() * 255);
       farbe = new Color ( rot, gruen, blau );
       g2d.setColor(farbe);

       x1 = (int) (Math.random() * breite);
       y1 = (int) (Math.random() * hoehe);
       r_breite = (int) (breite - x1 - Math.random() * breite);
       r_hoehe = (int) (hoehe - y1 - Math.random() * hoehe);

       g2d.drawRect(x1, y1, r_breite, r_hoehe );

     }
  }

Wenn ich das Programm starte, erhalte ich Rechtecke, die zum Teil mit Farbe ausgefüllt sind und zum Teil nur farbige Rahmen haben, aber eigentlich dürften doch alle nur farbige Rahmen bekommen oder?
 
C

chipper

Gast
Komisch, bei mir jedes Mal.
Ich habe auch ein Problem mit der Java Ausgabe, manchmal ist das Fenster einfach schwarz und dass bei mir die Rechtecke gefüllt sind ist auch komisch, woran kann das liegen ?
 

Kr0e

Gesperrter Benutzer
uhralter Treiber ? uhralte JVM ? uhralte Grafikkarte ? uhralte Windowsversion ? evt -Dsun.java2d.opengl=true an obwohls nicht unterstützt wird ?
 

Volvagia

Top Contributor
Funktioniert das?

Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class DrawRectangle extends JComponent
{
	private static Rec[] rects = new Rec[5];
	
	public void paintComponent(Graphics g)
	{
		for(Rec rec:rects)
		{
			g.setColor(rec.getColor());
			
			int x = rec.x;
			int y = rec.y;
			int w = rec.width;
			int h = rec.height;
			
			g.drawLine(x, y, x + w, y); 
			g.drawLine(x, y, x, y + h);
			g.drawLine(x + w, y, x + w, y + h); 
			g.drawLine(x, y + h, x + w, y + h);
		}
		super.paintComponent(g);
	}
	
	public static void main(String[] args)
	{
		for(int i = 0, size = rects.length; i < size; i++)
			rects[i] = new Rec();
		
		
		final DrawRectangle dr = new DrawRectangle();
		JFrame frame = new JFrame();
		frame.add(dr, BorderLayout.CENTER);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(200, 200);
		
		JButton button = new JButton("Recompute");
		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e)
			{
				dr.computing();
			}
		});
		frame.add(button, BorderLayout.SOUTH);
		
		dr.computing();
		frame.setVisible(true);
	}
	private void computing()
	{
		int breite = getWidth();
		int hoehe = getHeight();
		
		for(Rec rec:rects)
		{
			int rot = (int) (Math.random() * 255);
			int gruen = (int) (Math.random() * 255);
			int blau = (int) (Math.random() * 255);
			Color farbe = new Color(rot, gruen, blau);
			rec.setColor(farbe);
	 
			rec.x = (int) (Math.random() * breite);
			rec.y = (int) (Math.random() * hoehe);
			rec.width = (int) (breite - rec.x - Math.random() * breite);
			rec.height = (int) (hoehe - rec.y - Math.random() * hoehe);
		}
		repaint();
	}
	private static class Rec extends Rectangle
	{
		private Color color;
		
		private Rec()
		{
			super();
		}
		public void setColor(Color color)
		{
			this.color = color;
		}
		public Color getColor()
		{
			return color;
		}
	}
}
 
C

chipper

Gast
Mit Ergänzung des folgenden Befehls werden die Rechtecke nicht mehr gefüllt, wie auch immer das zusammenhängt.
Allerdings verrutschen die Rechtecke dadurch, also über dem Rand oder gar nicht sichtbar.

Java:
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                        RenderingHints.VALUE_ANTIALIAS_ON);
 

Volvagia

Top Contributor
Ich weiß es nicht, ich zeichne einfach 4 Linien. #drawRect macht aber genau das Selbe:

Java:
   public void drawRect(int x, int y, int width, int height) {
	if ((width < 0) || (height < 0)) {
	    return;
	}

	if (height == 0 || width == 0) {
	    drawLine(x, y, x + width, y + height);
	} else {
	    drawLine(x, y, x + width - 1, y);
	    drawLine(x + width, y, x + width, y + height - 1);
	    drawLine(x + width, y + height, x + 1, y + height);
	    drawLine(x, y + height, x, y + 1);
	}
    }

Außer, dass ich vergessen habe die Positionen um 1 je nach dem zu ergänzen.
 

Volvagia

Top Contributor
Was ist mit dem?

Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;

public class DrawRectangle extends JComponent
{
	private static Rec[] rects = new Rec[50];
	
	public void paintComponent(Graphics g)
	{
		for(Rec rec:rects)
		{
			g.setColor(rec.getColor());
			g.drawRect(rec.x, rec.y, rec.width, rec.height);
		}
		super.paintComponent(g);
		g.dispose();
	}
	
	public static void main(String[] args)
	{
		for(int i = 0, size = rects.length; i < size; i++)
			rects[i] = new Rec();
		
		
		final DrawRectangle dr = new DrawRectangle();
		JFrame frame = new JFrame();
		frame.add(dr, BorderLayout.CENTER);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(200, 200);
		
		JButton button = new JButton("Recompute");
		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e)
			{
				dr.computing();
			}
		});
		frame.add(button, BorderLayout.SOUTH);
		
		dr.computing();
		frame.setVisible(true);
	}
	private void computing()
	{
		int breite = getWidth();
		int hoehe = getHeight();
		
		if(breite == 0 || hoehe == 0)
			return;
		
		for(Rec rec:rects)
		{
			int rot = (int) (Math.random() * 255);
			int gruen = (int) (Math.random() * 255);
			int blau = (int) (Math.random() * 255);
			Color farbe = new Color(rot, gruen, blau);
			rec.setColor(farbe);
	 
			do
			{
				rec.x = (int) (Math.random() * breite);
				rec.y = (int) (Math.random() * hoehe);
				rec.width = (int) (breite - rec.x - Math.random() * breite);
				rec.height = (int) (hoehe - rec.y - Math.random() * hoehe);
			}
			while(rec.width < 1 || rec.height < 1);
		}
		repaint();
	}
	private static class Rec extends Rectangle
	{
		private Color color;
		
		private Rec()
		{
			super();
		}
		public void setColor(Color color)
		{
			this.color = color;
		}
		public Color getColor()
		{
			return color;
		}
	}
}

Wenn ja, dann lag es daran, dass w und h oft negativ waren. Dann sollte er zwar überhaupt nichts machen, aber kP. ???:L
 
C

chipper

Gast
Dein Code ist für mich noch zu kompliziert, wo müsste ich denn da den Befehl
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);

einfügen? :eek:
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Graphics2D Objekt mir der Maus erstellen Java Basics - Anfänger-Themen 5
K Zwei Fragen zu Graphics/Graphics2D Java Basics - Anfänger-Themen 5
Mr. Pink Graphics2D in anderer Methode aufrufen Java Basics - Anfänger-Themen 6
P Graphics2D Uhr refreshen Java Basics - Anfänger-Themen 2
B Erste Schritte Drehen in Graphics2d Java Basics - Anfänger-Themen 2
T Threads Thread & Graphics2D Java Basics - Anfänger-Themen 8
D Graphics2D (Welle darstellen) Java Basics - Anfänger-Themen 2
F Graphics2D nützlich für R³? Java Basics - Anfänger-Themen 11
C Graphics2D auf anderes Graphics2D übertragen Java Basics - Anfänger-Themen 5
K Graphics2D und BufferedImage Java Basics - Anfänger-Themen 3
P Graphics2D.drawString: Zahlen rechtsbündig ausrichten? Java Basics - Anfänger-Themen 2
Z Farbwechsel JButton mit Graphics2D Java Basics - Anfänger-Themen 7
T Anfänge mit Graphics2D Java Basics - Anfänger-Themen 15
X Kreize zeichnen in Graphics2D Java Basics - Anfänger-Themen 2
D Graphics2D.drawImage(Image, int, int, ?); Java Basics - Anfänger-Themen 2
Kenan89 Java drawRect Java Basics - Anfänger-Themen 3
J Auf einem JLabel Linien Malen Java Basics - Anfänger-Themen 1
milan123 das ist meine aufgabe ich hab das problem das bei mir Wenn ich die Richtung der Linien verändern will und drei davon sind richtig, verändere ich die 4 Java Basics - Anfänger-Themen 3
P JFrame, Linien zeichnen, MouseListener Java Basics - Anfänger-Themen 2
R Warum werden hier nur die grün und orangen Linien ausgegeben und der Rest unten nicht? Java Basics - Anfänger-Themen 5
B Wie kann ich Linien rekursiv zeichnen? Java Basics - Anfänger-Themen 4
F Linien und Kurven erkennen Java Basics - Anfänger-Themen 2
H Grafikaufgabe mit Linien und Kreisen Java Basics - Anfänger-Themen 5
P Per Button, Linien Hinzufügen und bearbeiten Java Basics - Anfänger-Themen 30
P Linien in 2.5D Java Basics - Anfänger-Themen 8
A Blitze mit Linien zeichnen Java Basics - Anfänger-Themen 15
R Kurze Linien alle x-Pixel Java Basics - Anfänger-Themen 2
B systemausgelöstes Uebermalen von Linien Java Basics - Anfänger-Themen 7
S linien Java Basics - Anfänger-Themen 3
N Linien zeichnen Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben