2

私は、特に日付の列を表示するために JTable を使用しているプロジェクトに取り組んでいます。日付のユーザー入力の検証が必要だったので、フォーマット検証用のマスキングと実際の日付検証用の解析の組み合わせを実装しました。日付列のカスタム CellEditor を使用してこれを行いました。

MaskedCellEditor 内に、JFormattedTextField があります。日付のマスキングをセットアップします。次に、実際の検証を可能にするために InputVerifier を追加します。私の InputVerifier は、チェックするために verify() を実装しています: 1. textField.isEditValid() 2. DateValidator.ValidDate(). いずれかが無効な場合、verify は false を返し、InputVerifier はフォーカスをテキスト フィールド (セル エディター) に固定し、ユーザーに日付形式を知らせる小さなメッセージ ダイアログを表示します。

エラー メッセージは、編集中のセルの下にポップアップ表示される、小さな装飾のない、非モーダルでフォーカス不可能な JDialog です。キーを押すか、日付の検証に成功すると消えます。小さなエッジケースを除いて、うまく機能しています。

無効な編集によってダイアログがポップアップしているときに、ユーザーがアプリケーションの上部にあるメニュー ボタンを選択すると、画面が切り替わり、現在画面に表示されているすべてのもの (テーブルを含む) が破棄されます。ただし、ダイアログが表示されていて、キーの押下/編集の成功が発生していないため、ダイアログが非表示になることはありません。別の画面では、まったく関係のないコンテキストで表示されたままになります。ユーザーがテーブルで画面をオフにすると、ユーザーがダイアログを取り除く方法はありません。

ダイアログ自体に Timer および/または MouseListener をスローして、ダイアログ自体を非表示にすることについて議論しましたが、実際の問題を無視していると感じています。ダイアログがまだ表示されるように設定されており、ガベージコレクターがそれを取り除くのを妨げているため、ダイアログが破棄されることはありません。

JTable を保持しているパネルに Cleanup メソッドがありますが、それを取り除くためにダイアログ (InputVerifier のコンポーネント) を参照する良い方法が見つかりません。ダイアログは、テーブルの親パネルからかなり離れています。(パネル -> JTable -> CellEditor -> JFormattedTextField -> InputVerifier -> JDialog)

テーブルが破棄されたときにダイアログを強制的に非表示にする方法についてのアイデアはありますか? 詳細が必要な場合は、お知らせください。皆さんが詳細に行き詰まらないようにしていますが、多くのことが進行中です。

4

2 に答える 2

1

第一に考えたのは、リスナーのアプローチを下らないことです。検証が成功したときに呼び出される closeErrorDialog() タイプのメソッドがある場合は、メニュー アクションが選択されたときにも呼び出すことができます。

別の方法として、メニューからメニューへの移行を何らかの方法で制御し、既存のエラー ダイアログを閉じる「クリーンアップ」メソッドを作成することもできます。これにより、メニューを変更するときに実行する必要がある他のアクションを同じ場所で実行できます。

頭のてっぺんの簡単なアイデアをいくつか。彼らがあなたの意図したとおりであることを願っています

于 2009-01-06T13:15:02.067 に答える
0

多くの人がこれを言って私に反対票を投じますが、ダイアログをモーダルにする必要があるように思えます。これにより、ユーザーは最初にダイアログを閉じずに切り替えることができなくなります。または、少なくとも、このダイアログが表示されている間にユーザーが切り替えることができるメニューを無効にします。

于 2009-01-05T20:33:13.027 に答える