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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ok, ich habe korrigiert die Antwort von ginu:
New Runnable().run() ist eigentlich nicht viel bis nichts, aber die Idee ist richtig:
Müssen Sie einen neuen thread, deine Arbeit zu machen. Problem ist, aus diesem thread kann man das auch nicht nennen setEnabled auf die Tasten, denn das kann nur von innerhalb des SWT-Event-thread.
Also brauchst du einen anderen Thread zum zurücksetzen die Tasten. Den zweiten Thread übergeben wird Angezeigt.callAsync und zurück, bevor er tatsächlich ausgeführt wird, aber das spielt keine Rolle hier. Sie können auch die Anzeige.callSync( Ausführbar ), ist dieser Aufruf würde blockieren den aufrufenden thread bis das runnable gibt.
Getestet, es in Eclipse sieht gut aus so weit.
Edit: Btw, ist der Grund, warum aufrufenden layout() oder Display.update() nicht funktioniert ist, dass Sie derzeit die Blockierung der SWT-Thread mit Ihrer Arbeit, so dass die Aufrufe von layout/update in die Warteschlange eingereiht und erst ausgeführt, wenn Sie den Ereignis-handler. Blockieren Sie niemals einen event-handler zu tun, lange zu arbeiten. 🙂
}
InformationsquelleAutor derBiggi
Es scheint nicht, dass das snippet ist fertig, aber ein paar Dinge in den Sinn kam, in Bezug auf Ihr problem. Sie können wahrscheinlich verwenden setEnabled wie in dem snippet unten. Für anspruchsvollere Dinge kann man sich bei GridLayout und GridData .exclude-Eigenschaft in Verbindung mit setVisible-Methode. Für die Referenz der SWT-Snippets Seite ist wirklich toll.
InformationsquelleAutor
Ich bin nicht wirklich sicher, wenn Sie haben ein problem mit dem aktivieren /deaktivieren der buttons, oder setzen Sie die Verzögerung zwischen der Ausführung flow.
Habe ich geändert Jared code oben ausführen beide Operationen erwähnt. Bitte haben Sie einen Blick auf diese und lassen Sie mich wissen, wenn das, was Sie suchen.
Cheers. 🙂
InformationsquelleAutor