2016-05-04 14 views
0

Ich möchte die Schaltfläche Steuerelemente rechtzeitig hinzufügen. Das bedeutet, nachdem die Shell geöffnet wurde, sollte es beginnen, die Tasten nacheinander in einer Verzögerung von 1 Sekunde zu platzieren. Ich habe das Programm geschrieben, es funktioniert jedoch nicht. Alle Schaltflächen sind nur sichtbar, nachdem alle Steuerelemente platziert wurden. Irgendeine Art von Aktualisierungsproblem, denke ich. Folgendes ist mein Code.geben Verzögerung bei der Anzeige der Steuerelemente

public class DelayAddingComponentsExample { 

    public static void main(String[] args) { 
     Display display = new Display(); 
     final Shell shell = new Shell(display); 
     shell.setSize(200, 200); 
     shell.setLayout(new FillLayout(SWT.VERTICAL)); 
     addAutomatically(shell); 
     // removeAutomatically(shell); 
     shell.open(); 
     while (!shell.isDisposed()) { 
      if (!display.readAndDispatch()) { 
       display.sleep(); 
      } 
     } 
     display.dispose(); 
    } 

    public static void addAutomatically(final Shell shell) { 
     for (int i = 0; i < 5; i++) { 
      final Button button = new Button(shell, SWT.NONE); 
      button.setText("Button" + i); 
      button.setVisible(false); 

     } 

     shell.getDisplay().timerExec(0, new Runnable() { 

      @Override 
      public void run() { 

       for (int i = 0; i < 5; i++) { 
        try { 
         Thread.sleep(500); 
         final Button button = new Button(shell, SWT.NONE); 
         button.setText("Button" + i); 
         button.setVisible(true); 
         shell.pack(); 
         shell.layout(true); 
         shell.redraw(); 

        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
       } 

      } 

     }); 
    } 
    public static void removeAutomatically(final Shell shell) { 
     for (int i = 0; i < 5; i++) { 
      final Button button = new Button(shell, SWT.NONE); 
      button.setText("Button" + i); 
      shell.layout(true); 
     } 
     shell.getDisplay().timerExec(0, new Runnable() { 
      @Override 
      public void run() { 
       Control[] controls = shell.getChildren(); 
       for (Control control : controls) { 
        try { 
         Thread.sleep(500); 
         control.dispose(); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
       } 
      } 
     }); 
    } 
} 

Antwort

0

The Runnable zu timerExec läuft in der UI-Thread gegeben. So blockieren die Thread.sleep Aufrufe, die Sie machen, den UI-Thread - es ist wichtig, dass Sie diesen Thread niemals blockieren. Nie Anruf Thread.sleep im UI-Thread.

Sie müssen jeden Schritt mit einem separaten timeExec Aufruf ausführen und den Verzögerungsparameter des Aufrufs timerExec verwenden, um anzugeben, wie lange gewartet werden soll.

So

shell.getDisplay().timerExec(500, new Runnable() { 
    @Override 
    public void run() 
    { 
    // TODO code for the first button only 

    // Schedule next update 
    shell.getDisplay().timerExec(500, .... code for second button); 
    } 
    }); 

Läuft die Runnable nach 500 millseconds, tun die Runnable sollte nur den ersten Schritt und timerExec dann wieder aufrufen, den nächsten Schritt zu planen.