Problemas com o método wait() da Thread!

2 respostas
J

Dae galera!! Eu fiz duas classes, uma com uma interface e outra que é uma thread, essa mostra a cada 5 segundos a minha interface e se ela já estiver visível, ela fica esperando para abrir outra!! O problema é esse, quando eu verifico se ela está visível e do um wait(), tá dando a seguinte mensagem de erro:

Exception in thread "Thread-2" java.lang.IllegalMonitorStateException: current thread not owner
	at java.lang.Object.wait(Native Method)
	at java.lang.Object.wait(Unknown Source)
	at haltso.sinco.model.Mensagem.run(Mensagem.java:23)

Os fontes são esses:

Interface gráfica:

package view;

import model.Mensagem;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class JMensagem extends JFrame {

	private static final long serialVersionUID = 1L;
	private Container c;
	
	public JMensagem() {
		init();
	}
	
	private void init() {
		c = this.getContentPane();
		
		this.setSize( new Dimension( 135, 200 ));
		this.setTitle( "Mensagens instantâneas" );
		this.setResizable( false );
		this.addWindowListener( new WindowAdapter() {
			public void windowClosing( WindowEvent e ) {
				dispose();
			}
		});
		
		this.setLocation( 1135, 770 );
		
		c.add(makePanelPrincipal());
	}
	
	private JPanel makePanelPrincipal() {
		
		JPanel pnlPrincipal = null;
		
		if( pnlPrincipal == null ) {
			pnlPrincipal = new JPanel( new BorderLayout());
			
			JTextArea txaMensagem = new JTextArea();
			txaMensagem.setText( "  - My name is Bond!!!" );
			JScrollPane scroll = new JScrollPane();
			scroll.setViewportView( txaMensagem );
			
			pnlPrincipal.add( scroll );
		}
		
		return pnlPrincipal;
	}

	public static void main(String[] args) {
		JMensagem msn = new JMensagem();
		Mensagem msnT = new Mensagem(msn);
		msnT.start();
	}

}

E a Thread:

package model;
import javax.swing.JFrame;

public class Mensagem extends Thread {
	
	private JFrame frm;
	
	public Mensagem( JFrame frm ) {
		this.frm = frm;
	}
	
	public void run() {
		
		while( true ) {
			try {
				Mensagem.sleep( 5000 );
				frm.setVisible( true );
				while( frm.isVisible()) {
					this.wait();
				}
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

Valeu!!!

2 Respostas

J

wait() só pode ser usado dentro de um bloco synchronized.

J

Quando eu olhei a tua resposta, já tinha verificado isso!! Agora ele não dá mais o erro, mas ele não mostra o JFrame depois que eu fecho!!!
Valeu!!

Criado 24 de outubro de 2006
Ultima resposta 24 de out. de 2006
Respostas 2
Participantes 2