- PR -

画面操作を無効にする方法

投稿者投稿内容
さくら
会議室デビュー日: 2004/05/21
投稿数: 9
投稿日時: 2004-05-21 20:36
OSはWin XP
javaのバージョンはj2sdk-1.4.2を使用しています。

swingを使用しアプリケーションの開発を行っています。

処理を行っている間、マウスカーソルを砂時計に設定しているのですが、
文字の入力やボタン押下などの操作が行えてしまいます。

処理中は、画面での編集などをできないようしたいと考えています。

GlassPaneを表示することにより、マウスイベントを無効にできたのですが、
キー入力を無効にすることができません。

キー入力を無効にする方法がありましたら、ご教授お願します。
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2004-05-21 21:21
極悪な方法として、EventDispatchThreadをとめちゃうとか。

おそらく別Threadで処理を実行していると思われるので、
Thred#joinで処理が終わるまで、止めることができたような。

EventDispatchThreadをブロックして、どうなるかは、まったく想像がつきません。あしからず。
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2004-05-22 10:23
さくらさん、こんにちは。

java.awt.Componentの setEnabled(boolean) を使えば、
ユーザ入力を止めたり、再開したりできると思います。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2004-05-22 12:04
unibon です。こんにちわ。

引用:

Kissingerさんの書き込み (2004-05-22 10:23) より:
java.awt.Componentの setEnabled(boolean) を使えば、
ユーザ入力を止めたり、再開したりできると思います。


うろ覚えですが、AWT や Swing だと
http://java-house.jp/ml/archive/j-h-b/041529.html
のように Component の親子関係を辿って、すべての Component について setEnabled(false) をしなければいけなかったかもしれません。確かめてはいないのですが。

#これはあまりにも大変なので、ひょっとしたら新しいバージョンならばなにか便利な API があるのかもしれません。
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2004-05-24 01:18
引用:

すべての Component について setEnabled(false) をしなければいけなかったかもしれません。確かめてはいないのですが。



すみません、忘れてました。

お詫びの標しに、再帰的に enable/disableするユーティリティ載せておきます。

コード:

public static void setEnabled(Component c, boolean b) {
c.setEnabled(b);
if (c instanceof Container) {
Component[] components = ((Container)c).getComponents();
for (int i = 0; i < components.length; ++i)
setEnabled(components[i], b);
}
}



念の為、Container, Component は java.awtパッケージのクラスです。
また、クラスメソッドにしてありますが、使い方によっては外しても
構いません。

注意:必要なら改良してください。
・フォーカスがある JTextAreaなどのカーソルは点滅を続けます。
・スレッドセーフではありません。

[ メッセージ編集済み 編集者: Kissinger 編集日時 2004-05-24 01:20 ]
さくら
会議室デビュー日: 2004/05/21
投稿数: 9
投稿日時: 2004-05-24 10:09
レスありがとうございます。

Kissingerさんに教えていただいたユーティリティを試してみました。

結果は、全てのコンポーネントに対して、setEnabledの設定がされ使用不可
にすることができました。

今後ともよろしくお願いいたします。ありがとうございました。
Wata
ぬし
会議室デビュー日: 2003/05/17
投稿数: 279
投稿日時: 2004-05-24 10:15
モーダルなJDialogで「お待ちください」表示をして
入力をブロックするのもいいと思いますよ。
さくら
会議室デビュー日: 2004/05/21
投稿数: 9
投稿日時: 2004-05-24 10:33
JDialogをモーダルで表示した場合、
show()以降の処理が、ダイアログが終了するまで
実行されませんでした。

処理中は、モーダルダイアログを表示しておき、
処理終了後、ダイアログを終了する。
というようなことができるのでしょうか?

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