Najpierw kod:

//gra Catch the rain

import javax.swing.;
import java.awt.
;
import javax.imageio.;
import java.io.
;

import javax.imageio.;
import java.awt.event.
;
import java.awt.;
import javax.swing.
;

/*
class Spadanie implements Runnable  {

public static void run() {
for (;Kropelka.y<400; Kropelka.y++)
{
Kropelka.setLocation(Kropelka.x,Kropelka.y);
try
{
Thread.sleep(100);

        }catch (InterruptedException ie)
        {
    System.out.println(ie.getMessage());
        };
    }

}
}*/

// Spadnie sp = new Spadanie();
// sp.start();
/*
for (;y<400; y++)
{
//g.fillOval (x,y,10,10);
try
{
Thread.sleep(100);

        }catch (InterruptedException ie)
        {
    System.out.println(ie.getMessage());
        };
    }
*/
 

 //public static int kordynataX () {
//	return korx;

// }

public class Gra2 extends Frame {

static Label czas = new Label();
private Image img;

static int iloscpkt=0;
static int iloscczasu=200;

Kropelka kr = new Kropelka(10);
Kropelka kr2 = new Kropelka(50);
Kropelka kr3 = new Kropelka(56);

public Gra2 (String nazwa)throws IOException {

//Font f;
// int typ = Font.BOLD + Font.ITALIC;
// int wielkosc = 20;
// String nazwa = "Courier";

    //super ("Gra"); 
    setResizable(false);
	setSize(800,600); 
	setLocation(100,100);
	//setIgnoreRepaint(true);
	
	File sourceimage = new File(nazwa);
    img = ImageIO.read(sourceimage);
	};
	

	//setIgnoreRepaint(true);
	
    //g.drawString ("Ustawienia czcionki:",   200, 30);
	

	
	
	
	
	
	
	public void paint (Graphics g)
	{
		

// f = new Font (nazwa, typ, wielkosc);
//draw the image
//kr.

	int y=60;
	if( img != null)
		g.drawImage(img,0,0, this);
		g.translate(0,25);
		
		//g.validateTree();
		//Thread t1 = new Thread(kr);
       // t1.start();
        
		//Kropelka.paint(g);
		kr.render(g);
		kr2.render(g);
		kr3.render(g);
		kr3.y++;
		try
  {
    Thread.sleep(10);        
         
        }catch (InterruptedException ie)
        {
    System.out.println(ie.getMessage());
        };
        //validate();
        //pack();
		repaint();
	/*	
		try
  {
    Thread.sleep(1000);        
         
        }catch (InterruptedException ie)
        {
    System.out.println(ie.getMessage());
        };
 
	*/	
		
		
	//	repaint();
		

	//	kr2.setLocation(500,100);
	//	kr3.setLocation(300,300);
		//repaint();
		//kr.setLocation(500,500);
		
	
//	Kropelka kr = new Kropelka();
	
	
	
//g.setColor(Color.blue);
//	g.fillOval (300,300,100,100);

//	g.fillRect (200,200,50,50);
//	g.fillOval (300,200,30,50);
	}
	
	
	

 //Kropelka kr = new Kropelka(100);

public static void main (String [] args) throws IOException {

    Frame gra = new Gra2 ("pn.jpg");
    gra.setLayout(null);
    
    	
    
    
    // tu doświadczenia
    Label punkty = new Label();
    //Label czas = new Label();
    Zegar zgr = new Zegar();
    zgr.start();
    
    
    //gra.setIgnoreRepaint(true);
    
    
    
  //  Label cos =new Label();
  //  cos.setLocation(500,100);
  //  cos.setSize(100,100);
   // cos.setBackground(Color.orange);
    
    
    //kr.setLocation(500,500);
    //Kropelka kr = new Kropelka(100);
   // Kropelka kr2 = new Kropelka(300);
   // Thread t1 = new Thread(kr);
   // t1.start();
   // kr.paint(gra);
   
    
   
   
    //tu ustawiam kolor czcionki
    czas.setForeground(Color.yellow);
    //czas.setColor(Color.white);
    //czas.setText("co jest");
    
    
    

    
    
    punkty.setText(""+iloscpkt);
    punkty.setBackground(Color.orange);
    czas.setBackground(Color.orange);
    // punkty.setVerticalTextPosition(JLabel.BOTTOM);
	//punkty.setHorizontalTextPosition(JLabel.CENTER);

    Font f =new Font("sansserif", Font.BOLD, 30);
    //f.setColor(Color.blue);
    //setColor(Color.blue);
    //f.setColor(Color.black);

    punkty.setFont(f);
    czas.setFont(f);
    
    
    czas.setBounds(700,50,80,40);
    punkty.setBounds(10,50,100,40);
    //cz.setVisible(true);
	//f.setLabel(new FlowLayout());
    //punkty.setTestSize(20);
    
    
    
   // gra.setBackground(Color.blue); 
    //Panel p = new Panel();
   // p.setOpaque(false);
    //Button b=new Button("przycisk");
    //p.setOpaque(false);
      //etykieta.setBounds(2,2,100,100);
    //kr.setVisible(true);
    punkty.setVisible(true);
    czas.setVisible(true);
    //tu wkeliłem
    
    int ilosc=1;
    
    



    //w.start();
   // punkty.setText(""+iloscpkt);
    

// cz.setVisible(true);
// b.setVisible(true);
//p.add(b);
// b.setBounds(2,2,100,100);

    //etykieta.setTextColor(Color.green);
   // b.setBackground(Color.yellow);
    //b.setTextColor(Color.green);
   // gra.add(b);
    //setLayout(new FlowLayout(FlowLayout.CENTER));
    //gra.add(kr);

    gra.add(punkty);
    gra.add(czas);
   // gra.add(cos);
    

    
    
     gra.addWindowListener(new WindowAdapter(){ 
     public void windowClosing(WindowEvent e){ 
     System.out.println("Dziekujemy za prace z programem..."); 
     System.exit(0); 
      } 
    }); 
    gra.setVisible(true); 
    
    
 //tutaj jest zmienianie punktów   
 
 
 
 /*
    
    for (; iloscczasu > 0; iloscczasu--)
  {
  	czas.setText(iloscczasu/60+":"+iloscczasu%60);
  try
  {
    Thread.sleep(1000);        
         
        }catch (InterruptedException ie)
        {
    System.out.println(ie.getMessage());
        };
    }
  */ 
   /*
   
   
  int y=20;
  int x=kr.kordynataX();
  punkty.setText("66jo "+x);
 
   
  for (;y<400; y++)
  {
  	kr.setLocation(x,y);
  try
  {
    Thread.sleep(100);        
         
        }catch (InterruptedException ie)
        {
    System.out.println(ie.getMessage());
        };
    }
    */
     
    
}

}

class Zegar extends Thread {

public void run() {

for (; Gra2.iloscczasu > 0; Gra2.iloscczasu--)
{
Gra2.czas.setText(Gra2.iloscczasu/60+":"+Gra2.iloscczasu%60);
try
{
Thread.sleep(1000);

        }catch (InterruptedException ie)
        {
    System.out.println(ie.getMessage());
        };
    }

}
}

class Kropelka extends Point implements Runnable
{
// setIgnorerepaint(true);
private int rozmiar;
// public static int korx;
int y=60;
int x=(int)(Math.random()*600)+100;
int ilpk;

public Kropelka(int rozmiar){
  •  *super("Gra2");
    

    this.rozmiar=rozmiar;
    ilpk=(100-rozmiar)/2;

    //setLocation(400,400);
    }

    public void render (Graphics g) {

// super.paint( g );

// korx=x;
//wsx=x;
g.setColor(Color.blue);
g.fillOval (x,y,rozmiar,rozmiar);
//g.repaint();
/*
for(;y<400;y++){

 try
  {
    Thread.sleep(100);        
         
        }catch (InterruptedException ie)
        {
    System.out.println(ie.getMessage());
        };
 
 
 
 
 //g.setLocate(x,y);	
 
 }
 
 */
}


public void run () { 

for (;y<400;y++)
  {
  	setLocation(x,y);
  	//Kropelka.repaint();
  try
  {
    Thread.sleep(100);        
         
        }catch (InterruptedException ie)
        {
    System.out.println(ie.getMessage());
        };
    }
	
}
}

Sorry, za jasność kodu, to nie jest ostateczna wersja. Chciałem, żeby obraz się tak bardzo nie smużył, przy przeładowywaniu go (symulacji ruchu). Metoda repaint jest chyba nienajlepsza do tego, próbowałem validate, ale ona chyba w ogóle nie działa. Wie ktoś, jak zrobić synchroniczne odświeżanie obrazu, żeby nie było smużenia? Z góry dzięki za pomoc! :)