- PR -

SWTで画面(特定のコントロール)の更新を行いたい

1
投稿者投稿内容
しんい
ベテラン
会議室デビュー日: 2005/09/01
投稿数: 55
投稿日時: 2005-09-30 16:55
二つ続けての書き込みですみません。

SWTでアプリケーションを作成しております。
データをUpdateやInsertした場合、即時で画面を更新したいのです。
(DBと接続して、情報を更新していくような仕様になっております。)

一旦、そのコントロールをdisposeし、再度作成する方法しか、方法を存じておりません。
何か手軽な方法は無いものでしょうか。
よろしくお願い致します。
ちいにぃ
大ベテラン
会議室デビュー日: 2002/05/28
投稿数: 244
投稿日時: 2005-10-01 03:15
Controlを継承したクラスであれば、redraw()で再描画できるはずです。

もっとも、大抵のControlは値を追加・変更した時点で再描画されると思うのですが。

* URLを修正

[ メッセージ編集済み 編集者: ちいにぃ 編集日時 2005-10-01 11:34 ]
しんい
ベテラン
会議室デビュー日: 2005/09/01
投稿数: 55
投稿日時: 2005-10-04 06:08
ちいにぃさん、ありがとうございます。

>Controlを継承したクラスであれば、redraw()で再描画できるはずです。
>もっとも、大抵のControlは値を追加・変更した時点で再描画されると思うのですが。
との事ですが、方法が間違っているのか、更新されないのです・・・。
Control.redraw()を行っているのですが、何か足りないでしょうか。

よろしくお願いします。
ちいにぃ
大ベテラン
会議室デビュー日: 2002/05/28
投稿数: 244
投稿日時: 2005-10-04 08:28
状況がよくわからないのですが、
(どういうときに、どのControlで、どのプラットフォームで起こっているのか)

例えば、次の場合、画面は更新されません。
* Labelを更新(#setText()) していて、
* #setText()の直後や#redraw()の直後にEclipseでブレークポイントで
 させている

この場合、メッセージループ
while (!shell.isDisposed ()) { if (!display.readAndDispatch ()) display.sleep (); }
を回すまでは表示は更新されないと思います。
しんい
ベテラン
会議室デビュー日: 2005/09/01
投稿数: 55
投稿日時: 2005-10-04 11:42
ちいにぃさん、ありがとうございます。

すみません、あまり原理を理解していないのだと思います。
簡単に構造を申し上げます。

@Shellをopenします。
AShell上にCompositeを生成します
BCompositeにDBから得たデータをLabelやTextにsettextします。
C@のShellをopenする際に、同時にShellBをopenします。
DShellBから、Buttonを押して、イベントを発生させ、DBにデータをinsertします。そのinsertがcommitされると同時に、Compositeを更新して、最新のデータを反映させたいのです。

このDの方法が良く分からないのです。
Button.addSelectionListenerの中に、Composite.redraw()を入れても上手くいかないのです。
また、10分経つと、画面が更新されるようにもしたいのですが、今はComposite.dispose()をして、再度Compositeを作っております。

すみません、ブレークポイントの意味がイマイチ分かっていないのですが、いかがなものでしょうか。
ご教授頂けると、幸いです。
よろしくお願い致します。
ちいにぃ
大ベテラン
会議室デビュー日: 2002/05/28
投稿数: 244
投稿日時: 2005-10-06 00:56
いまいち状況がつかめませんが、こんな感じの処理でしょうか?

ShellAを実行するとShellBも同時に開いて、
ShellBのText 2つに文字を入れてEnterを押すと、
ShellAのLabelとTextに反映されます。

------------------------------ ShellA.java
コード:
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

public class ShellA {
    private Shell shell;
    private Label text1Label;
    private Text text2Text;

    public static void main(String[] args) {
        try {
            ShellA window = new ShellA();
            window.open();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void setText(String text1, String text2) {
        text1Label.setText(text1);
        text2Text.setText(text2);
    }
    
    public void open() {
        final Display display = Display.getDefault();
        createContents();
        shell.open();
        shell.layout();
        shell.pack();

        ShellB shellB = new ShellB(this);
        shellB.open();

        while (!shell.isDisposed()) {
            if (!display.readAndDispatch())
                display.sleep();
        }
    }

    private void createContents() {
        shell = new Shell();
        shell.setLayout(new FillLayout());
        shell.setSize(337, 80);
        shell.setText("Shell A");

        final Composite composite = new Composite(shell, SWT.NONE);
        final GridLayout gridLayout = new GridLayout();
        gridLayout.numColumns = 2;
        composite.setLayout(gridLayout);

        text1Label = new Label(composite, SWT.NONE);
        text1Label.setLayoutData(new GridData(150, SWT.DEFAULT));

        text2Text = new Text(composite, SWT.BORDER);
        text2Text.setLayoutData(new GridData(100, SWT.DEFAULT));
    }
}


------------------------------ ShellB.java
コード:
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

public class ShellB {
    private Shell shell;
    private Text text2;
    private Text text1;
    private ShellA otherShell;
    
    public ShellB(ShellA otherShell) {
        this.otherShell = otherShell;
    }
    
    public void open() {
        final Display display = Display.getDefault();
        createContents();
        shell.open();
        shell.layout();
        shell.pack();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch())
                display.sleep();
        }
    }

    private void createContents() {
        shell = new Shell();
        final GridLayout gridLayout = new GridLayout();
        gridLayout.numColumns = 3;
        shell.setLayout(gridLayout);
        shell.setSize(399, 78);
        shell.setText("Shell B");

        text1 = new Text(shell, SWT.BORDER);
        text1.setLayoutData(new GridData(150, SWT.DEFAULT));

        text2 = new Text(shell, SWT.BORDER);
        text2.setLayoutData(new GridData(150, SWT.DEFAULT));

        final Button enterButton = new Button(shell, SWT.NONE);
        enterButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                otherShell.setText(text1.getText(), text2.getText());
            }
        });
        enterButton.setText("&Enter");
    }
}


------------------------------------------
ちいにぃ
大ベテラン
会議室デビュー日: 2002/05/28
投稿数: 244
投稿日時: 2005-10-06 01:01
補足。

引用:
すみません、ブレークポイントの意味がイマイチ分かっていないのですが、いかがなものでしょうか。


これは、私の記入ミスです。以下の分の太字の部分が抜けてました。
* #setText()の直後や#redraw()の直後にEclipseでブレークポイントで停止
 させている

つまり、Control#setTextやControl#redraw()の直後にEclipseのブレークポイントで停止させて、
「画面が更新されない、おかしいな?」と思っておられるのかもしれない、と推測したわけです。
通りすがり
会議室デビュー日: 2009/03/23
投稿数: 1
投稿日時: 2009-03-23 18:05
エラい亀レスですがひょっとして
if (!display.readAndDispatch()) {
display.sleep();
}
の"!"(エクスクラメーション)マークが抜けてませんか?
1

スキルアップ/キャリアアップ(JOB@IT)