質問

私は、特に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)

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

役に立ちましたか?

解決

最初に考えたように、リスナーのアプローチを下ることはできません。 valdiationの成功時に呼び出されるcloseErrorDialog()タイプのメソッドがある場合、メニューアクションが選択されたときに呼び出すこともできます。

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

頭のてっぺんの簡単なアイデア。彼らがあなたが意図したものの線に沿っていることを願っています

他のヒント

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top