Hallo allerseits,
in meinem Programm unten habe ich ein Bild (Image) erzeugt und dann einen "zugehörigen Grafikkontext" erstellt.
Mit
[HIGHLIGHT="Java"]myimg = createImage(sx, sy);[/HIGHLIGHT]
wird ein Bild erzeugt
Mit
[HIGHLIGHT="Java"]myg = myimg.getGraphics();[/HIGHLIGHT]
wird der sogenante Grafikkontext erzeugt.
Dann habe ich in den "zugehörigen Grafikkontext" gezeichnet mit:
[HIGHLIGHT="Java"]myg.drawOval(ort*20 , ort*20, 20, 20); [/HIGHLIGHT]
und in paintComponent den Kreis gezeichnet:
[HIGHLIGHT="Java"]public void paintComponent(Graphics g){
System.out.println("paintComponent");
g.drawImage(myimg,0,0,null);
}[/HIGHLIGHT]
I)
1)
Mir ist leider die dahinterstehende Logik bzw. Systematik _überhaupt_ nicht klar.
Kann mir dies jemand anschaulich an Beispielen erklären?
Bitte lest zuerst mein ganzes Posting, bevor ihr antwortet, damit ihr nachvollzieghen könnt, womit ich Probleme habe.
2)
Was ist der sogenannte Grafikkontext Graphics, welchen Sinn hat er?
3)
Warum braucht man ihn in paintComponent() als Parameter?
4)
Die Bilddaten (also aus welcher Farbe jeweils ein einzelnes Pixel eines Bildes besteht) sollen nicht im Graphics-Objekt gespeichert sein.
Wo sind dieses dann gespeichert?
Die Antwort auf diese Fragen konnte ich auch nicht im Internet finden.
II)
Weitere Fragen:
1)
Warum wird beim Zeichnen eines Kreises in das Bild myimg nicht das Objekt myimg angegeben. Konkret warum wird das nicht wie folgt realisiert, d.h.
wäre es von der Logik nicht klarer, wenn dies
[HIGHLIGHT="Java"]myimg.drawOval(i , 2*i+15, 20, 20);[/HIGHLIGHT]
heissen würde?
2)
Wo wird dann mit
[HIGHLIGHT="Java"]g.drawOval(i , 2*i+15, 20, 20);[/HIGHLIGHT]
hingezeichnet?
Hier gibt es ja kein zu g zugehöriges Bild, in das das gezeichnet
werden soll.
3)
Warum wurde es nicht so realisiert, dass man paintComponent(...) als Parameter nicht das Bild übergibt, das dann von paintComponent(...) auf den Bildschirm gezeichnet wird.
Warum der ganze Umweg mit Graphics ??
mfg
Ernst
-----------------------------------------------------------
[HIGHLIGHT="Java"]package de;
import java.awt.*;
import javax.swing.*;
public class MainVerzoegertZeichnen1 {
public static void main(String[] args){
JFrame f = new JFrame();
f.setSize(550,550);
Diagramm diagramm = new Diagramm(550, 550);
f.getContentPane().add(diagramm);
Thread t = new Thread(diagramm);
t.start();
f.setVisible(true);
}
}
class Diagramm extends JPanel implements Runnable{
private int xpAnz;
private int ypAnz;
private int i;
private Image myimg;
private Graphics myg;
private int sx;
private int sy;
private boolean ichMaleGerade;
public Diagramm(int xpAnz, int ypAnz){
i=0;
this.xpAnz=xpAnz;
this.ypAnz=ypAnz;
myimg=null;
ichMaleGerade=true;
//myg.setColor(Color.red);
}
public void paintComponent(Graphics g){
if(myimg==null){
sx = this.getSize().width;
sy = this.getSize().height;
myimg = createImage(sx, sy);
myg = myimg.getGraphics();
}
myg.setColor(Color.red);
myg.drawOval(i , 2*i+15, 20, 20);
ichMaleGerade=false;
g.drawImage(myimg,0,0,null);
}
public void run(){
while(i<200){
this.repaint();
while(ichMaleGerade==true){
}
ichMaleGerade=true;
try{
Thread.sleep(500);
}
catch(Exception e){}
i = i+20;
}
}
}[/HIGHLIGHT]
-----------------------------------------------------------
in meinem Programm unten habe ich ein Bild (Image) erzeugt und dann einen "zugehörigen Grafikkontext" erstellt.
Mit
[HIGHLIGHT="Java"]myimg = createImage(sx, sy);[/HIGHLIGHT]
wird ein Bild erzeugt
Mit
[HIGHLIGHT="Java"]myg = myimg.getGraphics();[/HIGHLIGHT]
wird der sogenante Grafikkontext erzeugt.
Dann habe ich in den "zugehörigen Grafikkontext" gezeichnet mit:
[HIGHLIGHT="Java"]myg.drawOval(ort*20 , ort*20, 20, 20); [/HIGHLIGHT]
und in paintComponent den Kreis gezeichnet:
[HIGHLIGHT="Java"]public void paintComponent(Graphics g){
System.out.println("paintComponent");
g.drawImage(myimg,0,0,null);
}[/HIGHLIGHT]
I)
1)
Mir ist leider die dahinterstehende Logik bzw. Systematik _überhaupt_ nicht klar.
Kann mir dies jemand anschaulich an Beispielen erklären?
Bitte lest zuerst mein ganzes Posting, bevor ihr antwortet, damit ihr nachvollzieghen könnt, womit ich Probleme habe.
2)
Was ist der sogenannte Grafikkontext Graphics, welchen Sinn hat er?
3)
Warum braucht man ihn in paintComponent() als Parameter?
4)
Die Bilddaten (also aus welcher Farbe jeweils ein einzelnes Pixel eines Bildes besteht) sollen nicht im Graphics-Objekt gespeichert sein.
Wo sind dieses dann gespeichert?
Die Antwort auf diese Fragen konnte ich auch nicht im Internet finden.
II)
Weitere Fragen:
1)
Warum wird beim Zeichnen eines Kreises in das Bild myimg nicht das Objekt myimg angegeben. Konkret warum wird das nicht wie folgt realisiert, d.h.
wäre es von der Logik nicht klarer, wenn dies
[HIGHLIGHT="Java"]myimg.drawOval(i , 2*i+15, 20, 20);[/HIGHLIGHT]
heissen würde?
2)
Wo wird dann mit
[HIGHLIGHT="Java"]g.drawOval(i , 2*i+15, 20, 20);[/HIGHLIGHT]
hingezeichnet?
Hier gibt es ja kein zu g zugehöriges Bild, in das das gezeichnet
werden soll.
3)
Warum wurde es nicht so realisiert, dass man paintComponent(...) als Parameter nicht das Bild übergibt, das dann von paintComponent(...) auf den Bildschirm gezeichnet wird.
Warum der ganze Umweg mit Graphics ??
mfg
Ernst
-----------------------------------------------------------
[HIGHLIGHT="Java"]package de;
import java.awt.*;
import javax.swing.*;
public class MainVerzoegertZeichnen1 {
public static void main(String[] args){
JFrame f = new JFrame();
f.setSize(550,550);
Diagramm diagramm = new Diagramm(550, 550);
f.getContentPane().add(diagramm);
Thread t = new Thread(diagramm);
t.start();
f.setVisible(true);
}
}
class Diagramm extends JPanel implements Runnable{
private int xpAnz;
private int ypAnz;
private int i;
private Image myimg;
private Graphics myg;
private int sx;
private int sy;
private boolean ichMaleGerade;
public Diagramm(int xpAnz, int ypAnz){
i=0;
this.xpAnz=xpAnz;
this.ypAnz=ypAnz;
myimg=null;
ichMaleGerade=true;
//myg.setColor(Color.red);
}
public void paintComponent(Graphics g){
if(myimg==null){
sx = this.getSize().width;
sy = this.getSize().height;
myimg = createImage(sx, sy);
myg = myimg.getGraphics();
}
myg.setColor(Color.red);
myg.drawOval(i , 2*i+15, 20, 20);
ichMaleGerade=false;
g.drawImage(myimg,0,0,null);
}
public void run(){
while(i<200){
this.repaint();
while(ichMaleGerade==true){
}
ichMaleGerade=true;
try{
Thread.sleep(500);
}
catch(Exception e){}
i = i+20;
}
}
}[/HIGHLIGHT]
-----------------------------------------------------------
Zuletzt bearbeitet von einem Moderator: