Tela de Estado(JDialog) não atualiza

Pessoal, sou iniciante em Java e
minha aplicação necessita exibir uma tela
de estado de um dispositivo.

Acontece que quando exibo a tela ela não
renderiza, o dialogo congela.

O Dialogo está dentro de um While, onde
fico monitorando o estatus do dispositivo.

Agradeço qualquer ajuda…

cria um observer.

Não conheço como funciona este Observer,
mas o que necessito é somente que
a janela JDialog atualize o seu conteúdo.

assim…

vc criou um dialog mostrando um status, entao vc deve ter algum listener que fica verificando esse status certo??

hora que o status mudar chame algum metodo que atualize a vizualizaçao do dialog.

Veja como está meu código:

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class t4 extends JFrame 
{
	private TelaEstadoNew tnew = new TelaEstadoNew();

	public t4()
	{
		getContentPane().setLayout( new FlowLayout() );  
		getContentPane().add( new JTextField("TESTES") );  
		JButton b = new JButton("OK");   
		getContentPane().add( b );
		  
	    b.addActionListener(  
	            new ActionListener() {  
	                public void actionPerformed(ActionEvent arg0) {  
	                    tnew.setTitle("Titulo 1");
	            		tnew.setMensagem("Titulo 2");
	            		tnew.setImagem("W95MBX041.jpg");
	            		tnew.setIcon("W95MBX041.jpg");
	            		tnew.showButtonCancel(true);
	            		tnew.showButtonContinue(true);
	            		tnew.showDialog();
	            		tnew.setVisible(true);

	            		Thread t = new Thread(tnew);
	            		t.start();

	            		//Meus processamentos
	            		//Atualiza a mensagem
	            		tnew.setTitle("Mensagem 2");
	            		tnew.setVisible(true);
	            		
	            		int cont = 0;

	            		while(cont < 50000)
	            		{
	            			cont++;
	            			try
	            			{
	            				Thread.sleep(1000);
	            			}
	            			catch(InterruptedException e)
	            			{
	            				e.printStackTrace();
	            			}
		           		}

	            		cont = 0;
	            		while(cont < 50000)
	            		{
	            			cont++;
	            		}
	            		
	            		//Ajusta o estado da classe de estado 
	            		//para que ela encerre.
            			tnew.setEstado(99);	            		
	            		System.out.print("\n4");
	                }
	            }  
	            );  
	    setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );  
	    pack();
	}

public static void main(String[] args) {  
    t4 t = new t4();  
    t.setVisible(true);
    
}  
}  

A outra classe é :

import javax.swing.*;

import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;

import javax.swing.ImageIcon;

public class TelaEstadoNew extends JFrame implements Runnable
{
	public static final int CANCEL_BUTTON = 1;
	public static final int CONTINUE_BUTTON = 2;
	
	/** Botão Continuar */
	protected JButton btoContinuar;
	
	/** Botão Cancelar */
	protected JButton btoCancelar;
	
	/** Indica o botão que foi selecionado no diálogo */
	private int selectedButton;
	
	/** Flag que indica se irá exibir o botão Cancelar*/
	private boolean showButtonCancel;
	
	/** Flag que indica se irá exibir o botão Continuar */
	private boolean showButtonContinue;
	
		
	/** Label para exibir o icone */
	private JLabel label1;
	
	/** Label para exibir a imagem */
	private JLabel label2;
		
	/** Label para exibir o conteúdo da Mensagem na tela de estados*/
	private JTextPane textArea ;
	
	/** Mensagem a ser exibida no diálogo*/
	private String mensagem = "";
	
	/** Icone exibido ao lado da mensagem no diálogo*/
	private ImageIcon icone;
	
	/** Imagem que será exibida abaixo do diálogo*/
	private ImageIcon imagem;
	
	/** Indica a altura do diálogo*/
	protected int height;
	
	/** Indica a largura do diálogo*/
	protected int width;
	
	private int estado;

	public TelaEstadoNew() 
	{
		super();
		initialize();
	}
	
	public void run()
	{
		int cont = 0;
		while(this.getEstado() == 0)
		{
        	showDialog();
			this.setVisible(true);
			try
			{
				Thread.yield();
				Thread.sleep(1000);
			}
			catch(InterruptedException e)
			{
				
			}
			if(showButtonCancel == true || showButtonContinue == true)
			{
				this.estado = 99;
				this.setVisible(false);
			}
			
		}
	}
	private void initialize() 
	{
		getContentPane().removeAll();
		getContentPane().setLayout(null);
	
		setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
		setLocation(150, 150);
		setResizable(false);
	}
	
	private void createFrame()
	{
		if(this.imagem == null)
		{
			this.setSize(420,150);
		}
		else
		{
			this.setSize(420,400);
		}

		//Centralizar o Diálogo
		Dimension SCREEN_SIZE = Toolkit.getDefaultToolkit().getScreenSize();
		setLocation(SCREEN_SIZE.width/2 - getWidth()/2, 
					SCREEN_SIZE.height/2 - getHeight()/2);
		
		//Obtém as medidas do diálogo
		width = this.getSize().width;
		height = this.getSize().height;
	}
	
	  protected void setSelectedButton(int sel)
	    {
	    	selectedButton = sel;
	    	this.hide();
	    }

	    public void showButtonCancel(boolean value)
	    {
	    	this.showButtonCancel = value;
	    }
	    
	    public void showButtonContinue(boolean value)
	    {
	    	this.showButtonContinue = value;
	    }
	    
	    public int getSelection()
	    {
	    	return this.selectedButton;
	    }

	    public void setMensagem(String msg)
    {
    	mensagem = msg;
    }
    
     
    public synchronized void setEstado(int Estado)
    {
    	this.estado = Estado;
    }
    
    public synchronized int getEstado()
    {
    	return this.estado;
    }
    
    public void setIcon(String img)
    {
    	this.icone = createImageIcon(img, "");
    }
    
    public void setImagem(String img)
    {
    	if(img.compareToIgnoreCase("") > 0)
    	{
    		this.imagem = createImageIcon(img,"");
    	}
    	else
    	{
    		this.imagem = null;
    	}
    }
    
  	public void showDialog()
	{
		int x;
		createFrame();
		
		x = width/2 - 320/2;
		
		//Ajusta a área de exibição da mensagem.
		textArea = new JTextPane();
		textArea.setText(mensagem);
		textArea.setBounds(x + 10, 10, 320, 100);
		textArea.setFont(new Font("dialog", 0, 15));
		textArea.setForeground(SystemColor.controlText);
		textArea.setBackground(getContentPane().getBackground());
		textArea.setEditable(false);
		textArea.setAutoscrolls(false);
		getContentPane().add(textArea);
		textArea.repaint();
		
		//Ajusta a área de exibição do ícone.
		label1 = new JLabel(icone, JLabel.CENTER);
		label1.setBounds(15, 15, 35, 35);
		getContentPane().add(label1);
		
		//Verifica se existe imagem para exibir.
		if(this.imagem != null)
		{
			label2 = new JLabel(imagem, JLabel.CENTER);
			label2.setBounds(width/2 - ((imagem.getIconWidth()+100)/2), height/2 - ((imagem.getIconHeight()+100)/2), imagem.getIconWidth()+100, imagem.getIconHeight()+100);
			getContentPane().add(label2);
		}
		
		//Exibe botões configurados.
	
		if(showButtonCancel)
		{
		if(showButtonContinue)
		{
			x = 120;
		}
		else
		{
			x = this.width / 2 - 100/2;
		}
		
		btoCancelar = new JButton();
		btoCancelar.setName("btoCancelar");
		btoCancelar.setBounds(105, this.height -80 , 100, 30);
		btoCancelar.setText("Cancelar");
		btoCancelar.setFont(new Font("dialog", 0, 12));
		btoCancelar.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent e)
			{
				setSelectedButton(CANCEL_BUTTON);
			}});
		this.getContentPane().add(btoCancelar);
	}
	
	if(showButtonContinue)
	{
		if(showButtonCancel)
		{
			x = 230;
		}
		else
		{
			x = width/2 - 100/2;
		}
		
		btoContinuar = new JButton();
		btoContinuar.setName("btoContinuar");
		btoContinuar.setBounds(180, height -80, 100, 30);
		btoContinuar.setText("Continuar");
		btoContinuar.setFont(new Font("dialog", 0, 12));
		
		btoContinuar.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent e)
			{
				setSelectedButton(CONTINUE_BUTTON);
			}});
		getContentPane().add(btoContinuar);
		btoContinuar.requestFocus();
	}
	
		getContentPane().repaint();
		getContentPane().setVisible(true);
		//setVisible(true);
		//this.getContentPane().repaint();
	}	
	
	/** Retorna um objeto ImageIcon, ou null se o path for inválido. */
    private ImageIcon createImageIcon(String path,
                                               String description) {
        java.net.URL imgURL = TelaEstadoNew.class.getResource(path);
        if (imgURL != null) {
            return new ImageIcon(imgURL, description);
        } else {
            System.err.println("Arquivo de imagem não encontrado: " + path);
            return null;
        }
    }
    
   	
}



Seu código está rodando dentro do actionPerformed. E esse método é tratado na thread do Swing.
Por isso, o swing irá esperar que o código termine, antes de processar outras coisas, como a pintura de tela.

Aliás, não entendi qualé a daquele while enorme ali com um sleep dentro. O seu processamento mesmo está em outra thread, mas aquele while travando a execução não está certo.

Aliás, seu método run() também está esquisito… que tipo de processamento vc tá fazendo ali dentro?

Dê nomes mais significativos, pq eu não entendi o que a classe “t4” deveria fazer…