画像を表示し、データベースから音声を再生するアプリケーションを開発しています。GUIからデータベースに画像を追加するために別のJFrameを使用するかどうかを決定しようとしています。
複数のJFrameウィンドウを使用するのが良い方法かどうか疑問に思っていますか?
画像を表示し、データベースから音声を再生するアプリケーションを開発しています。GUIからデータベースに画像を追加するために別のJFrameを使用するかどうかを決定しようとしています。
複数のJFrameウィンドウを使用するのが良い方法かどうか疑問に思っていますか?
回答:
複数のJFrameを使用するのが良い方法かどうか疑問に思っていますか?
悪い(悪い、悪い)習慣。
1つのGUIで多くの要素を表示する方法はいくつもあります。
CardLayout
(短いデモ。)。良い:
JInternalFrame
/JDesktopPane
通常はMDIに使用されます。JTabbedPane
コンポーネントのグループ用。JSplitPane
ユーザーが何をしているかによって、どちらか一方の重要度(サイズ)が異なる2つのコンポーネントを表示する方法。JLayeredPane
はるかに多くの層状コンポーネント。JToolBar
通常、アクションまたはコントロールのグループが含まれています。ユーザーのニーズに応じて、GUIの周りにドラッグしたり、GUIから完全に外したりできます。上記のように、それを行う親に従って最小化/復元します。JList
(以下の簡単な例)の項目として。JTree
。ただし、これらの戦略が特定のユースケースで機能しない場合は、以下を試してください。単一のメインを確立しJFrame
、その後、持っているJDialog
かJOptionPane
のインスタンスは、ダイアログの親としてフレームを使用して、自由に浮動要素の残りのために表示されます。
複数の要素が画像であるこの場合は、代わりに次のいずれかを使用することをお勧めします。
JLabel
ユーザーがその時点で興味のある画像を表示する単一(スクロールペインの中央)。に見られるようにImageViewer
。JList
。この答えに見られるように。それらの「単一行」部分は、それらがすべて同じ次元である場合にのみ機能します。あるいは、その場で画像を拡大縮小する準備ができており、それらがすべて同じアスペクト比(例、4:3または16:9)である場合。JFrame
以前に複数のが必要な状況に遭遇したことはなく、それらの問題を考慮したこともありませんでした。
複数のJFrame
アプローチは、Swingアプリのプログラミングを始めてから実装してきたものです。ほとんどの場合、私はこれ以上何も知らなかったので、最初にそれを行いました。しかし、私は開発者としての経験と知識を成熟させ、より多くの経験豊富なJava開発者の意見をオンラインで読み、吸収し始めたので、複数のアプローチ(現在のプロジェクトと将来のプロジェクトの両方)から離れようとしJFrame
ました。 )のみに会う...これを得る... 私のクライアントからの抵抗!「子」ウィンドウを制御するためのモーダルダイアログの実装を開始しJInternalFrame
、個別のコンポーネントのsを開始すると、クライアントから不満が出始めました。ベストプラクティスだと思っていたことをやっているので、私はかなり驚いていました。しかし、彼らが言うように、「幸せな妻は幸せな人生です」。クライアントにも同じことが言えます。もちろん、私は請負業者なので、エンドユーザーは開発者である私に直接アクセスできますが、これは明らかに一般的なシナリオではありません。
そこで、複数のJFrame
アプローチの利点と、他の人が提示したいくつかの短所を神話で説明するつもりです。
JFrame
のを許可することにより、エンドユーザーは自分の画面上にあるものを広げて制御できるようになります。このコンセプトは、「オープン」であり、制限を感じさせません。1つの大きなsのJFrame
束に向かうと、これを失いますJInternalFrame
。JFrame
sでした。しかし、私はデータ入力画面をJDialog
親がデータビューアであるようにしたいと考えました。私は変更を加え、すぐに、プログラムの別の部分(またはWebサイト、私は参照しません)を参照している間、ビューアを最小化または閉じ、エディターを開いたままにすることができるという事実に大きく依存するエンドユーザーから電話を受けました覚えていない)。彼はマルチモニターを使用していないので、最初に何か他のことをするための入力ダイアログが必要でした次に、データビューアを完全に非表示にします。これはで不可能でした。JDialog
確かにでも不可能JInternalFrame
でした。私JFrames
は彼の正気のために不本意ながらそれを別のものに戻しましたが、それは私に重要な教訓を教えてくれました。JInternalFrame
よりもを作成する方が簡単な理由はわかりませんJFrame
。実際、私の経験では、JInternalFrames
柔軟性がはるかに低くなっています。JFrame
アプリでの開閉を処理する体系的な方法を開発しました。フレームのコード自体からフレームをほぼ完全に制御します。新しいフレームの作成、SwingWorker
バックグラウンドスレッドでのデータの取得とEDTでのGUIコードを制御するs、ユーザーがフレームを2回開こうとした場合にフレームを復元/前面に移動するなど。私JFrame
のs を開くために必要なのはpublic staticメソッドopen()
とopenメソッドを呼び出し、windowClosing()
イベントは残りを処理します(フレームはすでに開いていますか?開いていませんが、ロードしていますか?など)このアプローチをテンプレートにしたので、各フレームに実装するのは難しくありません。JFrame
比べてより多くのスペースが必要であると言えますが、JInternalFrame
100 JFrame
秒開いたとしても、実際にどれだけ多くのリソースを消費するのでしょうか。リソースが原因でメモリリークが懸念される場合:呼び出しdispose()
により、フレームでガベージコレクションに使用されたすべてのリソースが解放されます(ここでも、a JInternalFrame
はまったく同じ問題を呼び出す必要があります)。たくさん書いて、もっと書ける気がします。とにかく、私はそれが不人気な意見だからといって、反対票を投じないことを望みます。質問は明らかに貴重なものであり、たとえそれが一般的な意見ではない場合でも、私が貴重な回答を提供できれば幸いです。
複数のフレーム/フレームごとの単一のドキュメント(SDI)と、1つのフレームごとの単一のドキュメント/複数のドキュメント(MDI)の良い例は、Microsoft Excelです。MDIの利点のいくつか:
SDI(単一ドキュメントインターフェイス、つまり、すべてのウィンドウは単一のドキュメントのみを持つことができます):
MDI(マルチドキュメントインターフェイス、つまり、すべてのウィンドウに複数のドキュメントを含めることができます):
JFrame
の大親に持つことを望んでいますJTabbedPane
。しかし、レイアウトが異なる2番目(またはそれ以上)のウィンドウを開く可能性があるため、SDI愛好家とMDIの両方が幸せなハイブリッド動作が提供されます。すべての場合において、私は常にJInternalFrame
両方の世界のすべての不便さを与える恐ろしいパターンとして考えました。彼らが提供する柔軟性はほんのわずかであり、実際の目的ではなく、多くの貴重な画面スペースを食い尽くしてしまいます。
JFrame
に独自のタスクバーアイコンが表示されます。これがあなたの望むものである場合もあれば、そうでない場合もあります。WinAPIではこれを構成するのは簡単ですが、Swingでは実行できないようです。
JDialog
オーバーJFrame
。
私が関わったばかりの例で、「ユーザーフレンドリーではない」という議論に対抗したいと思います。
このアプリケーションには、ユーザーがさまざまな「プログラム」を個別のタブとして実行するメインウィンドウがあります。できる限り、アプリケーションをこの単一のウィンドウに保つようにしました。
彼らが実行する「プログラム」の1つは、システムによって生成されたレポートのリストを表示し、ユーザーは各行のアイコンをクリックして、レポートビューアーダイアログを開くことができます。このビューアは、レポートの縦/横のA4ページに相当するものを表示しているため、ユーザーはこのウィンドウを非常に大きくし、画面いっぱいに表示することを好みます。
数か月前に、これらのレポートビューアウィンドウをモードレスにして、複数のレポートを同時に開くようにしてほしいというリクエストを顧客から受け始めました。
これが良い解決策だとは思わなかったので、しばらくの間、私はこの要求に抵抗しました。しかし、ユーザーが私たちのシステムのこの「欠陥」をどのように回避しているかを知ったとき、私の心は変わりました。
彼らはビューアを開き、「名前を付けて保存」機能を使用してレポートをPDFとして特定のディレクトリに保存し、Acrobat Readerを使用してPDFファイルを開き、次のレポートでも同じことを行いました。彼らは、見たいさまざまなレポート出力で複数のAcrobat Readerを実行していました。
それで私は、ビューティーを傾けてモードレスにしました。つまり、各ビューアにはタスクバーアイコンがあります。
先週彼らに最新バージョンがリリースされたとき、彼らからの圧倒的な反応は彼らがそれを愛するということです。これは、システムに対する最近の最も人気のある機能強化の1つです。
だからあなたは先に進んで、彼らが欲しいものが悪いとユーザーに伝えますが、最終的にそれはあなたに何の好意もありません。
注意事項:
ModalityType
ブールmodal
引数ではなく、新しい引数を使用するコンストラクタを使用します。これにより、これらのダイアログにタスクバーアイコンが表示されます。jInternalFrameをメインフレームにして非表示にします。その後、それを以降のイベントに使用できます。
jInternalFrame.setSize(300,150);
jInternalFrame.setVisible(true);
前回スイングに触れたのは久しぶりですが、一般的にこれを行うのは悪い習慣です。頭に浮かぶ主な欠点のいくつか:
それはより高価です: JFrameを描画するために、DialogやJInternalFrameなどの他の種類のウィンドウコンテナーよりも多くのリソースを割り当てる必要があります。
ユーザーフレンドリーではありません:くっついたJFrameの束に移動するのは簡単ではありません。アプリケーションが一貫性のない一連のアプリケーションであり、デザインが不十分であるように見えます。
JInternalFrameは簡単に使用できますこれは一種の反省事項ですが、デスクトップとJInternalFrameパターンを使用して考えたよりもはるかに簡単で、他の人が(またはより多くの時間をかけて)賢くなっているので、使用することをお勧めします。
JInternalFrame
のを使用しても、ユーザーに同じ効果がありますか?個人的にはの使用に反対JInternalFrame
です!CardLayout
本当の祝福です!
JInternalFrame
あなたが言及した3つのケースのいずれにおいても利点はありません(1.どこJInternalFrame
よりも軽い証拠はどこにありJFrame
ますか?2。JInternalFrame
sは、JFrame
sの束と同じように雑然としている、乱雑、くっついている可能性が . JInternalFrame
簡単な方法は?同じコードですが、1つはaに含まれ、JDesktopPane
もう1つはナチュラルスクリーン領域に含まれます。これらは私にとっても同じように複雑に聞こえます。)
JComponent
sであり、どちらもほぼ同じ構造を持っていますが、JDesktop
1つはa でレンダリングされ、1つはレンダリングされません。繰り返しますが、申し訳ありませんが、の「重量」について推測していると思いますJFrame
。2.私のアプリケーションはSDIを使用しており、クライアントは非常に満足しています。しかし、あなたは「大量の窓」と言っていましたが、もちろんそれは吸います。しかし、私のポイントはこれです。「1トン」JInternalFrame
のsは同じくらいひどいものです。JIFを使用すると、だらしのないUIデザイナーになることができるとしたら、それは恐ろしいことです。乱雑な混乱とは、JFであれJIFであれ、乱雑な混乱です。
悪い練習は間違いなく。1つの理由は、すべてにJFrame
新しいタスクバーアイコンが表示されるため、「ユーザーフレンドリー」ではないためです。複数JFrame
のを制御すると、髪を引き裂くことができます。
個人的には、ONE JFrame
をあなたの種類のアプリケーションに使用します。複数のものを表示する方法はあなた次第です、たくさんあります。Canvas
ES、 、JInternalFrame
、CardLayout
でもJPanel
多分ね。
複数のJFrameオブジェクト=痛み、トラブル、問題。
複数Jframe
のを使用することは良い考えではないと思います。
代わりにJPanel
、1つ以上JPanel
のを同じで使用できますJFrame
。
また、このを切り替えることもできJPanel
ます。だから、私たちは、JFrame
。
それぞれJPanel
に異なるものを設計でき、これらすべてをJPanel
一度にJFrame
1つずつ表示できます。
これを切り替えるには、for each または 'JButton JPanel`をJPanel
使用JMenuBar
します。JMenuItems
JPanel
for each
2つJFrame
以上にすることはお勧めできませんが、1つ以上にする場合は問題ありませんJFrame
。
ただし、JFrame
複数JFrame
のを使用するよりも、ニーズに合わせて1つを変更する方が適切です。
フレームが同じサイズになる場合は、フレームを作成して、フレームを参照として渡してみてください。
フレームを通過したら、フレームの配置方法を決定できます。これは、一連の数値の平均を計算する方法を持つようなものです。メソッドを何度も作成しますか?
これは良い方法ではありませんが、使用したい場合でもシングルトンパターンを使用できます。私は自分のプロジェクトのほとんどでシングルトンパターンを使用しています。