-1

質問:

SWTの表示部分(ウィンドウ/シェルを更新する部分)の簡単な例や説明を教えてください。または、SWT アプリケーションの開発に最適だと思われるサイトを教えてください。

バックグラウンド:

私は SWT アプリケーションに不慣れで、現在いくつかのテストを実行するためのアプリケーションを構築しています。

ユーザーが実行ボタンをクリックした後に更新され続けるテキスト領域を備えたメインディスプレイシェルクラスがあります。

実行ボタンは、StartView クラスの AtomicCounter などの public static オブジェクトを更新する別のスレッド プロセスを開始します。

現在のステージ

プログラムは正常に動作しているように見えますが、テキスト領域がリアルタイムで更新されません。まあ、リアルタイムとは言えませんが、少し遅れた情報が表示されます。

SWT の概念を表示することを十分に理解していないようです。

ゴール

A. B が実行されているかどうかに関係なく C を開始および停止する Main Display クラス

B. A クラスのテキスト領域を A の public static オブジェクトで更新するスレッド プロセス

C. ジョブを実行し、A の public static オブジェクトを更新するスレッド プロセス

サンプルコード (作業コード)

public class UnitTest {

    public static Display display;
    private Shell shell;
    public static AtomicInteger counter = new AtomicInteger(0);
    public static Text text;
    private TestThread test1 = null, test2 = null;

    public UnitTest()
    {
        display = Display.getDefault();
        this.shell = new Shell(display, SWT.CLOSE);
        this.shell.setSize(226, 120);

        text = new Text(shell, SWT.BORDER);
        text.setBounds(10, 10, 199, 19);

        Button btnStart = new Button(shell, SWT.NONE);
        btnStart.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent arg0) {
                test1 = new TestThread();
                test1.start();
                test2 = new TestThread();
                test2.start();
            }
        });
        btnStart.setBounds(10, 54, 94, 28);
        btnStart.setText("Start");

        Button btnStop = new Button(shell, SWT.NONE);
        btnStop.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent arg0) {
                test1.interrupt();
                test2.interrupt();
                counter.set(0);
            }
        });
        btnStop.setBounds(115, 54, 94, 28);
        btnStop.setText("Stop");

        this.shell.open();
        this.shell.layout();

        this.shell.addListener(SWT.Close, new Listener(){
            public void handleEvent(Event event)
            {
                shell.dispose();
            }
        });

        while(!this.shell.isDisposed())
        {
            if(!display.readAndDispatch())
            {
                //text.setText(""+counter.get());
                display.sleep();
            }
        }
    }

    public static void main(String[] args)
    {
        new UnitTest();
    }
}

class TestThread extends Thread
{   
    public void run()
    {
        try
        {
            int i = 0;
            while(i++ < 1000 && !this.isInterrupted() )
            {
                UnitTest.counter.getAndIncrement();
                try {
                    TestThread.sleep(2000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    break;
                }

                if(UnitTest.display.isDisposed())
                    return;

                UnitTest.display.asyncExec(new Runnable() {
                    public void run() {
                      if (UnitTest.text.isDisposed())
                        return;
                      UnitTest.text.setText(""+UnitTest.counter.get());
                    }
                  });

            }
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            System.out.println("Existing thread...");
        }

    }
}
4

1 に答える 1

1

別のスレッドからの UI 更新を慎重に使用する必要があります。これを読んで下さい:

http://goo.gl/At8hC

于 2013-01-12T13:09:19.993 に答える