Verständnisfrage zum Programm

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hi!!
Habe im Netz ein Programm gefunden, das einen Dreieck rotieren läßt. Ich verstehe da ein wenig nicht im Program.
Code:
import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;

public class RotatePicture extends JPanel
{
  
  private static final int xa = 190;
  private static final int ya = 180;
  
  private double angle;
 
  private GeneralPath path;
  private Rectangle2D rect = new Rectangle2D.Double(100,100,50,50);
 
  private Ellipse2D anker = new Ellipse2D.Double(xa+8,ya+8,16,16);
  
  public static void main(String[] args) throws InterruptedException
  {
    JFrame frame = new JFrame();
    Container contPane = frame.getContentPane();
    RotatePicture myPicture = new RotatePicture();

    contPane.add(myPicture);
    frame.setSize(400,400);
    frame.setVisible(true);
    
    for (int i = 1; i <= 1500; i++)
    {
      
      myPicture.rotate(Math.PI/90);
      
      Thread.sleep(10);
    }
  }
  public RotatePicture()
  {
    super();
    
    path = new GeneralPath();
    path.moveTo(100,100);
    path.lineTo(350,200);
    path.lineTo(200,300);
    
    path.closePath();
    
    setBackground(Color.BLUE);
  }
  public void paint(Graphics g)
  {
    Graphics2D g2 = (Graphics2D) g;
    super.paint(g);
    
   
    AffineTransform rotate = AffineTransform.getRotateInstance(angle,xa,ya);
    
    path.transform(rotate);

    g2.setColor(Color.WHITE);
    g2.fill(anker);
    g2.setColor(Color.YELLOW);
    g2.setTransform(rotate);
    g2.fill(path);
    g2.setColor(Color.RED);
    g2.fill(rect);
  }
  public void rotate(double angle)
  {
    this.angle = angle;
    
    repaint();
  }
}

Also was ich nicht verstehe ist folgendes. Das Neuzeichnen des Dreiecks, das mittels der Schleife ab Zeile 28 realisiert wird.
Wie funktioniert das Neuzeichnen??
Code:
myPicture.rotate(Math.PI/90);
Mit rotate wird ein Winkel übegeben, das ist klar...und mit repaint() wird neugezeichnet. Was geschieht intern wenn ich myPicture.rotate(Math.PI/90) in der Schleife aufrufe? Wie wird das Objekt neugezeichnet, wie funktioniert das?
Ich greife auf das Objekt zu, und nicht auf die Figur selbst...das verstehe ich nicht ganz.
Gruß
 

LoN_Nemesis

Bekanntes Mitglied
Mit repaint() fordest du einfach dazu auf, möglichst bald die paint(Graphics g) Methode aufzurufen. Dort wird dann auch der Winkel verarbeitet, denn du vorher mit .rotate gesetzt hast. Wenn du wissen willst wie das intern funktioniert, dann musst du die AffineTransform Klasse anschauen.
 
G

Guest

Gast
Hallo!
Wie Affine Trafo funktioniert ist mir eigentlich klar. Was ich an dem Programm, und das ist eher objektorientorientiertes Problem nicht verstehe ist....das immer das Objekt mit dem Winkel in der Schleife aufgerufen wird. Wieso aber nicht die Figur selbst, also das Dreieck. Es wird ein Objekt (myPicture) der Klasse erzeugt und dieser wird ja in der Schleife verwendet. Wie funktioniert das technisch gesehen?
 
G

Gast

Gast
Ich bins nochmal. Ich versuche mein Verständnisproblem anders zu schildern. Es wird ein Objekt erzeugt (myPicture). Es wird auch eine Figur erzeugt (path). Ich füge diese aber nicht dem Objekt hinzu. In der Schleife wird aber das Objekt mit dem Winkel aufgerufen. Wo springt das Porgamm hin wenn ich myPicture.rotate (Math.PI/90) aufrufe???
 
S

SlaterB

Gast
etwas kürzer wird das ganze so:

Code:
import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.geom.GeneralPath;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class RotatePicture extends JPanel {

	private static final int xa = 190;
	private static final int ya = 180;
	private double angle = Math.PI / 90;
	private AffineTransform rotate =
		AffineTransform.getRotateInstance(angle, xa, ya);
	private GeneralPath path;

	public RotatePicture() {
		super();

		path = new GeneralPath();
		path.moveTo(100, 100);
		path.lineTo(350, 200);
		path.lineTo(200, 300);

		path.closePath();

		setBackground(Color.BLUE);
	}
	public void rotate() {
		path.transform(rotate);
	}

	public void paint(Graphics g) {
		super.paint(g);
		Graphics2D g2 = (Graphics2D) g;

		g2.setColor(Color.YELLOW);
		g2.fill(path);
	}

	public static void main(String[] args) throws InterruptedException {
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container contPane = frame.getContentPane();
		RotatePicture myPicture = new RotatePicture();

		contPane.add(myPicture);
		frame.setSize(400, 400);
		frame.setVisible(true);

		for (int i = 1; i <= 1500; i++) {
			myPicture.rotate();
			myPicture.repaint();
			Thread.sleep(10);
		}
	}
}

path.transform ist der entscheidene Schritt,
der stand bisher böserweise in der paint-Operation

und path wird in paint gezeichnet, das sollte klar sein
 
G

Gast

Gast
Danke für den Code. Jetzt ist es ein bisschen übersichtlicher. Was ich immer noch nicht verstehe ist die Zeile myPicture.rotate ().
Was passiert da genau? Woher weiß das Objekt myPicture, dass das path gedreht werden soll???
 
G

Gast

Gast
bzw. wird nach der methode rotate gleich die Methode paint aufgerufen??
 

Marco13

Top Contributor
Hi

Wenn die Methode "rotate" ausgefrufen wird, passiert (in der ursprünglichen Version des Programms) erstmal fast garnichts. Es wird NUR ein Winkel neu gesetzt, und ein neuzeichnen getriggert. Die Methode könnte also auch "setAngleAndTriggerRepaint" heißen. Es wird nicht rotiert. Die Kordinaten des Dreiecks (path) bleiben unverändert.

Erst wenn neu gezeichnet wird, passiert was interessantes: Dann wird nämlich aus dem aktuellen Winkel die Dreh-Transformation berechnet. Diese wird verwendet, um das Dreieck zu drehen. (Irgendwie habe ich aber Zwiefel, dass das in der rsprünglichen Version richtig fuktioniert hat, aber habs nicht getestet).

bzw. wird nach der methode rotate gleich die Methode paint aufgerufen??

Jein :wink: Etwas vereinfachte (aber hoffentlich verständliche) Erklärung:
In der ursprünglichen rotate-Methode wird u.a. "repaint" aufgerufen. Damit wird nur gesagt: "Zeichne neu, sobald du Zeit dafür hast". Dieser "Neuzeichnen-Befehl" liegt dann in einer Warteschlange (Event-Queue). Diese wird abgearbeitet, und irgendwann ist der "Neuzeichnen-Befehl" an der Reihe. Dann wird (sozusagen "vom Betriebssystem") die paint-Methode aufgerufen.
Es kann also sein, dass nach dem aufruf von "rotate" noch ein paar Millisekunden vergehen, und erst noch andere (wichtigere) Sachen gemacht werden, bevor wirklich "paint" aufgerufen wird. Aber das ist schon alles richtig so.

bye

P.S: Fast richtig: Eigentlich sollte man nicht "paint", sondern "paintComponent" überschreiben!
 
G

Gast

Gast
Danke Marco...super verständlich, aber eigentlich schon zu weit :) .
Ich möchte die Sache an den Wurzeln packen. Was passiert systemtechnisch wenn ich myPicture.rotate() aufrufe???( Ich bin Anfänger ). Mir gehts immernoch darum, wie die Figur gezeichnet wird. Mit der Zeile myPicture.rotate() wird die Methode rotate aufgerufen und diese rotiert die Figur path. Gehts dann weiter sequenziell in die Zeile 37 oder wie geht das???
 
G

Guest

Gast
Und noch eine Frage:
Code:
 public RotatePicture() {
      super();

      path = new GeneralPath();
      path.moveTo(100, 100);
      path.lineTo(350, 200);
      path.lineTo(200, 300);

      path.closePath();

      setBackground(Color.BLUE);

Kann ich die Figur deswegen rotieren, also mit myPicture.rotate() weil durch diesen Constructoraufruf die Figur quasi ins Objekt myPicture, dieses ja von RotatePicture erzeugt wird implementiert wird.
 
S

SlaterB

Gast
in meinem Programm wird in rotate nur das Path-Dreieck rotiert,
danach ist Ende, wieso sollte zu Zeile 37 gesprungen werden?

stände da wie früher am Ende noch ein repaint(), dann würde irgendwann auch paint() ausgeführt,

das ist in meinem Programm letztlich auch so,
das repaint() steht nun aber nach dem rotate()-Aufruf in der main, Zeile 57,

man kann also grob sagen: ja, als nächstes wird paint ausgeführt,
aber nur wegen des repaint()-Aufrufs, nicht von selbst,

die Figur wird in paint gezeichnet, sie ist auch passenderweise in myPicture enthalten,
was soll man da sagen außer: ja, es ist so?
weil sie in myPicture drin ist, wird sie durch myPicture.rotate() gedreht, ja,


das ist doch ein normales Vorgehen, oder was kommt dir da seltsam vor?

path ist nun mal ein Grafik-Objekt, keine JComponent die man einfach irgendwo einfügt und dann ist gut,
wann immer path neugezeichnet wird, dann nur durch
Graphics2D g2 = (Graphics2D) g;
g2.setColor(Color.YELLOW);
g2.fill(path);
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Verständnisfrage zu folgendem Programm Java Basics - Anfänger-Themen 2
G Verständnisfrage beim Java Programm Java Basics - Anfänger-Themen 7
J int-Verständnisfrage Java Basics - Anfänger-Themen 12
M Java Iterator Verständnisfrage Java Basics - Anfänger-Themen 6
A Verständnisfrage Java Basics - Anfänger-Themen 12
M Verständnisfrage: Warum wird die Datei ohne Inhalt übertragen Java Basics - Anfänger-Themen 3
P Verständnisfrage: PageFactory.initElements Java Basics - Anfänger-Themen 2
R do while Schleife Verständnisfrage Java Basics - Anfänger-Themen 2
G while.next() Verständnisfrage Java Basics - Anfänger-Themen 16
Vivien Kurze Verständnisfrage zu Java Point aus java.awt.* Java Basics - Anfänger-Themen 5
C Erste Schritte Anfänger Verständnisfrage zum Compiler Java Basics - Anfänger-Themen 31
T Verständnisfrage Objekt Getter Setter Java Basics - Anfänger-Themen 102
K Verständnisfrage Server/Client BufferedReader, PrintWriter Java Basics - Anfänger-Themen 2
Der Grütz Verständnisfrage zu Übung aus Java Kurs - Schaltjahr bestimmen Java Basics - Anfänger-Themen 2
J Verständnisfrage zu throws neben Funktionen Java Basics - Anfänger-Themen 2
TimoN11 Verständnisfrage bei Aufgabe Java Basics - Anfänger-Themen 2
P Verständnisfrage zum Mapping Java Basics - Anfänger-Themen 3
M Java Version Verständnisfrage Java Basics - Anfänger-Themen 16
M Verständnisfrage zu eine Online Aufgabe Java Basics - Anfänger-Themen 7
T Verständnisfrage zur Konsolenausgabe Java Basics - Anfänger-Themen 2
M Verständnisfrage zu Generics Java Basics - Anfänger-Themen 7
D Verständnisfrage zur Modellierung einer HDD Java Basics - Anfänger-Themen 17
W Methoden Verständnisfrage Vererbung von Methoden Java Basics - Anfänger-Themen 14
S Verständnisfrage lokale Ordnerpfade Java Basics - Anfänger-Themen 1
T Verständnisfrage zu Interfaces Java Basics - Anfänger-Themen 7
J Java Starthilfe Verständnisfrage Aufgabe Java Basics - Anfänger-Themen 2
O Anfänger, Verständnisfrage Java Basics - Anfänger-Themen 3
C Verständnisfrage zu Modulo Java Basics - Anfänger-Themen 6
C Verständnisfrage bezüglich der Do-While Schleife Java Basics - Anfänger-Themen 9
L Verständnisfrage - Speicherabbild Java Basics - Anfänger-Themen 4
melly_ Verständnisfrage zu args Java Basics - Anfänger-Themen 3
A Variablen Verständnisfrage bzgl. Variablen/Referenzen Java Basics - Anfänger-Themen 3
K Verständnisfrage eines Abschnitts Java Basics - Anfänger-Themen 6
K Rekursion Verständnisfrage Java Basics - Anfänger-Themen 19
S Modell View Controller Verständnisfrage Java Basics - Anfänger-Themen 24
J Superklassen Konstruktor Verständnisfrage Java Basics - Anfänger-Themen 1
JavaTalksToMe Erste Schritte Println-Frage (Verständnisfrage) Java Basics - Anfänger-Themen 1
R Verständnisfrage zu Objekten u. Übergabeparameter Java Basics - Anfänger-Themen 8
G Collections Verständnisfrage zur For-Each-Schleife Java Basics - Anfänger-Themen 7
b1ck Interface Verständnisfrage zum GUI mit "swing" Java Basics - Anfänger-Themen 1
kilopack15 Verständnisfrage zur Verwendung von notify() bei Threads Java Basics - Anfänger-Themen 2
G Verständnisfrage zu for-each Java Basics - Anfänger-Themen 4
DontFeedTheTroll Erste Schritte Verständnisfrage zu If-Anweisung Java Basics - Anfänger-Themen 7
K Rekursion-Verständnisfrage Java Basics - Anfänger-Themen 4
J Java Server Pages - Verständnisfrage Java Basics - Anfänger-Themen 2
Z Verständnisfrage Anfängerprogramm Java Basics - Anfänger-Themen 0
T Verständnisfrage Zuweisungs-/arithmet. Operatoren Java Basics - Anfänger-Themen 2
G Methoden Verständnisfrage zur Methoden Java Basics - Anfänger-Themen 7
LionAge Kapselung, Verständnisfrage zur Objekterzeugung Java Basics - Anfänger-Themen 4
Z Verständnisfrage zum Multithreading Java Basics - Anfänger-Themen 3
R OOP / Verständnisfrage zum Konstuktor (siehe code) Java Basics - Anfänger-Themen 7
gamebreiti Verständnisfrage zu contains() Java Basics - Anfänger-Themen 10
A Verständnisfrage - Koordinatenumrechnung Java Basics - Anfänger-Themen 9
J Erste Schritte Verständnisfrage im Bezug auf das (richtige) Programmieren Java Basics - Anfänger-Themen 5
M Verständnisfrage zu JUnit Tests und private Methoden Java Basics - Anfänger-Themen 3
H Verständnisfrage Array Java Basics - Anfänger-Themen 2
I Interface Verständnisfrage Interfaces (Bsp.: Enumeration) Java Basics - Anfänger-Themen 2
I Verständnisfrage zu BridgePattern, Verwedung von super() Java Basics - Anfänger-Themen 4
P Verständnisfrage Java Basics - Anfänger-Themen 3
kaoZ Best Practice Verständnisfrage Listener bei lokalen Objekten Java Basics - Anfänger-Themen 8
D Input/Output Verständnisfrage Verzeichnis-/Dateiliste erstellen & Dateikonvertierung Java Basics - Anfänger-Themen 1
S Verständnisfrage zu Anweisungen und deren Wirkung Java Basics - Anfänger-Themen 7
H Verständnisfrage für oder Anweisung Java Basics - Anfänger-Themen 8
E Threads Verständnisfrage bzgl. Threads und Sleep Java Basics - Anfänger-Themen 2
T Erste Schritte Verständnisfrage: Getter und Setter Methoden Java Basics - Anfänger-Themen 3
H Verständnisfrage zu Java-Ausgabe Java Basics - Anfänger-Themen 3
S Verständnisfrage Java Basics - Anfänger-Themen 2
N Verständnisfrage Code Java Basics - Anfänger-Themen 8
B Verständnisfrage Java Basics - Anfänger-Themen 2
H Interface Comparable Verständnisfrage Java Basics - Anfänger-Themen 6
B Verständnisfrage Codezeile Java Basics - Anfänger-Themen 7
B Verständnisfrage:Beispielprogramm BlueJ Java Basics - Anfänger-Themen 3
M Kurze Verständnisfrage zu einer Java Aufgabe Java Basics - Anfänger-Themen 12
K Erste Schritte Kleine Verständnisfrage Java Basics - Anfänger-Themen 12
R Verständnisfrage Referenzvariablen in array Java Basics - Anfänger-Themen 3
M Verständnisfrage: Objekt erzeugen u. zuweisen Java Basics - Anfänger-Themen 16
I OOP Verständnisfrage zu Singelton Pattern Java Basics - Anfänger-Themen 21
M Verständnisfrage zu JPanel Java Basics - Anfänger-Themen 3
S Verständnisfrage: Exception Gebrauch Java Basics - Anfänger-Themen 2
R Verständnisfrage NPE Java Basics - Anfänger-Themen 5
M Verständnisfrage zur Zahlenumwandlung (Dezimal-->Dual) Java Basics - Anfänger-Themen 25
P Java Objekte - Verständnisfrage Java Basics - Anfänger-Themen 9
L Grundlegende Verständnisfrage Hasmap Referenzen Java Basics - Anfänger-Themen 4
S Verständnisfrage zu Interfaces Java Basics - Anfänger-Themen 2
VfL_Freak Verständnisfrage zur Klasse "TIMER" Java Basics - Anfänger-Themen 7
P Verständnisfrage zu Instanzen/Objekten Java Basics - Anfänger-Themen 9
M Verständnisfrage im Umgang mit Map Java Basics - Anfänger-Themen 10
K Verständnisfrage zu int.length und String.length() Java Basics - Anfänger-Themen 4
G 2D Array gleichsetzen verständnisfrage Java Basics - Anfänger-Themen 2
M kleine und einfache Verständnisfrage Java Basics - Anfänger-Themen 3
N verständnisfrage java.util.Calendar Java Basics - Anfänger-Themen 4
G Datentypen bits, bytes, chars - Verständnisfrage Java Basics - Anfänger-Themen 5
E Verständnisfrage zu Shutdownhook Java Basics - Anfänger-Themen 5
D Verständnisfrage: Java und MySql Java Basics - Anfänger-Themen 3
F Rekursion Verständnisfrage Java Basics - Anfänger-Themen 6
A Exception Verständnisfrage: Exceptions während, einer Statischenzuweisung abfangen Java Basics - Anfänger-Themen 10
Z Comparator Verständnisfrage Java Basics - Anfänger-Themen 5
D Verständnisfrage zu Funktionen Java Basics - Anfänger-Themen 6
H Verständnisfrage Persistenz Java Basics - Anfänger-Themen 10
neurox Verständnisfrage zu Threads Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben