- PR -

SWTのフォーカス制御について

1
投稿者投稿内容
原田
会議室デビュー日: 2006/02/21
投稿数: 8
投稿日時: 2006-11-24 15:37
お世話になります。

はじめまして。最近SWTをはじめたKといいます。
wikiの方とともに活用させていただいています。
よろしくおねがいします。

現在、掲題の件で問題を抱えています。

テキストボックスからフォーカスが外れたときに、
1.入力値のチェック
2.エラーならメッセージボックスを出す。
3.メッセージボックスが閉じられたら、元のテキストボックスにフォーカスを戻
す。

ということをしたくて、下方のようなコードを書いたのですが、
タブで移動したときは、問題ないのですが、
マウスで、別のテキストボックスをクリックしたときの動作がおかしくなります。

メッセージボックスを閉じると、ウインドウがアクティブになり、
フォーカスもテキストボックスにあるのようなのですが、
マウスのポインタをウインドウ上にもってくると形がIビームになり、
ウインドウの移動や、閉じるボタン[×]を押すなどができなくなります。
タブで移動したときには、ちゃんと矢印になります。

SWTのバグのような気もしますが、そのような情報をご存知の方はその情報ののっているサイトも教えていただけると助かります。


以下ソースです
=========================================================
package mouse;

import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

public class FrameTest {

private Shell sShell = null; // @jve:decl-index=0:visual-constraint="10,10"
private Button button = null;
private Button button1 = null;
private Text text = null;

/**
* @param args
*/
public static void main(String[] args) {
// TODO 自動生成されたメソッド・スタブ
/* Before this is run, be sure to set up the launch configuration (Arguments->VM Arguments)
* for the correct SWT library path in order to run with the SWT dlls.
* The dlls are located in the SWT plugin jar.
* For example, on Windows the Eclipse SWT 3.1 plugin jar is:
* installation_directory\\plugins\\org.eclipse.swt.win32_3.1.0.jar
*/
Display display = Display.getDefault();
FrameTest thisClass = new FrameTest();
thisClass.createSShell();
thisClass.sShell.open();

while (!thisClass.sShell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}

/**
* This method initializes sShell
*/
private void createSShell() {
sShell = new Shell();
sShell.setText("Shell");
sShell.setSize(new org.eclipse.swt.graphics.Point(313,252));
sShell.addMouseListener(new org.eclipse.swt.events.MouseAdapter() {
public void mouseDown(org.eclipse.swt.events.MouseEvent e) {
System.out.println("mouseDown()1"); // TODO Auto-generated Event stub mouseDown()
}
});
button = new Button(sShell, SWT.NONE);
button.setBounds(new org.eclipse.swt.graphics.Rectangle(32,10,169,32));
button.addMouseListener(new org.eclipse.swt.events.MouseListener() {
public void mouseDown(org.eclipse.swt.events.MouseEvent e) {
System.out.println("mouseDown()2"); // TODO Auto-generated Event stub mouseDown()
}
public void mouseDoubleClick(org.eclipse.swt.events.MouseEvent e) {
}
public void mouseUp(org.eclipse.swt.events.MouseEvent e) {
}
});
button1 = new Button(sShell, SWT.NONE);
button1.setBounds(new org.eclipse.swt.graphics.Rectangle(33,60,173,32));
button1.addFocusListener(new org.eclipse.swt.events.FocusListener() {
public void focusGained(org.eclipse.swt.events.FocusEvent e) {
}
public void focusLost(org.eclipse.swt.events.FocusEvent e) {
}
});

text = new Text(sShell, SWT.BORDER);
text.setBounds(new org.eclipse.swt.graphics.Rectangle(23,121,186,32));
text.addFocusListener(new org.eclipse.swt.events.FocusAdapter() {
public void focusLost(org.eclipse.swt.events.FocusEvent e) {
if ("1".equals(text.getText())){
text.setText("");
MessageBox box1 = new MessageBox(sShell,SWT.OK);
box1.setMessage("ダメ");
box1.open();
}
}
});
}

}
原田
会議室デビュー日: 2006/02/21
投稿数: 8
投稿日時: 2006-11-24 15:43
追記
環境をのせていませんでしたので、記述しておきます。
=====
Java 1.4.10
エクリプス 3.1.1
emf-sdo-runtime-2.1.1
GEF-runtime-3.1.1
VE-runtime-1.1.0.1
sumida
会議室デビュー日: 2003/01/20
投稿数: 9
投稿日時: 2006-11-29 23:19
このコードで要件は実現できると思います。
このようなGUIイベント処理のプログラムでは、アプリ側の要求はGUI側の都合の
良くなったときに行ってねという委譲が必要です。
アプリ側ではGUI側(ウィンドマネージャなど)の都合が分かりませんから、GUI
側のイベントキューに溜めてもらって都合の良いときに実行してもらうように
コーディングしてください。後はGUI側が蓄積されたキューを適時処理してくれ
ますので、蓄積されていたイベントが連発で飛んでくるようなことはなくなる
でしょう。
従来のコードでは、テキストのロストフォーカス→ボタンのフォーカスゲインと
移るべきところでメッセージボックスを表示していたので、それが閉じられるまで
イベントが滞留していました。


text = new Text(sShell, SWT.BORDER);
text.setBounds(new org.eclipse.swt.graphics.Rectangle(23, 121, 186, 32));
text.addFocusListener(new org.eclipse.swt.events.FocusAdapter() {
public void focusLost(org.eclipse.swt.events.FocusEvent e) {
// GUIの都合が良くなったときにフォーカスを戻してね
// というおまじない
Display.getDefault().asyncExec(new Runnable() {
public void run() {
if ("1".equals(text.getText())) {
// このエラー値クリアはなくても大丈夫。
// 業務要件上は間違った値が残っていたほうが良いと思います。
//text.setText("");
MessageBox box1 = new MessageBox(sShell, SWT.OK);
box1.setMessage("ダメ");
box1.open();
// メッセージボックスクローズ後にテキストにフォーカスを戻す
text.setFocus();
}
}
});
}
});
1

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