Merkwürdiges verhalten bei Methodenaufruf?

Smily0412

Mitglied
Hoi,

Ohne große Worte, ich zeigs einfach mal am Code:

Java:
		BufferedImage img = new BufferedImage(100,100,BufferedImage.TYPE_INT_RGB);
		Graphics g = img.getGraphics();
		
		img.getGraphics().setColor(Color.BLACK); //Das geht nicht
		System.out.println(g.getColor());

		g.setColor(Color.BLACK); //Das geht
		System.out.println(g.getColor())


woran liegt das?
 
Ein paar mehr Wort sind manchmal doch recht hilfreich;)
Aber ich glaube du meinst das:
1.
Java:
Graphics g = img.getGraphics();
Damit weißt du der Vaiablen g img.getGraphics() zu
2.
Java:
img.getGraphics().setColor(Color.BLACK);

Damit setzt du die Farbe für img. aber nicht für g;)
wenn du erst 2. und dann 1. Macht sollte es so auch klappen, aber deine 2. Schreibart ist besser

PS: der WYSIWYG-Editor gefällt mir nicht^^
 
Zuletzt bearbeitet von einem Moderator:
img.getGraphics() liefert in dem Code eigentlich dasselbe wie g, nämlich ein Grafikobjekt.
Ist es nicht eigentlich egal, ob ich img.getGraphics() erst in einer Variable zwichenspeichere, oder ob das direkt aufrufe?

Also ist meine Logische schlussfolgerung:

bei img.getGraphics().setColor(Color.Black) wird von dem img-objekt die getGraphics()-Methode aufgerufen, und in dem zurückgegebenen Graphics-Wert wird dann eben die setColor-Methode aufgerufen.

aber wenn ich das machen möchte, passiert garnix.

den selben effekt gibt auch bei anderen Methoden, z.B. setClip()


das ich die Methode setColor() für img aufrufe ist übrigens nicht möglich, da ich da eine Exception bekommen würde.

gruß,
Smily0412
 
Ok, weniger Text war doch gut. Denn jetzt versteh ich dich nicht mehr wirklich. Normalerweise(es gibt Ausnahmen) gilt: Variable deklarieren. Sachen zuweisen. Benutzen.
Denn wenn du erst was zuweißt, dann erst die Variable ist es logischerweise nicht in ihr verfügbar.
 
Das liegt daran, weil grob gesagt bei jedem getGraphics ein neues GraphicsObject erzeugt wird.

MFG

zEriX
 
vielleicht liegt es ja darran, dass ich vor nicht allzulanger zeit mit Basic Programmiert habe... aber ich denke, Java macht intern folgendes:

setColor() wird auf (img.getGraphics()) angewendet. Deswegen verarbeitet Java erst das img.getGraphics() und auf das, was da rauskommt wird eben die Funktion setColor angewand.

ergo:

Ich drücke es mal Allgemein aus: (in der Annahme, das Methode1() wieder ein Objekt von "Klasse" zurückgibt: )

Code:
objekt.Methode1().Methode2()

enspricht

Code:
Klasse tmp = objekt.Methode1()
tmp.Methode2()

oder liege ich damit falsch?
 
Smily hat schon recht, normalerweise sollten beide Wege funtktionieren.

Schließlich tut er nur den Rückgabewert von der Get-Methode gleich wieder weiter benutzen (sozusagen pipen).

Jedoch ist da die Frage, wie Java das mit der Referenzierung in diesem Fall handelt. Hast du schon beides getrennt voneinander probiert?

Antwort...siehe @zerix^^
 
Zuletzt bearbeitet:
Hallo,

schau mal hier
Java:
package de.tutorials.swing;

import java.awt.Graphics;
import java.awt.image.BufferedImage;

public class GraphicsExample {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		BufferedImage image = new BufferedImage(100,100,BufferedImage.TYPE_4BYTE_ABGR);
		
		Graphics g = image.getGraphics();
		
		System.out.println(g == image.getGraphics());

	}

}

Code:
false

Wie ich schon oben gesagt hab, bekommst du immer ein anderes Object.

MFG

zEriX
 
Zuletzt bearbeitet:
huch ich hab den letzten Post von zerix doch glatt übersehen ^^

Das wäre natürlich eine Lösung.. (auch wenn mir nicht wirklich aufgeht, was die Java-entwickler sich dabei gedacht haben ^^)

thx
 
Zurück