Duvido atualizacao

Estou fazendo um programa eu quero atualizar minha tela a medida que um dado vai sendo enviado , mas ele so o faz uma vez na primeira, ja fiz inumeros testes dentro do bloco switch ele entra mas nao faz direito , se puderem dar uma olhada no codigo agradeco

ps : esqueci de dizer, o que eu quero é que o JFrame fique lá mas que nao precise abrir outro para mostrar , pq so estou conseguindo fazer abrindo outro JFrame


import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

public class Servidor extends JFrame {

	static Canvas1 c1 = new Canvas1();
	
	static Canvas2 c2 = new Canvas2();
	
	static Canvas3 c3 = new Canvas3();
	
	static Canvas4 c4 = new Canvas4();
	
	static Canvas5 c5 = new Canvas5();
	
	JButton close = new JButton("Fechar Janela");
	
	static DataInputStream rfile;
	
	static int s;
	
	public Servidor() throws UnknownHostException, IOException{
		
		super("Contato via socket");
					
		Socket client = new Socket(InetAddress.getByName("127.0.0.1"),10000);
		
		JOptionPane.showMessageDialog(null,"Conexao Estabelecida via socket");
		
		rfile = new DataInputStream(client.getInputStream());
		
				
		setLayout(new BorderLayout());		
		
		add(close,BorderLayout.SOUTH);


}


public void showC(int z) throws IOException{
		
		
		switch(z)
		
		{
			
		case 0: add(c1); c1.repaint();   break; // posicao 0
		 
		case 1: add(c2); c2. repaint();  break; // posicao A
		 
		case 2: add(c3); c3.repaint();   break; // posicao B
		
		case 3: add(c4); c4.repaint();  break; // posicao C
		
		case 4: add(c5); c5.repaint();  break; // posicao D
		
		default: setVisible(false); break;
		
		}	
	
	
		
	}



public static void main(String args[]) throws IOException{
		
	
		
		Servidor k = new Servidor();
		
		k.setSize(500,500);	
		
		k.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		

               while(true)
		
		{	
			
	
		
		s = rfile.readInt();
		
		
		k.showC(s);
	
		
		k.setVisible(true);
			
		System.out.println(s);		
		
		
		if(s==5) break; 
		
		}
		
		

	
			
	
	


		
		

	
	}


}

classe de uma dessas que extendi de canvas




import java.awt.*;

import javax.swing.*;


public class Canvas1 extends Canvas {

	

	Image i;
	
	
	
	public Canvas1()
	
	{
	
		i = Toolkit.getDefaultToolkit().getImage("Basquete1.gif"); 
	
	}
	
	public void paint(Graphics g)
	{
	g.drawImage(i, 30, 40, this);
	}

	
}
	
	
	
	















So mais uma duvida tentei fazer isso , mas nao consegui , foi tentar sobrescrever o metodo paint adicionando algo a mais


import java.awt.*;



public class Canvas1 extends Canvas {

	

	Image i;
	Image i2;
	Image i3;
	Image i4;
	Image i5;
	
	//ImageIcon a;
	
	
	public Canvas1()
	
	{
	
		i = Toolkit.getDefaultToolkit().getImage("Basquete1.gif"); 
		
		i2 = Toolkit.getDefaultToolkit().getImage("Basquete2.gif"); 
		
		i3 = Toolkit.getDefaultToolkit().getImage("Basquete3.gif"); 
		
		i4 = Toolkit.getDefaultToolkit().getImage("Basquete4.gif"); 
		
		i5 = Toolkit.getDefaultToolkit().getImage("Basquete5.gif"); 
	
	}
	
	public void paint(Graphics g, int z)
	
	{	
		switch(z){
		
		case 0: g.drawImage(i, 30, 40, this);
		
		case 1: g.drawImage(i2,30, 40, this);
			
		case 2: g.drawImage(i3,30,40,this);
		
		case 3: g.drawImage(i4,30,40,this);
	
		case 4: g.drawImage(i5, 30 ,40 , this);
		
		}
		
		
	
	}

	

	
	
	
	
	
	
}
	
	
	
	

mas falta alguma coisa , esse metodo que eu tentei sobrescrever é o que eu exatamente preciso , se eu estiver falando alguma besteira , desconsidere , é pq eu estou começando a pouco tempo