» »

grafika problem [JAVA]

grafika problem [JAVA]

Bojevnik ::

Pri naslednjem programu mi vrne NullPointerException v vrstici označeni z ***. Mislim da pa probleme dela zgornja vrstica(**), ker ne naredi slike oz po njenem klici je memImage še vedno null.
Kaj je sploh narobe in kako lahko popravim?

import java.awt.*;
import javax.swing.*;

public class Panela extends JPanel implements Runnable{
    int korak=0;
    int zakasnitev=50;
    boolean running=false;
    
    Image memImage;
    Graphics memGraphics;
    Thread nit;

    Panela(){
        **memImage= createImage(500,500);
        ***memGraphics = memImage.getGraphics();
        setVisible(true);
        start();
    }
    public void run(){
        while(running){
            long cas=System.currentTimeMillis();
            korak++;
            repaint();
            cas=System.currentTimeMillis();
            try{
                if(cas<zakasnitev)
                Thread.sleep(zakasnitev-(int) cas);
            }
            catch(InterruptedException e){e.printStackTrace(); System.exit(-1);}
        }
    }
    public void start(){
        if(!running) {
            nit= new Thread(this);
            nit.start();
            running=true;
        }
    }
    public void paint(Graphics g){
        update(g);
    }
    public void update(Graphics g){
        memGraphics.setColor(getBackground());
        memGraphics.fillRect(0, 0, getWidth(), getHeight());
        memGraphics.setColor(Color.black);
        int odmik= korak % 20;
        for(int x=0; x<getWidth()+getHeight(); x+=20){
            memGraphics.drawLine(x, 0, 0, x);            
        }//for
        g.drawImage(memImage, 0, 0, this);
    }
    
}
  • spremenilo: Bojevnik ()

Utk ::

Po moje rabiš nekje memImage = new ... ;
Čeprav točno tega še nism delal.

morbo ::

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.

Probaj klicat potem ko je panel zrealiziran

Bojevnik ::

Hmm tiste dve vrstici sem dal v run metodo pa ni delalo.

Tega dela grafike nisem nikoli preveč razumel.
Ker celoten program je narejen tako da imam funkcijo main ki ustvari JFrame, potem pa v JFrame dodam ta JPanel( Če je kakšen boljši način naj me kdo popravi.).
Se pravi naj v JFrame kličem
JPanel pan= new Panela();
pa.setBound(0,0,500,500);
add(pan);
memImage= createImage(500,500);
memGraphics = memImage.getGraphics();
pan.start();

KaRkY ::

Daj kopiraj ti tu not stacktrace mogoče se bo tam vun kaj več vidlo.

morbo ::

Probaj to zaporedje:
- ustvari Frame
- ustvari Panel in ga prilepi
- prikaži Frame (pack() setVisibe())
- ustvari sliko
- poženi nit

(btw; ne ustvarjat nove niti iz konstruktorja panel-a. start() kliči takrat ko je panel že ustvarjen)

Zgodovina sprememb…

  • spremenil: morbo ()

Bojevnik ::

Hvala dela.

Pa če slučajno koga zanima tukaj je delujoča koda.


import java.awt.*;
import javax.swing.*;

public class Panela extends JPanel implements Runnable{
    int korak=0;
    int zakasnitev=500;
    boolean running=false;
    
    Image memImage;
    Graphics memGraphics;
    Thread nit;

    Panela(){
    }
    public void run(){
        while(running){
            long cas=System.currentTimeMillis();
            korak++;
            repaint();
            cas=System.currentTimeMillis();
            try{
                if(cas&lt;zakasnitev)
                Thread.sleep(zakasnitev-(int) cas);
            }
            catch(InterruptedException e){e.printStackTrace(); System.exit(-1);}
        }
    }
    public void start(){        
        if(!running) {
            nit= new Thread(this);
            nit.start();
            running=true;
        }
    }
    public void paintComponent(Graphics g){
        memImage= createImage(500,500);
        memGraphics = memImage.getGraphics();
        if(!running) start();
        update(g);
    }
    public void update(Graphics g){
        memGraphics.setColor(getBackground());
        memGraphics.fillRect(0, 0, getWidth(), getHeight());
        memGraphics.setColor(Color.black);
        int odmik= korak % 20;
        for(int x=0; x&lt;getWidth()+getHeight(); x+=20){
            memGraphics.drawLine(x, 0, 0, x);            
        }//for
        g.drawImage(memImage, 0, 0, this);
    }
    
}


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

java date/time

Oddelek: Programiranje
111511 (1194) Slovenet
»

[Java] Zasnova shoot em up igre

Oddelek: Programiranje
111198 (877) PecenkA
»

java / mysql / počasne poizvedbe

Oddelek: Programiranje
5756 (685) BRBR
»

[Java] Quicksort

Oddelek: Programiranje
6742 (578) MrBrdo
»

[JAVA] System_currentTimeMillis()??

Oddelek: Programiranje
16813 (813) kunigunda

Več podobnih tem