Ver Mensaje Individual
  #1 (permalink)  
Antiguo 09/02/2015, 15:56
macamba
 
Fecha de Ingreso: octubre-2009
Mensajes: 47
Antigüedad: 14 años, 6 meses
Puntos: 0
Interface se bloquea o Invalid thread access

Hola a todos,

Estoy empezando con java y lo que a simple vista parece muy sencillo no hay manera de hacerlo, se trata de un simple ejemplo, lo que quiero hacer es que cuando pulse el botón se actualice el valor del campo de 0 a 100000 pero sin que bloque la interface y pueda ver como se actualiza hasta acabar la tarea.

El caso es que recibo el error "Invalid thread access" y si trato de usar "Display.getDefault().asyncExec..." se bloquea la interface hasta que finaliza.

Alguna sugerencia ante mi dilema?

Gracias

Código:
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;

public class Example
{
protected Shell shell;
private Text text;
static int count = 0;

public static void main(String[] args)
 {
 try
  {
  Example window = new Example();
  window.open();
  }
 catch(Exception e)
  {
  e.printStackTrace();
  }
 }

public void open()
 {
 Display display = Display.getDefault();
 createContents();
 shell.open();
 shell.layout();
 while(!shell.isDisposed())
  {
  if(!display.readAndDispatch())
   {
   display.sleep();
   }
  }
 }

protected void createContents()
 {
 shell = new Shell();
 shell.setSize(450, 300);
 shell.setText("SWT Application");
		
 text = new Text(shell, SWT.BORDER);
 text.setBounds(10, 10, 76, 21);
		
 Button btnNewButton = new Button(shell, SWT.NONE);
 btnNewButton.addSelectionListener(new SelectionAdapter()
  {
  @Override
  public void widgetSelected(SelectionEvent e)
   {
   Thread newThread = new Thread(new Runnable()
    {
    @Override
    public void run()
     {
     for(int i = 0; i < 100000; ++i)
      {
      text.setText(count + "");
      ++count;
      }
     }
    });
   newThread.start();
   }
  });
 btnNewButton.setBounds(94, 10, 75, 25);
 btnNewButton.setText("New Button");
 }
}