2010-12-06 3 views
2

私の環境:サーバーとクライアントを備えたマルチユーザーアプリケーション。サーバーは、現在どのフィールドが使用されているかを知っており、別のユーザーから編集できません。マルチユーザ環境のフォームで同じ値を編集しないようにするにはどうすればよいですか?

私は、JCheckBox、JTextField、JTextArea、JComboBoxのようないくつかのJComponentsを持つフォームを持っています。問題は、ユーザーがフィールドの値を編集できるかどうかを制御したいということです。ユーザーがフィールドの編集を許可されていない場合、コンポーネントは編集モードに移行することはできません。

例: ユーザーAがtextfieldの値を編集しています。 ユーザBが同じ値を編集しようとしました。彼は同じテキストフィールドをクリックします。この時点で、テキストフィールドが編集モードで切り替えられていないことを確認したいと思います。

誰かが、この小切手の正しい場所を知っていますか?すべての単一コンポーネントでチェックを実装する必要がありますか、またはフォーム内のすべてのJComponentsに適合するソリューションがありますか?

ありがとうございました

答えて

1

私はあなたが一般的な解決策を提供できると信じています。リスナーEditabilityListenerを作成します。コンポーネントの値が変更された場合、サーバーに信号を送信し、他のすべてのユーザーが取得する必要があるため、JComponentのインスタンスが無効になります。

問題は同時アクセスです。たとえば、ユーザーAがユーザーBの後にテキストフィールドに入力を開始した後、信号がアプリケーションに到着する前に、何をしたいとしますか?

+0

正確には、同時アクセスを避けるために、フォームコンポーネントがフィールドが現在編集されているかどうかを自分で確認することができます。サーバーはすでにどのフィールドが現在編集されているかを知っているので、コンポーネントはサーバーからの応答を待たなければなりません。私の問題は、コンポーネントが値を編集することができるかどうかをコンポーネントがいつサーバーに尋ねなければならないのか分からないということです。特に、このチェックは編集モードで変更する前に行う必要があります。 – Seffel

+0

問題は、どこに尋ねても問題ではないということです。プロセス間でスレッドを同期させる「通常の」方法はないため、ユーザーがフィールドを編集して、フィールドを編集する権利を持っていないことを常に認識できるようにする必要があります。または、フィールドが現在他のユーザーによって編集されていないかどうかにかかわらず、すべてのフィールドを無効にし、ユーザーがサーバーに対するフィールドチェックをクリックするたびに行うことができます。しかし、それは非常に反応しないアプリケーションになります。 – AlexR

1

サーバーは、クライアントが使用するブール値を返すコンポーネント所有権の要求をサポートできます。サーバー側の実装では、コンポーネント所有権を認識した同期データ構造を維持する必要があります。たとえばConcurrentHashMapを使用することができます(アトミック操作を実行するputIfAbsentをサポートしています)。

クライアントがコンポーネントをリリースしたときに報告する必要があることに注意してください(また、サーバーで所有権タイムアウトを追加することも可能です)。

+0

すでにConcurrentHashMapを使用して編集ロックを管理しています。私はちょうどいつどこで各コンポーネントがサーバーに編集モードで切り替えることが許されているかを知りません。特に、すべてのコンポーネントが異なるからです。 – Seffel

関連する問題