Ich weiß, dass viele Menschen dieses Problem erleben, aber die Lösungen, die ich online gefunden habe, scheinen nicht meine zu lösen. Ich habe eine Zusammensetzung, die drei Knöpfe hat. Was ich will, ist folgendes: Wenn ich auf eine Schaltfläche klicke, möchte ich, dass eine andere Schaltfläche ausgegraut wird (setEnabled (false)) und nach einer Weile (nach einer Methodenausführung) möchte ich, dass die Schaltfläche wieder aktiviert wird.SWT Update/Neuzeichnen/Layout Problem
Viele solche Probleme werden durch Aufrufen der layout() -Methode für den übergeordneten Container gelöst, oder this very similar one wird durch Aufrufen von Display.getCurrent() gelöst. Update();
einfach, könnte meinen Code 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, die Taste nach dem Ende der widgetSelected() -Methode deaktiviert wird erreicht ist. Das Label wird jedoch häufig ohne Probleme aktualisiert (selbst wenn die Methode label.update() nicht vorhanden ist)
Weitere Informationen: Sagen wir, ich deaktiviere die Schaltfläche, dann ein Thread.sleep() und dann aktivieren Sie die Taste ; es schläft zuerst und dann schnell deaktiviert und aktiviert die Schaltfläche. Ich glaube also, dass alle diese Farbanfragen in der Warteschlange stehen und am Ende der Ausführung verarbeitet werden.
Nützliche Informationen: Ich erkannte, dass, wenn ich eine MessageBox direkt nach meiner Anzeige zu erstellen und anzuzeigen, die Anzeige Änderungen auftreten. Also, wenn ich die folgende Änderung in meiner widgetSelected Methode:
button2.setEnabled(false)
MessageBox mBox = new MessageBox(Display.getCurrent().getActiveShell(), SWT.ICON_INFORMATION | SWT.OK);
mBox.setText("Information");
mBox.setMessage("Buttons updated!");
mBox.open();
die Taste, sobald grau dargestellt wird, wie die widgetSelected() -Methode aufgerufen wird. Dies lässt mich glauben, dass meine Lösung in den Display.getCurrent() -Methoden liegt. Ich versuchte jedoch
Display.getCurrent().getActiveShell().redraw() Display.getCurrent().getActiveShell().update() Display.getCurrent().getActiveShell().layout()
Methoden und sie lösten nicht mein Problem.
Danke, Ege
Vielen Dank, es funktioniert. Ich konnte deine Erklärung jedoch immer noch nicht zu 100% erhalten. Ich weiß, dass es nicht möglich ist, SWT-Aktionen in einem anderen Thread als dem SWT-Thread auszuführen. Wenn ich eine SelectionAdapter schreiben, dass ersten deaktiviert alle Tasten dann einen Schlaf führt (in dem gleichen Thread, ohne einen neuen Faden zu schaffen) und ermöglicht dann werden alle Tasten zeigt es indeterministischen Verhalten. Manchmal deaktiviert es die 3. Schaltfläche, schläft und aktiviert sie alle. Manchmal deaktiviert es den 2. Knopf, schläft und aktiviert sie dann alle, usw. Kannst du mir dieses indeterministische Verhalten erklären? Danke nochmal. –