0

次の機能を持つアプリケーションに取り組んでいます。

  • アプリケーションには、画像と設定のモーダル ダイアログを開くための [画像の読み込み] ボタンがあります。処理の結果が返されるか、ユーザーが気が変わった場合は null で、そのダイアログが戻るまでブロックする必要があります。
  • 画像と設定ダイアログにより、ユーザーはJFileChooserダイアログを使用して画像を選択し、画像を処理する詳細レベルを指定できます。「読み込み」ボタンをクリックすると、読み込みダイアログが開きます。
  • 読み込みダイアログは、時間のかかる画像処理について詳細に報告するカスタム設計のダイアログである必要があります。ユーザーが処理の終了を許可した場合は、オブジェクトを閉じて元のダイアログに戻す必要があります。元のダイアログは、そのオブジェクトを閉じてアプリケーションに戻す必要があります。ユーザーが処理の実行に時間がかかりすぎると判断した場合は、読み込みをキャンセルして読み込みダイアログを閉じ、画像と設定ダイアログに戻ることができます。

概念的には、これは私にはそれほど難しくないように思えます。ただし、これを Swing 内で機能させる方法を決定しようとすると、どういうわけかまとめることができません。私が読んだことによると、GUI コンポーネントの多くはスレッドセーフではないため、Swing のイベント スレッドでインスタンス化する必要があります。これらの同じコンポーネントは、メソッドと同様の呼び出しでブロックする必要があります (ただし、カスタム コンポーネントを作成する必要があるため、同じではありません) JOptionPane.showInputDialog()。ただし、これらの呼び出しでは、イベント スレッドで新しいコンポーネントをインスタンス化し、アプリケーションに値を返す前にイベント スレッドでイベントが発生するのを待つ必要があります。これに、ダイアログからポップアップするダイアログが必要であるという事実と相まって、かなり迷っています。

ダイアログに関する Java チュートリアルと、StackOverflow および他のサイトに関するいくつかの投稿を読み、正しく機能するクラスを設計する方法を判断しようとしました。どういうわけか、これがどのように機能するのか(最初のブロッキング呼び出しの後にイベントスレッドがスリープ状態になるのではないですか?)、およびこれを機能させるために必要なカスタムクラスをどのように記述できるかがわかりません。率直に言って、自分の混乱を説明できるほど十分に理解しているかどうか確信が持てません。

モーダル ダイアログがインスタンス化されたときに内部で何が行われているのか、誰か説明してもらえますか? 上記のように必要な方法で動作するダイアログ クラスを作成するにはどうすればよいですか?

4

2 に答える 2

2

アプリケーションには、画像と設定のモーダル ダイアログを開くための [画像の読み込み] ボタンがあります。処理の結果が返されるか、ユーザーが気が変わった場合は null で、そのダイアログが戻るまでブロックする必要があります。

OK、このダイアログはモーダルにする必要があります。私たちが知っているのはそれだけです。

画像と設定ダイアログにより、ユーザーは JFileChooser ダイアログを使用して画像を選択し、画像を処理する詳細レベルを指定できます。「読み込み」ボタンをクリックすると、読み込みダイアログが開きます。

OK、読み込みダイアログは画像と設定ダイアログからモーダルにする必要があります。そこにも大したことはありません。

読み込みダイアログは、時間のかかる画像処理について詳細に報告するカスタム設計のダイアログである必要があります。ユーザーが処理の終了を許可した場合は、オブジェクトを閉じて元のダイアログに戻す必要があります。元のダイアログは、そのオブジェクトを閉じてアプリケーションに戻す必要があります。ユーザーが処理の実行に時間がかかりすぎると判断した場合は、読み込みをキャンセルして読み込みダイアログを閉じ、画像と設定ダイアログに戻ることができます。

読み込みダイアログのコードは、バックグラウンド スレッドで時間のかかる画像処理を行うために SwingWorker をインスタンス化して実行する必要があります。次に、SwingWorker に発行/処理メソッドのペアを使用させて、処理の詳細に関する情報を読み込みダイアログ。

...私が読んだところによると、GUI コンポーネントの多くはスレッドセーフではないため、Swing のイベント スレッドでインスタンス化する必要があります。

正しい。

これらの同じコンポーネントは、 JOptionPane.showInputDialog() メソッドと同様の呼び出しでブロックする必要があります (ただし、カスタム コンポーネントを作成する必要があるため、同じではありません)。

そして、これがモーダル JDialog でできることです。留意すべきもう 1 つのオプションは、JOptionPane を使用し、JOptionPane に表示させたい GUI を含む JPanel を渡すことです。JOptionPanes は驚くほど柔軟で便利です。

ただし、これらの呼び出しでは、イベント スレッドで新しいコンポーネントをインスタンス化し、アプリケーションに値を返す前にイベント スレッドでイベントが発生するのを待つ必要があります。これに、ダイアログからポップアップするダイアログが必要であるという事実と相まって、かなり迷っています。

繰り返しますが、それは簡単です。読み込みダイアログは、読み込みダイアログに返信する SwingWorker を呼び出します。

モーダル ダイアログがインスタンス化されたときに内部で何が起こっているのか説明してもらえますか?

このサイトのボランティアにお願いすることは多すぎるかもしれません。この質問に答えるには、おそらく誰かが完全なチュートリアルを作成する必要があり、以前にも質問されて回答されているため、情報はあなたが見つけられるはずです。 . 内部で何が起こっているかを本当に知りたい場合は、まず自分でその主題について予備調査を行い、ソース コードを見て、それでも問題が解決しない場合は、最初に自分で調べた後で、より具体的で回答可能な質問をする必要があります。デューデリジェンス作業。

于 2014-10-16T22:12:58.237 に答える