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?
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.
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?
É 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:
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.
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. 