- PR -

メニューの挙動について

1
投稿者投稿内容
蝉丸
会議室デビュー日: 2003/10/29
投稿数: 3
投稿日時: 2004-02-03 23:14
初めて投稿させて頂きます。
現在、仕事で作成しているJavaアプリケーションの障害調査をしています。
AWTをベースにしたウィンドウアプリケーションなのですが、以下のような不具合が確認されています。

1.MenuItemをクリックしても反応がない。Menu(ファイルメニューとか)をクリックするとメニューが展開しますが、その中のMenuItemをクリックしても展開したメニューが消えることがありません(セパレータをクリックしたときのように)。イベントが発生することもありません。通常、リスナの登録・未登録にかかわらず、MenuItemをクリックするとメニューは消えるはずです。
2.1の状況が発生したとき、そのMenu中にあるセパレータをダブルクリックすると、イベントが発生し、展開したメニューが閉じる。イベントの発生元は1で反応しなかったMenuItemになっている。本来1のMenuItemでイベントが発生した際に実行する処理が実行される。

以上の様な状況が時々発生するのです。
明確な発生条件も分からず(常に2回に1回正常に動作する模様)、他に作成したサンプルで再現することも出来ませんでした。
どうもセパレータを追加していくと反応しないMenuItemがずれていくようです(どのようにずれていくのかも今一良く分かりません)
画面そのものは他の人が作ったものなのですが、Menu関連は自分が作成したものです(AWTのMenuBarおよびMenuItemを継承。Menuはそのまま使っています)
複雑なことも特別なこともやっていない単純なメニューなんですが・・・。
使用しているフレームワーク(ちなみにフレームワークにメニュー関連が無かったのでその部分を作ったのです)のソースをひっくり返してもセパレータがダブルクリックで反応する(しかもイベント発生元が別のMenuItem)様なことをしているようには思えなかったのです。
このような症状は何故発生するのでしょうか?
原因、対処法、再現方法など、何かしらヒントになることなどを知っている方がおられるならご教授願えませんでしょうか?
よろしくお願いします。
おばけ
ぬし
会議室デビュー日: 2002/11/14
投稿数: 609
お住まい・勤務地: 東京都江東区
投稿日時: 2004-02-04 01:37
えーと、AWTはご存知のようにプラットフォームネイティブのAPIにマッピングするわけで、
稼働環境を教えていただかないと、皆さんもコメントしようが無い気がします。
OSとJDKのバージョンくらいは教えていただけますか?
蝉丸
会議室デビュー日: 2003/10/29
投稿数: 3
投稿日時: 2004-02-04 08:41
失礼しました。
OSはWindows2000、JDKは1.3.1_03です。
ただしJDKは1.4.2_03に変更しても同様の現象が発生します。

[ メッセージ編集済み 編集者: 蝉丸 編集日時 2004-02-04 08:48 ]
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2004-02-04 09:57
unibon です。こんにちわ。

引用:

蝉丸さんの書き込み (2004-02-03 23:14) より:
明確な発生条件も分からず(常に2回に1回正常に動作する模様)、他に作成したサンプルで再現することも出来ませんでした。
どうもセパレータを追加していくと反応しないMenuItemがずれていくようです(どのようにずれていくのかも今一良く分かりません)
画面そのものは他の人が作ったものなのですが、Menu関連は自分が作成したものです(AWTのMenuBarおよびMenuItemを継承。Menuはそのまま使っています)
複雑なことも特別なこともやっていない単純なメニューなんですが・・・。


あまり良くは分かりませんが、一般的なことを書きます。
メニューが展開したまま閉じなくなるのは、RuntimeException が発生していることが多いです。どこかで例外を握りつぶしているということはないでしょうか。
また、バグの発生が2回に1回など定期的に現れるのは、イベントハンドラの取り扱いを誤っていることが多いです。すなわち、どこかでトグル(toggle)動作になるようになってしまっている可能性があります。
MenuBar クラスや MenuItem クラスを extends されているようですが、普段はあまり継承することはないクラスなので、やはりこのあたりの作りがまずいのではないでしょうか。
もしも Microsoft の Java でも簡単に動かすことができるようなコード(JDK 1.1 までの機能のみを使用したコード)ならば Microsoft Java の上での動きを試されてはどうでしょうか。
蝉丸
会議室デビュー日: 2003/10/29
投稿数: 3
投稿日時: 2004-02-04 23:16
お返事ありがとうございます。
最初に書いたとおりMenuBar,MenuItemの拡張は大したことはしていません。
機能コード(int型変数)によって各部品を識別するという方針がありまして、MenuItemはフィールドとして機能コードを持ち、あとはそのセッタとゲッタが存在するだけです。
コンストラクタはMenuItemのコンストラクタをそのまま呼び出しているだけです。
MenuBarはMenuItemとその機能コードを結びつけるハッシュを変数として持ち、メニューの生成メソッドを追加しています。
メニューの生成メソッドは拡張したMenuItemのインスタンスを生成し、指定されたメニューにaddし、引数として渡された機能コードをキーとしてハッシュに格納しています。
他にも全画面(とりあえず130超)でコピー、切り取り、貼り付け機能を他チームからの指示通りに実装しなくてはならないので、その機能を自動的に実装するようにしていますが、これを無効化(コメントアウト)しても同様の障害は起きます。
クリップボード関係以外で拡張したメニュー関連で使っている機能はMenuBar、MenuItemに実装されている機能のみです。
この作りで誤作動を起こすはずは無いと思いますが。(複数の人間にチェックして貰いましたが同じ意見です)
拡張したMenuBar、MenuItemに限れば例外を握りつぶしていることもないはずです。この作りで握りつぶせるはずが無いので。

MenuItemが反応しない、ということに注目されているようですが、そのときにセパレータをダブルクリックすると、反応しないMenuItemを発生元としたイベントが発生するのです。
セパレータはただのMenuItemなのでリスナの登録をすることも出来るのですが、クリックしようがダブルクリックしようが、展開されたメニューが閉じることもイベントが発生することも(当然、別のMenuItemを発生元としたイベントが発生することも)ありません。setEnable(false)にしても同じです。(確認済み)
もしかしたら出来るけれど、自分が知らないだけかも・・・と思い、投稿した次第です。
原因がどこにあるのか(大元のフレームワークか、そのフレームワークの拡張版か、提供されたボタンなどの部品か、JDKなのか)調べて、再現できるものならば再現して、それぞれの担当者に投げなくてはならないので、再現できた、理由が分かるなどといったスバラシイ方は是非ご教授ください。
この障害は現在、奇天烈なバグとして知られ、周囲で笑いを誘っています・・・(誰にも見当が付かないので)

[ メッセージ編集済み 編集者: 蝉丸 編集日時 2004-02-04 23:28 ]
1

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