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…
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…