- しんい
- ベテラン
- 会議室デビュー日: 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();
}
の"!"(エクスクラメーション)マークが抜けてませんか?
|