Atualizar a imagem com Repaint

Olá , será que alguém sabe como eu faço para atualizar uma imagem, no momento da execução. Esse programa abaixo, pinta uma imagem branca na cor vermelha, porém só consigo ver depois que o programa termina. Estou usando o seguinte código:

import java.awt.;
import java.awt.event.
;
import java.awt.image.BufferedImage;
import java.io.;
import java.io.File;
import javax.swing.
;
import javax.imageio.ImageIO;

public class Pixel extends JApplet {

  public static void main(String s[]) throws IOException  {
    JFrame f = new JFrame("Pixel");
    f.addWindowListener(new WindowAdapter() {
        public void windowClosing(WindowEvent e) {System.exit(0);}
    });
    JApplet applet = new ImageOps();
    f.getContentPane().add("Center", applet);

// applet.init();

    BufferedImage imagem = ImageIO.read(new File("test15.jpg"));
    int w = imagem.getWidth();
    int h = imagem.getHeight();
      int[] pixels = imagem.getRGB(0, 0, w, h, null, 0, w); 
    Pixel r = new Pixel();

    for (int col = 0; col <320; col++) {
       for (int lin = 0; lin <239; lin++) {
                
           
            if(pixels[ w*lin + col] ==  new Color(255,  255, 255).getRGB()){
               pixels[ w*lin + col] =
                  new Color(255, 0, 0).getRGB();
         
              
            }

       }

    }

imagem.setRGB(0, 0, w, h, pixels, 0, w);
ImageIO.write(imagem, "JPG", new File("arteabstrata.jpg"));

  //  f.pack();
  //  f.setSize(new Dimension(550,550));
  //  f.setVisible(true);
     
}

private int nextInt(int i) {
    return i;
}


 
/** Creates a new instance of Pixel */
public Pixel() {
}

}

desculpa se eu falar besteira, n mecho com applets, mas pelo que intendi, voce quer ver a transformação da imagem ocorrer é isso ? , porem seu programa ta exibindo a imagem ? ou ta somente salvando o resultado ?

porque se não o caso seria somente de mandar repintar a tela, cada vez que vc modificar a imagem. “exibida” , podendo utilizar de um thread caso quizesse controlar o tempo da transformação.

Obrigado Willy pela resposta, o que eu quero visualizar é a imagem sendo pintada. Para isto fiz desta maneira (ver código abaixo) utilizando o Thread, tentei colocar ImageIO.write(que funciona no programa anterior) para gravar a imagem já pintada, porém o programa entra em um looping com a seguinte mensagem:
Exception in thread “AWT-EventQueue-1” java.lang.NullPointerException.
Será que vc sabe o que está faltando ou o que está errado?

Código com Thread:

import java.awt.;
import java.awt.Color;
import java.awt.Image;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.
;
import java.awt.event.;
import java.awt.image.BufferedImage;
import java.io.
;
import java.io.File;
import javax.swing.*;
import javax.imageio.ImageIO;
public class Checkers extends JApplet implements Runnable {

 Thread runner;
  public BufferedImage imagem;
//  BufferedImage imagem = null;

int xPos = 5;
int xMove = 4;
// Image imagem;
Image offscreenImg;
Graphics offscreen;

public void init() {

    JFrame f = new JFrame("Pixel");
    f.addWindowListener(new WindowAdapter() {
        public void windowClosing(WindowEvent e) {System.exit(0);}
    });
    JApplet applet = new Checkers();
    f.getContentPane().add("Center", applet);
    try {

// applet.init();

        BufferedImage imagem = ImageIO.read(new File("test15.jpg"));
    } catch (IOException ex) {
        ex.printStackTrace();
    }

}

public int[] pixels ;
public int w = 320;
public int h = 240;
public int lin ;
public int col ;

public void start() {
if (runner == null); {
runner = new Thread(this);
runner.start();
}
}

public void stop(){
runner = null;
}

public void run(){
Thread thisThread = Thread.currentThread();

    try {
        imagem = ImageIO.read(new File("test15.jpg"));
    } catch (IOException ex) {
        ex.printStackTrace();
    }
 
      int[] pixels = imagem.getRGB(0, 0, w, h, null, 0, w); 
 //   Pixel r = new Pixel();

    for ( col = 0; col <320; col++) {
       for ( lin = 0; lin <239; lin++) {
         
     //      pixels[ w*lin + col] =
     //     new Color(0, col % 255, 0).getRGB();
               
           
            if(pixels[ w*lin + col] ==  new Color(255,  255, 255).getRGB()){
               pixels[ w*lin + col] =
                  new Color(255, 0, 0).getRGB();
               imagem.setRGB(0, 0, w, h, pixels, 0, w);
         repaint();
       try {
         Thread.sleep(1);
       }catch (InterruptedException e) {}
              
            }

       }
        try {

            ImageIO.write(imagem, "JPG", new File("arteabstrata.jpg"));
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

}
public void update(Graphics screen){
paint(screen);
}

/*

repaint();
try {
Thread.sleep(1);
}catch (InterruptedException e) {}
*/

 public void paint(Graphics screen) {

     
     pixels[ w*lin + col] =
                  new Color(255, 0, 0).getRGB();
     
     imagem.setRGB(0, 0, w, h, pixels, 0, w);

}

public void destroy() {
offscreen.dispose();
}

/** Creates a new instance of Checkers */
public Checkers() {
    
    
    
    
}

}

sinceramente eu não sei vo deixa pra alguem que saiba explicar, so sei ti dizer que o erro que aponta para uma variavel nula esta aqui nesse pixels[ w*lin + col] =
new Color(255, 0, 0).getRGB(); do trecho de codigo abaixo.

public void paint(Graphics screen) {
pixels[ w*lin + col] =
new Color(255, 0, 0).getRGB();
imagem.setRGB(0, 0, w, h, pixels, 0, w);}

int[] pixels = imagem.getRGB(0, 0, w, h, null, 0, w); // era pra gerar como variavel local mesmo ? que ta na linha 73

e tambem ta faltando tu desenha a imagem na tela, dentro desse metodo paint

Dá uma olhada neste capítulo do livro Killer Game Programming in Java

E quanto postar códigos, use a tag code!!! Como descrito neste tópico.

Obrigado a todos que me ajudaram nesta dúvida. Consegui atualizar a imagem no momento da execução utilizando o implements Runnable e o Thread thisThread = Thread.currentThread();

public class Pintar extends java.applet.Applet implements Runnable {
// implements Runnable
Thread runner;
Image offscreenImg;
Graphics offscreen;

public void start() {
if (runner == null); {
runner = new Thread(this);
runner.start();
}
}

public void stop(){
runner = null;
}

public void run() {

// executar o código aqui

Thread thisThread = Thread.currentThread();

}

public void update(Graphics screen){

  paint(screen);

}

 public void paint(Graphics screen) {
     
     
      screen.drawImage(imagem,0,0, this); 
      screen.drawImage(imagem2,330,0, this);  

}

}