SWT aktualisieren / neu zeichnen / layout problem

Ich kenne viele Menschen erleben dieses problem, aber die Lösungen, die ich online gefunden haben, scheinen nicht zu lösen meinen. Ich habe ein composite, das hat drei Knöpfe. Was ich will ist Folgendes :
Wenn ich auf eine Schaltfläche, möchte ich einige andere Schaltfläche ausgegraut ( setEnabled(false) ) und nach einer Weile (nach einer Methode Ausführung), möchte ich den button wieder aktiviert werden.

Viele solche Probleme gelöst werden können durch aufrufen von " layout () - Methode des übergeordneten Containers oder diese sehr ähnlich ein wird gelöst durch Aufruf von Display.getCurrent().update();

Einfach, mein code könnte wie folgt zusammengefasst werden :


import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Button;


public class app1 {

    protected Shell shell;

    /**
     * Launch the application.
     * @param args
     */
    public static void main(String[] args) {
        try {
            app1 window = new app1();
            window.open();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

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

    /**
     * Create contents of the window.
     */
    Button button1 , button2 , button3;
    Label label;
    protected void createContents() {
        shell = new Shell();
        shell.setSize(450, 300);
        shell.setText("SWT Application");
        shell.setLayout(new GridLayout(1,false));
        {
            final Composite composite = new Composite(shell, SWT.NONE);
            composite.setLayout(new GridLayout(3,false));
            GridData gd_composite = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL);
            gd_composite.grabExcessHorizontalSpace = true;          
            gd_composite.horizontalSpan = 10;   //?
            gd_composite.verticalIndent = 5;
            composite.setLayoutData(gd_composite);
            GridData gd_button;

            {
                button1 = new Button(composite, SWT.NONE);
                button1.setText("Button 1");
                gd_button = new GridData(SWT.FILL, GridData.BEGINNING, false, false);
                gd_button.horizontalSpan = 1;
                button1.setLayoutData(gd_button);
                button1.addSelectionListener(new SelectionListener(){
                    public void widgetSelected(SelectionEvent e){
                        try{
                        button2.setEnabled(false);
                        button2.redraw();
                        button2.update();

                        //composite.redraw();
                        //composite.update();
                        //composite.layout();

                        shell.redraw();
                        shell.update();
                        shell.layout();                     
                        Display.getCurrent().update();
                        }   catch   (Exception e2)  {
                            System.err.println("exception e : " + e2.toString());
                        }

                        System.out.println("basla");


                        try {
                            System.out.println("sleep1");
                            Thread.sleep(100);
                        } catch (InterruptedException e1) {
                            e1.printStackTrace();
                        }   catch (Throwable th)    {
                            System.err.println("th: " + th.toString());
                        }
                        try {
                            System.out.println("sleep2");
                            Thread.sleep(100);
                        } catch (InterruptedException e1) {
                            e1.printStackTrace();
                        }   catch (Throwable th)    {
                            System.err.println("th: " + th.toString());
                        }
                        try {
                            System.out.println("sleep3");
                            Thread.sleep(100);
                        } catch (InterruptedException e1) {
                            e1.printStackTrace();
                        }   catch (Throwable th)    {
                            System.err.println("th: " + th.toString());
                        }

                        for(int i=0 ; i < 10000 ; i++)
                        {
                            System.out.println(i);
                        }
                    }
                    public void widgetDefaultSelected(SelectionEvent e) {
                        System.err.println("widgetDefault !");
                    }
                });
            }
            {
                button2 = new Button(composite, SWT.NONE);
                button2.setText("Button 2");
                gd_button = new GridData(SWT.FILL, GridData.CENTER, false, false);
                gd_button.horizontalSpan = 1;
                button2.setLayoutData(gd_button);
                button2.addSelectionListener(new SelectionListener(){
                    public void widgetSelected(SelectionEvent e){
                        button1.setEnabled(false);
                        composite.layout();
                        for (int i=1; i<=100; i++) {
                             try {
                                  Thread.sleep(10);
                             } catch (Throwable th) {}
                            label.setText(i + " %");
                            label.update();
                        }
                    }
                    public void widgetDefaultSelected(SelectionEvent e) {}
                });
            }

            {
                label = new Label(composite , SWT.NONE);
                label.setText("0 %");
                label.update();
            }
        }
    }
}

Was passiert ist, wird der button deaktiviert, nach dem Ende der widgetSelected () - Methode erreicht ist. Allerdings, die Bezeichnung wird Häufig aktualisiert, ohne Probleme (auch wenn Sie das Etikett.update () - Methode ist es nicht)

Zusätzliche Informationen : Sagen, dass ich deaktivieren Sie die-Taste, dann setzen Sie einen Thread.sleep() und aktivieren Sie dann die-Taste ; es schläft zuerst und dann schnell deaktiviert und aktiviert die Schaltfläche. Also ich glaube, dass alle diese Farbe Anfragen sind in der Warteschlange und verarbeitet werden am Ende der Ausführung.

Nützliche Informationen: ich erkannte, dass, als ich das erstellen und anzeigen einer MessageBox Recht nach meiner Anzeige änderungen die Anzeige der änderungen auftreten. Also, wenn ich die folgende änderung in meiner Methode widgetSelected :


button2.setEnabled(false)
MessageBox mBox = new MessageBox(Display.getCurrent().getActiveShell(), SWT.ICON_INFORMATION | SWT.OK);
mBox.setText("Information");
mBox.setMessage("Buttons updated!");
mBox.open();

den button wird ausgegraut dargestellt, sobald Sie das widgetSelected () - Methode aufgerufen wird. Das macht mich glauben, dass meine Lösung liegt im Display.getCurrent () - Methoden. Jedoch habe ich versucht,

Display.getCurrent().getActiveShell().redraw() 
Display.getCurrent().getActiveShell().update() 
Display.getCurrent().getActiveShell().layout() 

Methoden und Sie nicht mein problem lösen.

Dank,
Ege

InformationsquelleAutor | 2009-07-24

Schreibe einen Kommentar