zeichnen auf awt canvas

Status
Nicht offen für weitere Antworten.
N

noob-1

Gast
Ich möchte auf einem Canvas einige Striche Zeichnen, jedoch werden in allen Tutorials die eigentlichen Zeichenbefehle immer in in draw reingeschrieben. Das möchte ich eigentlich vermeiden, deswegen habe ich folgendes gebaut. Leider klappt das so nicht. Kann mir jemand sagen, wo ich meinen Denkfehler habe und mir sagen, wie ich das richtig machen kann?

Code:
import java.awt.*;

public class zeichnen extends Canvas {

    public static void main(String[] arg) {
        Frame f = new Frame();
        zeichnen z = new zeichnen();
        f.add(z);
        f.setSize(300,300);
        f.setVisible(true);
        z.painter();
    }
    
    public void painter (){
        Graphics g = getGraphics();
        g.drawOval(300,120,100,75);
    }
}

ps: wenn es eine Alternative zum awt Canvas gibt, nehme ich die auch gerne.
 

L-ectron-X

Gesperrter Benutzer
Du musst schon die vorgesehenen Methoden zum Zeichnen überschreiben.
Im AWT ist das paint() in Swing paintComponent().

getGraphics() sollte nie aufgerufen werden.

Ein einfaches Beispiel:
Code:
import java.awt.*;
import javax.swing.*;

public class MyFrame extends JFrame {

   public MyFrame(String title) {

      super(title);
      setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
      setSize(800, 600);
      setLocationRelativeTo(null);
      
      add(new Sheet());
      
      setVisible(true);
   }

   public static void main(String[] args) {
      new MyFrame("Zeichnen");
   }
}

class Sheet extends JPanel {
   public void paintComponent(Graphics g) {
      g.drawOval(200,200,400,100);
   }
}
 
N

noob-1

Gast
grmbl.

Aber dadurch vermische ich doch nur unnötig Anzeige und Berechnung.

Oder wie kann ich jetzt z.B. von Main aus bestimmen, welche Koordinaten die Linie haben soll. (und ich habe keine Lust für jede Funktion (draLine, DrawOval, drawIrgendwas,...) eine eigene Methode zu schreiben.

Und wenn ich getGraphics() nie aufrufen soll, wozu ist es dann da? (bin jetzt leicht verwirrt)

Aber danke für die schnelle Antwort.
 

Marco13

Top Contributor
Um's stark vereinfacht auszudrücken: getGraphics wird "intern" verwendet - und dort, wo es verwendet wird, wissen die Leute ganz genau, was sie tun...

Man sollte Berechnung und Zeichnen im Idealfall nicht vermischen. Im Gegenteil: In der überschriebenen paintComponent-Methode sollte ja gerade NICHT gerechnet, sondern nur gezeichnet werden. Man sollte also nicht sowas machen wie
Code:
void paintComponent(Graphics g)
{
    for (int x=0; x<1000; x++) 
    {
        int y = aufwändigeBerechnungDesFunktionswertes();
        g.drawLine(0,0,x,y);
    }
}
Stattdessen sollte man entweder die berechneten Werte speichern - GROB SKIZZIERTER Pseudocode:
Code:
int funktionswerte[] = ...

void berechne()
{
    for (int x=0; x<1000; x++) 
    {
        funktionswerte[x] = aufwändigeBerechnungDesFunktionswertes();
    }
}

void paintComponent(Graphics g)
{
    for (int x=0; x<1000; x++) 
    {
        g.drawLine(0,0,x,funktionswerte[x]);
    }
}
Oder, was in MANCHEN Fällen sinnvoll sein KANN: Das ganze in ein Bild reinmalen, und in der paintComponent nurnoch das Bild malen
Code:
BufferedImage image = ...

void bereiteBildVor()
{
    Graphics g = image.getGraphics(); // Auf einem BufferedImage is getGraphics OK...
    for (int x=0; x<1000; x++) 
    {
        int y = aufwändigeBerechnungDesFunktionswertes();
        g.drawLine(0,0,x,y);
    }
}

void paintComponent(Graphics g)
{
    g.drawImage(image);
}
Aber damit werden auch Berechnung und Zeichnung vermischt, d.h. man sollte das imho auch NICHT genau SO machen (diente nur zur Verdeutlichung der Möglichkeit, ein Image zu verwenden)
 
G

Guest

Gast
Marco13 hat gesagt.:
Um's stark vereinfacht auszudrücken: getGraphics wird "intern" verwendet - und dort, wo es verwendet wird, wissen die Leute ganz genau, was sie tun...
*g* ok, DAS tue ich definitiv noch nicht




Marco13 hat gesagt.:
Oder, was in MANCHEN Fällen sinnvoll sein KANN: Das ganze in ein Bild reinmalen, und in der paintComponent nurnoch das Bild malen
[...]
Aber damit werden auch Berechnung und Zeichnung vermischt, d.h. man sollte das imho auch NICHT genau SO machen (diente nur zur Verdeutlichung der Möglichkeit, ein Image zu verwenden)

Das scheint am Nähsten an dem zu sein, was ich brauche. Ist ein guter Start an dem ich weiter bauen kann.

Vielen Dank.
 
N

noob-1

Gast
So, ich habe jetzt etwas rumgespielt, jedoch klappt es noch nicht so ganz.
Ich kann das Bild in das Canvas einkopieren, jedoch kann ich das Bild selbst scheinbar nicht bearbeiten. Zumindest kopiere ich immer nur ein leeres Bild auf das Canvas.

Code:
import java.awt.*;
import java.awt.Graphics;
import java.awt.image.BufferedImage;

public class graphikTest extends Canvas {
	private static imageHandler iH = new imageHandler();

	public static void main(String[] args){
        Frame f = new Frame();
        graphikTest gT = new graphikTest();
        f.add(gT);
        f.setSize(200,200);
        f.setVisible(true);

		iH.newImage(200, 200);
		BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);
		img = iH.getImage();
		Graphics g = img.getGraphics();
		g.drawLine(0, 0, 100, 100);
		iH.setImage(img);
		gT.blubb();
	}

	private void blubb (){
		repaint();
	}

	public void paint(Graphics g) {
	    g.drawLine(0, 0, 300, 300);
	    g.drawImage(iH.getImage(),0,0, null );
	}
}


Code:
import java.awt.image.BufferedImage;

public class imageHandler {
	BufferedImage imgPrototyp = new BufferedImage(50, 50, BufferedImage.TYPE_INT_ARGB);

	public BufferedImage getImage(){
		return imgPrototyp;
	}
	
	public void setImage(BufferedImage img){
		this.imgPrototyp = img;		
	}

	public void newImage(int x, int y){
		this.imgPrototyp = new BufferedImage(x,y, BufferedImage.TYPE_INT_ARGB);
	}
}
 

Quaxli

Top Contributor
Du hast mit diesem komschen ImageHandler, der auch nich konventionsgemäß benannt wurde ganz schönes Durcheinander gemacht.

Erst erzeugst Du ein Image mit dem IH, dann ein BufferedImage.
Dann weist Du dem img das Bild aus dem IH zu, um dann nach einigen Zeichenoperation nochmal das setImage des IH aufzrufen.
Das sieht nicht wirklich so aus, als ob Du weist was Du tust ;)

Hier mal ein lauffähiges Beispiel ohne Kapselung im ImageHandler. Schau Dir mal an, was gemacht wird und wenn Du das verstehst, probier es nochmal mit Kapselung im ImageHandler:

Code:
import java.awt.*;
import java.awt.Graphics;
import java.awt.image.BufferedImage;

// Klassennamen schreibt man groß
public class GraphikTest extends Canvas {

	private static final long	serialVersionUID	= 1L;

	BufferedImage							img;

	public static void main(String[] args) {
		new GraphikTest();
	}
	
	public GraphikTest(){
		Frame f = new Frame();
		f.setSize(300, 300);
		this.setPreferredSize(new Dimension(300,300));
		f.add(this);

		
		img = new BufferedImage(300, 300, BufferedImage.OPAQUE); //Größe 1,1 war nicht gerade ideal
		Graphics gimg = img.createGraphics(); //createGraphics Verwenden
		gimg.setColor(Color.RED);
		gimg.drawLine(20,0, 300,300);
		gimg.dispose();
		
		f.pack();
		f.setVisible(true); //setVisible zuletzt oder repaint, wie Du's vorher hattest
	}


	public void paint(Graphics g) {
		super.paint(g); //super-Aufruf nicht vergessen
		g.drawImage(img, 0, 0, null);
		g.setColor(Color.BLUE);
		g.drawLine(0, 0, 300, 300);
		g.dispose();
	}
}
 

Ebenius

Top Contributor
Quaxli hat gesagt.:
Code:
public void paint(Graphics g) {
  super.paint(g); //super-Aufruf nicht vergessen
  g.drawImage(img, 0, 0, null);
  g.setColor(Color.BLUE);
  g.drawLine(0, 0, 300, 300);
  g.dispose();
}
Genau hier ist Graphics.dispose() falsch! Dispose macht man immer dann, wenn man selbst ein Graphics-Objekt erstellt; zum Beispiel per Graphics.create(). Ein Graphics-Objekt, welches Du nur geliehen bekommst, zerstörst Du nicht. Warum nicht? Leite doch einfach nochmal von GraphikTest ab und versuch noch was obendrauf zu zeichnen. Klar?
 

Quaxli

Top Contributor
Stimmt. Danke für die Korrektur.
Zwar wird diese Klasse wohl nicht mehr vererbt, aber man sollte sich sowas doch gar nicht erst angewöhnen.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
H JavaFX Canvas neu zeichnen anstoßen AWT, Swing, JavaFX & SWT 34
P AWT Canvas freihändig zeichnen AWT, Swing, JavaFX & SWT 1
H JavaFX Freezes beim Zeichnen mit Canvas AWT, Swing, JavaFX & SWT 3
F Canvas Objekt außerhalb des Frames zeichnen AWT, Swing, JavaFX & SWT 3
frankred Swing Canvas nach "Window-resize" neu Zeichnen lassen wegen Anzeigefehler AWT, Swing, JavaFX & SWT 4
F Nur ein Objekt auf Canvas neu zeichnen AWT, Swing, JavaFX & SWT 4
2 AWT Zeichnen in Canvas AWT, Swing, JavaFX & SWT 5
L Dynamisch Objekte in Canvas zeichnen AWT, Swing, JavaFX & SWT 5
G Auf Canvas zeichnen nur über boolean-Abfragen? AWT, Swing, JavaFX & SWT 5
R In JFrame oder in Canvas mit grafischen Elemente zeichnen AWT, Swing, JavaFX & SWT 2
G SWT Linie unter transparentes Canvas zeichnen AWT, Swing, JavaFX & SWT 4
H Zeichnen auf smartgwt Canvas AWT, Swing, JavaFX & SWT 4
K Swing Sinuskurve zeichnen auf Canvas AWT, Swing, JavaFX & SWT 2
T zeichnen mit canvas AWT, Swing, JavaFX & SWT 3
P Zeichnen in Canvas und Neuzeichnen AWT, Swing, JavaFX & SWT 3
N Zu hoher Speicherverbrauch beim Zeichnen (Canvas) AWT, Swing, JavaFX & SWT 5
S AUF Canvas Zeichnen Fehler! AWT, Swing, JavaFX & SWT 10
G Punkte auf Canvas zeichnen AWT, Swing, JavaFX & SWT 2
M Mandelbrot mit BigDecimal erstellen und in der UI zeichnen, funktionierte nicht. AWT, Swing, JavaFX & SWT 1
H Transparent zeichnen mit drawImage in paintComponent Methode AWT, Swing, JavaFX & SWT 3
N JavaFX Unicode zeichnen in javafx Label verwenden AWT, Swing, JavaFX & SWT 2
G 2D-Grafik Grafik in zwei verschiedenen Fenstern gleichzeitig zeichnen AWT, Swing, JavaFX & SWT 9
S Event Handling Neu zeichnen nur wenn Berechnung fertig ist AWT, Swing, JavaFX & SWT 4
W JavaFX Ich kann keinen Kreis richtig zeichnen AWT, Swing, JavaFX & SWT 8
CptK Funktionsgraphen effizient zeichnen und nur Teile von JPanel erneuern AWT, Swing, JavaFX & SWT 2
G Dreieck aus Pixeln zeichnen AWT, Swing, JavaFX & SWT 8
N Mit KeyListener ein rechteck zeichnen AWT, Swing, JavaFX & SWT 9
B 2D-Grafik paintcomponent Probleme beim zeichnen AWT, Swing, JavaFX & SWT 10
Z Swing Graph zeichnen lassen AWT, Swing, JavaFX & SWT 16
O Kann kei neues Panel zum zeichnen aufrufen... AWT, Swing, JavaFX & SWT 4
L Swing zeichnen AWT, Swing, JavaFX & SWT 14
S GUI Kreuz zeichnen und Position ausgeben AWT, Swing, JavaFX & SWT 3
S GUI Kreis zeichnen AWT, Swing, JavaFX & SWT 13
S Swing Rechteck über JTable zeichnen (per MouseListener) AWT, Swing, JavaFX & SWT 1
L Swing Ein Rechteck in ein Grid Zeichnen AWT, Swing, JavaFX & SWT 5
L JavaFX Animation, erst zeichnen dann anzeigen AWT, Swing, JavaFX & SWT 4
K Mehrere Linien zeichnen AWT, Swing, JavaFX & SWT 8
E Transparent zeichnen AWT, Swing, JavaFX & SWT 2
S AWT Probleme beim Zeichnen AWT, Swing, JavaFX & SWT 3
T Tic Tac Toe - GUI Linien zeichnen AWT, Swing, JavaFX & SWT 14
C Applet Zeichnen über Button-Click AWT, Swing, JavaFX & SWT 13
Soloeco Graph zeichnen AWT, Swing, JavaFX & SWT 1
G Zeichnen Programm AWT, Swing, JavaFX & SWT 1
I Graph mit Swing zeichnen AWT, Swing, JavaFX & SWT 8
H Swing + Paint: Mehrere Objekte zeichnen lassen AWT, Swing, JavaFX & SWT 3
W Swing JPanel nur einmal nach mehreren Änderungen neu zeichnen AWT, Swing, JavaFX & SWT 1
D Quadrat, Rechteck zeichnen AWT, Swing, JavaFX & SWT 3
K Probleme beim zeichnen mit paintComponent() AWT, Swing, JavaFX & SWT 1
JG12111989 mehrere Polyline-Objekte zeichnen AWT, Swing, JavaFX & SWT 3
A Swing JRadioButton zeichnen nicht AWT, Swing, JavaFX & SWT 4
J Swing Vertikales Zeichnen eines Strings mit Java2D AWT, Swing, JavaFX & SWT 1
7 JavaFX Problem beim Zeichnen eines Dreiecks in einem GUI AWT, Swing, JavaFX & SWT 6
P 2D-Grafik Bogen(Arc) zwischen zwei Punkten zeichnen AWT, Swing, JavaFX & SWT 2
F Java Swing Rechteck in JPanel zeichnen AWT, Swing, JavaFX & SWT 7
KilledByCheese Swing 2D JLabel Array Maze zeichnen AWT, Swing, JavaFX & SWT 2
S Parallele Linien zeichnen AWT, Swing, JavaFX & SWT 5
J Linien auf JPanel zeichnen AWT, Swing, JavaFX & SWT 3
llabusch Linien in JPanel zeichnen AWT, Swing, JavaFX & SWT 6
S passende PaintComponent ? Zeichnen in TextArea mit Scrollpane ? AWT, Swing, JavaFX & SWT 2
I Applet BlueJ Applet - Bild mit if-Schleife zeichnen lassen AWT, Swing, JavaFX & SWT 16
L JavaFX JavafX Timelime zeichnen und schön stylen? AWT, Swing, JavaFX & SWT 2
I JFrame neu zeichnen, nicht überzeichnen! AWT, Swing, JavaFX & SWT 2
I Spielsteine zeichnen und entfernen AWT, Swing, JavaFX & SWT 3
H Swing BufferedImage zeichnen AWT, Swing, JavaFX & SWT 1
M JFreeChart neu zeichnen sich Wenn Jtable sich ändert AWT, Swing, JavaFX & SWT 5
S 2D-Grafik MouseDragged Linien zeichnen AWT, Swing, JavaFX & SWT 4
M Zeichnen ohne vorherige Linien zu löschen AWT, Swing, JavaFX & SWT 2
T Problem beim Zeichnen von Rechteck AWT, Swing, JavaFX & SWT 3
T Swing / Kreis zeichnen AWT, Swing, JavaFX & SWT 2
I Text zur Linie zeichnen AWT, Swing, JavaFX & SWT 1
I Pfeil zeichnen am Ende einer Linie AWT, Swing, JavaFX & SWT 1
D 2D-Grafik Inhalt eines Graphics in anderes Graphics zeichnen.... AWT, Swing, JavaFX & SWT 3
F Zeichnen des Button AWT, Swing, JavaFX & SWT 4
B Zeichnen mit paintComponent? Oder anders? AWT, Swing, JavaFX & SWT 15
C Swing Aus verschiedenen Klassen zeichnen. AWT, Swing, JavaFX & SWT 2
C Swing BufferedImage zeichnen und JLabels setzen. AWT, Swing, JavaFX & SWT 17
M Kein Zeichnen der Figuren auf JPanel AWT, Swing, JavaFX & SWT 4
J JButton neu zeichnen lassen AWT, Swing, JavaFX & SWT 9
S Quadrat auf Frame zeichnen AWT, Swing, JavaFX & SWT 2
P Image oder Icon auf Tooltip zeichnen AWT, Swing, JavaFX & SWT 4
C Graphics Objekt in Zeitschleife zeichnen AWT, Swing, JavaFX & SWT 4
X Swing JPanel mehrere Ebenen zeichnen AWT, Swing, JavaFX & SWT 13
G Zeichnen auf eine schwergewichtige Komponente? AWT, Swing, JavaFX & SWT 0
G Mehrere Strings um Kreis zeichnen und positionieren AWT, Swing, JavaFX & SWT 0
P SWT Nebula Gallery - Bildbereiche zeichnen 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
A 2D-Grafik Zeichnen einer sich bewegenden Box mit BufferStrategy zieht Spur AWT, Swing, JavaFX & SWT 2
T AWT Bild laden und transparent zeichnen AWT, Swing, JavaFX & SWT 2
Helgon Swing Mit Swing zeichnen / NetBeans GUI AWT, Swing, JavaFX & SWT 11
M JLabel über JButtons zeichnen AWT, Swing, JavaFX & SWT 4
J JApplet und Zeichnen AWT, Swing, JavaFX & SWT 8
P 2D-Grafik NPE beim Zeichnen auf Graphics g AWT, Swing, JavaFX & SWT 8
4 Swing Graphen selber zeichnen AWT, Swing, JavaFX & SWT 2
T Über mehrere Panel zeichnen AWT, Swing, JavaFX & SWT 2
T Zeichnen von getSubimage funktioniert nicht AWT, Swing, JavaFX & SWT 7
M Bilder zeichnen, NullPointer Exception AWT, Swing, JavaFX & SWT 3
N JPanel neu zeichnen AWT, Swing, JavaFX & SWT 10
D Zeichnen eines Barplots AWT, Swing, JavaFX & SWT 2
bluerob Problem beim Image zeichnen via andere Klasse AWT, Swing, JavaFX & SWT 7
M Swing JFrame in einem Panel zeichnen AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben