[quote=ViniGodoy]Algumas APIs para a leitura de periféricos, tem métodos de read que bloqueiam por um tempo máximo, em milisegundos. Assim, se o periférico não responder, o read retorna um código de erro e não fica bloqueado.
Não sei se a RXTX tem isso, pois eu usava a javax.comm (que por sinal não tinha).
Sem isso, é impossível sair do método read sem que haja intervenção do usuário (resetando o hardware ou desconectando o cabo).
No caso do evento, veja o link:
http://www.guj.com.br/posts/list/209516.java#1065181[/quote]
Olá vini / Pessoal,
Consegui implementar parte das coisas, veja o que eu fiz:
Declarei uma interface…
public interface ThreadListener {
public void endRun();
public void endBytes();
}
Na classe que faz leitura da porta serial ( seguindo o exemplo daquele post do Javacomm, porém, utilizando rxtx ) que implementa Runnable fiz o seguinte:
public class PortaSerialCOM implements SerialPortEventListener, Runnable {
private ThreadListener threadListener;
@Override
public void serialEvent(SerialPortEvent serialPortEvent) {
//código que lê a serial
...
mensagemRecebida=Dadoslidos;
// Avisa ouvintes que o método de recebimento de bytes da porta serial terminou
this.threadListener.endBytes();
...
}
@Override
public void run() {
// TODO Auto-generated method stub
try {
Thread.sleep(5000);
// Avisa ouvintes que o método run() terminou
this.threadListener.endRun();
}catch(Exception e) {
System.out.println("Erro. Status = " + e );
}
}
...
}
Criei um botão especial que implementa a interface
ThreadListener
public class BotaoAceitar extends JButton implements ThreadListener{
public BotaoAceitar(){
super();
this.setEnabled(false);
}
@Override
public void endBytes() {
this.setEnabled(true);
}
@Override
public void endRun() {
// TODO Auto-generated method stub
}
}
Na classe que tem o método responsável pela Importação de dados seriais fiz assim:
public Projeto importar()
{
Object[] botoesDialogo = new Object[2];
String mensagemRecebida;
//Abre comunicação com a porta serial
try{
portaSerialCOM.abrirPorta(portaSerial);
portaSerialCOM.lerMensagem();
JButton botaoCancelar = new JButton();
botaoCancelar.setText("Cancelar");
BotaoAceitar botaoAceitar = new BotaoAceitar();
botaoAceitar.setText("Aceitar");
//Aqui registro o botao para ouvir a ThreadListener
portaSerialCOM.addThreadListener(botaoAceitar);
botoesDialogo[0] = botaoAceitar;
botoesDialogo[1] = botaoCancelar;
int resposta = JOptionPane.showOptionDialog(null, "Deseja Cancelar Importação?", "Importando Projeto",0,JOptionPane.QUESTION_MESSAGE,null,botoesDialogo,botoesDialogo[1]);
System.out.println(resposta);
if(resposta==0){
}
}catch(Exception e){
}finally{
portaSerialCOM.fecharPorta();
}
mensagemRecebida=portaSerialCOM.mensagemRecebida;
Agora o problema está no JOptionPane.showOptionDialog, como se pode ver, construi dois botões, ou seja, não quero usar os default do JOptionPane.
Quando inicio a importação, o botão “aceitar” vem desabilitado e o de “cancelar” habilitado, como é o esperado, porém, nenhum dos dois respondem ao evento retornando um inteiro para a variável resposta.
Se eu implementar listeners para eles funciona, eles respondem, mas eu queria que eles funcionacem como botoes normais do JOptionPane, não tem como?
Abraço e obrigado a todos pela ajuda!