13. februar 2003 - 20:41
Der er
1 løsning
Problem med createImage under Canvas
Jeg har et problem med createImage i en canvas, problemet består i at jeg ikke kan få lavet et billede, ved at skrive img = createImage(100,100); - Her får img start værdien null, hvorimod jeg ville mene at img nu skulle være et billede.. Men her er koden:
test klasse
import java.applet.*;
import java.awt.*;
import Vertex;
public class test extends Applet
{
Vertex a, b, c = null;
Image gah = null;
Graphics g;
Paint3D painter = null;
public void init()
{
painter = new Paint3D(this.getWidth(), this.getHeight());
}
public void paint(Graphics g)
{
a = new Vertex(0.0, 0.0, 0.0);
b = new Vertex(100.0, 100.0, 100.0);
c = new Vertex(500.0, 50.0, 200.0);
g.drawImage(painter.drawTriangle2D(a, b, c, java.awt.Color.black) , 0, 0, this);
}
}
En klasse som der bare skal være der:
class Vertex
{
private boolean debug = true;
private double x,y,z = 0;
public Vertex(double t_x, double t_y, double t_z)
{
if(debug){System.out.println("Vertex Initialised");}
x = t_x;
y = t_y;
z = t_z;
}
public void setX(double t_x)
{
x = t_x;
}
public void setY(double t_y)
{
y = t_y;
}
public void setZ(double t_z)
{
z = t_z;
}
public double getX()
{
return(x);
}
public double getY()
{
return(y);
}
public double getZ()
{
return(z);
}
}
Selve klassen hvor i problmet er..
import Vertex;
import java.awt.*;
import java.awt.Image;
public class Paint3D extends Canvas
{
Graphics g;
Image img = null;
private boolean debug = true;
private int width, height;
public Paint3D(int t_width, int t_height)
{
if(debug)System.out.println("Paint initialiserede!\n");
//Slam
width = t_width;
height = t_height;
System.out.println(width+" "+height);
Image image = createImage(width, height);
System.out.println(image);
}
public Image drawTriangle2D(Vertex a, Vertex b, Vertex c, Color colour)
{
//Initialisering af variabler
int axplus, ax, asx, asy, ad, bxplus, bx, bsx, bsy, bd, x, y = 0;
Vertex temp;
//Sortering (naiv)
if(a.getY() > b.getY())
{
temp = a;
b = a;
a = temp;
}
if(b.getY() > c.getY())
{
temp = b;
c = b;
b = temp;
}
if(a.getY() > b.getY())
{
temp = a;
b = a;
a = temp;
}
//Initialisering af linie a -> c
bx = (int) a.getX();
bsy = (int) (c.getY()-a.getY());
bsx = (int) (c.getX()-a.getX());
if(bsx < 0)
{
bsx = -bsx;
bxplus = -1;
bd = 1-bsy+bsx;
}
else
{
bxplus = 1;
bd = bsx;
}
if(a.getY() != b.getY())
{
//Initialisering af linie a -> b
ax = (int) a.getX();
asy = (int) (b.getY()-a.getY());
asx = (int) (b.getX()-a.getX());
if(asx < 0)
{
asx = -asx;
axplus = -1;
ad = 1-asy+asx;
}
else
{
axplus = 1;
ad = asx;
}
for(y = (int)a.getY()+1; y<b.getY(); y++)
{
while(ad > 0)
{
ax += axplus;
ad -= asy;
}
ad+=asx;
while(bd > 0)
{
bx += bxplus;
bd -= bsy;
}
bd+=bsx;
//Tegner linierne.. (den første halvdel af dem)
scanline(ax,bx,y,colour);
}
}
else
{
bd -= bsx;
}
if(b.getY() != c.getY())
{
//Initialisering af linie b -> c
ax = (int) b.getX();
asy = (int) (c.getY()-b.getY());
asx = (int) (c.getX()-b.getX());
if(asx < 0)
{
asx = -asx;
axplus = -1;
ad = 1-asy;
}
else
{
axplus = 1;
ad = 0;
}
for(y = (int)b.getY(); y < c.getY(); y++)
{
while(ad > 0)
{
ax += axplus;
ad -= asy;
}
ad+=asx;
while(bd > 0)
{
bx += bxplus;
bd -= bsy;
}
bd+=bsx;
//Tegner linierne.. (den første halvdel af dem)
scanline(ax,bx,y,colour);
}
}
return(img);
}
public void scanline(int ax,int bx,int y,Color colour)
{
g = img.getGraphics();
if(g == null)
{
System.out.println("PIV!");
}
else
{
g.setColor(colour);
g.drawLine(ax,y,bx,y);
}
}
}
14. februar 2003 - 18:24
#1
Fra beskrivelsen af java.awt.Component.createImage():
Returns: an off-screen drawable image, which can be used for double buffering. The return value may be null if the component is not displayable. This will always happen if GraphicsEnvironment.isHeadless() returns true.
Problemet er at der ikke er oprettet en "peer" for komponenten på det tidspunkt du kalder createImage - og dermed ingen systemresourcer ("native") som kræves for at oprette et Image. En peer oprettes når komponenten tilføjes til en Container.
Det virker også underligt at du lader Paint3D nedarve fra java.awt.Canvas, da komponenten aldrig bruges (dvs vises). Nedenfor har jeg bare udvidet drawTriangle2D med parameter "displayable" som bruges til at oprette Image objektet, hvis det ikke findes (når paint metoden i din Applet kalder metoden er din Applet i hvert fald displayable og der er afsat systemresourcer til at vise din Applet).
import java.applet.*;
import java.awt.*;
import java.awt.Image;
public class test extends Applet
{
Vertex a, b, c = null;
Image gah = null;
Graphics g;
Paint3D painter = null;
public void init()
{
painter = new Paint3D(this.getWidth(), this.getHeight());
}
public void paint(Graphics g)
{
a = new Vertex(0.0, 0.0, 0.0);
b = new Vertex(100.0, 100.0, 100.0);
c = new Vertex(500.0, 50.0, 200.0);
g.drawImage(painter.drawTriangle2D(a, b, c, java.awt.Color.black,this) , 0, 0, this);
}
}
class Vertex
{
private boolean debug = true;
private double x,y,z = 0;
public Vertex(double t_x, double t_y, double t_z)
{
if(debug){System.out.println("Vertex Initialised");}
x = t_x;
y = t_y;
z = t_z;
}
public void setX(double t_x)
{
x = t_x;
}
public void setY(double t_y)
{
y = t_y;
}
public void setZ(double t_z)
{
z = t_z;
}
public double getX()
{
return(x);
}
public double getY()
{
return(y);
}
public double getZ()
{
return(z);
}
}
class Paint3D extends Canvas
{
Graphics g;
Image img = null;
private boolean debug = true;
private int width, height;
public Paint3D(int t_width, int t_height)
{
if(debug)System.out.println("Paint initialiserede!\n");
//Slam
width = t_width;
height = t_height;
System.out.println(width+" "+height);
}
public Image drawTriangle2D(Vertex a, Vertex b, Vertex c, Color colour, java.awt.Component displayable )
{
if( img == null )
{
img = displayable.createImage(width,height);
}
//Initialisering af variabler
int axplus, ax, asx, asy, ad, bxplus, bx, bsx, bsy, bd, x, y = 0;
Vertex temp;
//Sortering (naiv)
if(a.getY() > b.getY())
{
temp = a;
b = a;
a = temp;
}
if(b.getY() > c.getY())
{
temp = b;
c = b;
b = temp;
}
if(a.getY() > b.getY())
{
temp = a;
b = a;
a = temp;
}
//Initialisering af linie a -> c
bx = (int) a.getX();
bsy = (int) (c.getY()-a.getY());
bsx = (int) (c.getX()-a.getX());
if(bsx < 0)
{
bsx = -bsx;
bxplus = -1;
bd = 1-bsy+bsx;
}
else
{
bxplus = 1;
bd = bsx;
}
if(a.getY() != b.getY())
{
//Initialisering af linie a -> b
ax = (int) a.getX();
asy = (int) (b.getY()-a.getY());
asx = (int) (b.getX()-a.getX());
if(asx < 0)
{
asx = -asx;
axplus = -1;
ad = 1-asy+asx;
}
else
{
axplus = 1;
ad = asx;
}
for(y = (int)a.getY()+1; y<b.getY(); y++)
{
while(ad > 0)
{
ax += axplus;
ad -= asy;
}
ad+=asx;
while(bd > 0)
{
bx += bxplus;
bd -= bsy;
}
bd+=bsx;
//Tegner linierne.. (den første halvdel af dem)
scanline(ax,bx,y,colour);
}
}
else
{
bd -= bsx;
}
if(b.getY() != c.getY())
{
//Initialisering af linie b -> c
ax = (int) b.getX();
asy = (int) (c.getY()-b.getY());
asx = (int) (c.getX()-b.getX());
if(asx < 0)
{
asx = -asx;
axplus = -1;
ad = 1-asy;
}
else
{
axplus = 1;
ad = 0;
}
for(y = (int)b.getY(); y < c.getY(); y++)
{
while(ad > 0)
{
ax += axplus;
ad -= asy;
}
ad+=asx;
while(bd > 0)
{
bx += bxplus;
bd -= bsy;
}
bd+=bsx;
//Tegner linierne.. (den første halvdel af dem)
scanline(ax,bx,y,colour);
}
}
return(img);
}
public void scanline(int ax,int bx,int y,Color colour)
{
g = img.getGraphics();
if(g == null)
{
System.out.println("PIV!");
}
else
{
g.setColor(colour);
g.drawLine(ax,y,bx,y);
}
}
}