Avatar billede quisifa Nybegynder
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);
        }
    }
}
Avatar billede ulrikm Nybegynder
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);
        }
    }
}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester