Habilitar botão SWT dentro do evento oncliked do AWT

5 respostas
M

Boa noite pessoal!
Preciso habilitar um botão que foi criado usando SWT ao clicar em um objeto Canvas só que obtenho uma Thread Exception devido o objeto não ser SWT, ou seja, não tenho acesso a outra Thread.

canvasCap1.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent e) { imgselecionada = 1; esczoom = 0; if (!videoiniciado){ canvasv = new Canvas(){ private static final long serialVersionUID = 1L; public void paint(Graphics g){ Dimension dFrame = frame.getSize(); double x = dFrame.getWidth(); double y = dFrame.getHeight(); g.drawImage(imagens.get(0).getScaledInstance((int)x, (int)y, 1), 0, 0, null); } }; //Preciso habilitar o botão aqui... frame.removeAll(); frame.add(canvasv); frame.validate();

Alguém pode me ajudar como posso fazer isso?

5 Respostas

ViniGodoy

E por acaso a variável videoIniciado vale false?

Qual é a exception que você está tendo? Já tentou usar o depurador?

Me parece que o problema não tem absolutamente nada a ver com o que você desconfia que seja.

M

1 - A variável videoiniciado vale false sim, até ai ok.
2- A exception que ocorre é essa:

Exception in thread "AWT-EventQueue-0" org.eclipse.swt.SWTException: Invalid thread access at org.eclipse.swt.SWT.error(SWT.java:3884) at org.eclipse.swt.SWT.error(SWT.java:3799) at org.eclipse.swt.SWT.error(SWT.java:3770) at org.eclipse.swt.widgets.Widget.error(Widget.java:463) at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:355) at org.eclipse.swt.widgets.Control.setEnabled(Control.java:2923)

Agora segue exatamente onde estou tentando habilitar o botão de zoom ao clicar na imagem.

canvasCap1.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent e) { imgselecionada = 1; esczoom = 0; if (!videoiniciado){ canvasv = new Canvas(){ private static final long serialVersionUID = 1L; public void paint(Graphics g){ Dimension dFrame = frame.getSize(); double x = dFrame.getWidth(); double y = dFrame.getHeight(); g.drawImage(imagens.get(0).getScaledInstance((int)x, (int)y, 1), 0, 0, null); } }; btnZoomais.setEnabled(true);//O problema ocorre aqui... frame.removeAll(); frame.add(canvasv); frame.validate();

alguém se arrisca?

ViniGodoy

É uma boa prática ler um pouco sobre a exception:
http://wiki.eclipse.org/FAQ_Why_do_I_get_an_invalid_thread_access_exception%3F

Display.getDefault().asyncExec( new Runnable() { public void run() { btnZoomais.setEnabled(true); } } );

PS: O Swing tem exatamente a mesma arquitetura. Para alterar objetos do Swing a partir de outras threads, você troca a primeira linha por:

M

Obrigado Vini funcionou blz.
Vo seguir seu conselho e estudar mais sobre o assunto. Estou estudando java mas tenho pouca experiência.
De qualquer forma muito obrigrado!

Até a próxima.

ViniGodoy

Nem é questão de experiência. Simplesmente digitei: “Invalid thread access” no google e abri a primeira página que apareceu.
E lá estava a explicação, bem detalhada, do que deveria ser feito para evitar o problema.

Eu mesmo nunca programei em SWT. Então vc é mais experiente nela que eu. :slight_smile:

Criado 9 de dezembro de 2010
Ultima resposta 9 de dez. de 2010
Respostas 5
Participantes 2