私は、画像を表示し、データベースから音を出すアプリケーションを開発しています。 GUIからデータベースに画像を追加するために別のJFrameを使用するかどうかを決定しようとしています。
私はそれが複数のJFrameウィンドウを使うのが良い習慣であるかどうか疑問に思いますか?
私はそれが複数のJFrameを使うのが良い習慣であるかどうか疑問に思いますか?
悪い(悪い、悪い)練習。
1つのGUIに多数の要素を表示する方法はいくつもあります。
CardLayout
(短い デモ。 )。良い:JInternalFrame
/JDesktopPane
は通常 MDI に使われます。JTabbedPane
はコンポーネントのグループを表します。JSplitPane
2つの構成要素を表示する方法で、どちらを使用するかによって重要度(サイズ)が異なります。JLayeredPane
はるかに多くの階層化されたコンポーネント。JToolBar
は通常、アクションまたはコントロールのグループを含みます。 GUIの周りをドラッグすることも、ユーザーのニーズに応じて完全にオフにすることもできます。上で述べたように、そうすることで、親に従って最小化/元に戻すでしょう。JList
内の項目として(下記の単純な例)。JTree
のノードとして。しかし、これらの戦略が特定のユースケースでうまくいかない場合は、以下を試してください。単一のメインJFrame
を設定し、次にフレームを親として使用して、残りの自由浮動要素に対して JDialog
または JOptionPane
のインスタンスを表示します。ダイアログ.
この場合、複数の要素が画像である場合は、代わりに次のいずれかを使用することをお勧めします。
JLabel
(スクロール区画の中央)。 ImageViewer
に見られるように。JList
。 この答えで見られるように 。その「単一行」部分は、それらがすべて同じディメンションである場合にのみ機能します。あるいは、画像をその場で拡大縮小する準備ができていて、それらがすべて同じ縦横比(4:3または16:9など)の場合です。複数のJFrame
name__アプローチは、Swingアプリのプログラミングを開始してから実装したものです。ほとんどの場合、私はそれ以上良く知らなかったので、最初にそれをしました。ただし、、開発者としての経験と知識が成熟し、多くの経験豊富なJava開発者の意見を読んで吸収し始めたとき、複数のJFrame
name__アプローチ(現在のプロジェクトと将来のプロジェクトの両方で)からshift awayを実行しようとしましたが、...これを取得する...クライアントからの抵抗!「子」ウィンドウと個別のコンポーネントのJInternalFrame
name__sを制御するためのモーダルダイアログの実装を開始すると、私のクライアントが不満を言い始めました!ベストプラクティスだと思っていたことをやっていたので、私はかなり驚きました!しかし、彼らが言うように、「幸せな妻は幸せな人生です」。クライアントにも同じことが言えます。もちろん、私は請負業者なので、エンドユーザーは開発者である私に直接アクセスできますが、これは明らかに一般的なシナリオではありません。
そこで、複数のJFrame
name__アプローチの利点と、他の人が提示したいくつかの短所についての神話を破ります。
JFrame
name__sを許可することにより、エンドユーザーが画面の内容を広げて制御できるようになります。コンセプトは、「オープン」で非制限的だと感じます。 1つの大きなJFrame
name__とたくさんのJInternalFrame
name__sに向かうと、これを失います。JFrame
name__sでした。ただし、データ入力画面を、親がデータビューアーであるJDialog
name__にしたかったのです。変更を加えた後、すぐにエンドユーザーから電話があり、エンドユーザーはviewerを最小化または閉じることができ、editorプログラムの別の部分(またはWebサイト、私は覚えていない)を参照しているときに開きます。彼はマルチモニターでnotであるため、入力ダイアログを最初に、他の何かを2番目に、データビューアーは完全に非表示です。これはJDialog
name__では不可能でしたし、JInternalFrame
name__でも同様に不可能でした。残念ながら彼の正気さのために別のJFrames
name__に変更しましたが、重要な教訓を教えてくれました。JInternalFrame
name__よりもJFrame
name__を作成する方が簡単な理由はわかりません。実際、私の経験では、JInternalFrames
name__の柔軟性ははるかに低くなっています。アプリでJFrame
name__sの開閉を処理する体系的な方法を開発しましたが、これは本当にうまく機能します。私は、フレームのコード自体の中からフレームをほぼ完全に制御します。新しいフレームの作成、バックグラウンドスレッド上のデータの取得とEDT上のGUIコードを制御するSwingWorker
name__s、ユーザーがフレームを2回開こうとした場合のフレームの復元/前面への移動など。JFrame
name__sはパブリック静的メソッドopen()
を呼び出し、windowClosing()
イベントと組み合わせたopenメソッドが残りを処理します(フレームは既に開いていますか?それは開いていませんが、読み込みですか?)。このアプローチをテンプレートにしたため、各フレーム。JFrame
name__にはJInternalFrame
name__よりも多くのスペースが必要であると言えますが、100個のJFrame
name__sを開いたとしても、実際にどれだけのリソースを消費しますか?リソースが原因でメモリリークが懸念される場合:dispose()
を呼び出すと、フレームでガベージコレクションに使用されているすべてのリソースが解放されます(また、JInternalFrame
name__でもまったく同じ懸念が呼び出されます).私はたくさん書きましたが、もっと書きたいと思っています。とにかく、私はそれが不評な意見だからといって、私が落選しないように願っています。この質問は明らかに価値のあるものであり、たとえそれが一般的な意見でなくても、価値のある答えを提供してくれればと思います。
複数のフレーム/フレームごとの単一ドキュメント( SDI )と1つのフレーム/フレームごとの複数ドキュメント( MDI )の優れた例はMicrosoft Excelです。 MDIの利点のいくつか:
SDI(シングルドキュメントインターフェイス、つまり、すべてのウィンドウに1つのドキュメントのみを含めることができます):
MDI(マルチドキュメントインターフェイス、つまり、すべてのウィンドウに複数のドキュメントを含めることができます):
私が関わったばかりの例で、「ユーザーフレンドリーではない」という議論に対抗したいと思います。
私たちのアプリケーションでは、ユーザーが別々のタブとしてさまざまな 'プログラム'を実行するメインウィンドウがあります。可能な限り私たちはこの単一のウィンドウに私たちのアプリケーションを保とうとしました。
彼らが実行する 'プログラム'の一つはシステムによって生成されたレポートのリストを提示します、そしてユーザーはレポートビューアダイアログを開くために各行のアイコンをクリックすることができます。このビューアはレポートの縦長/横長のA4ページに相当するものを表示しているので、ユーザーはこのウィンドウを非常に大きくして、ほぼ自分の画面いっぱいに表示することを好みます。
数か月前に、これらのレポートビューアウィンドウをモードレスにして、複数のレポートを同時に開くことができるようにするようお客様からリクエストを受け始めました。
私はこれが良い解決策であるとは思わなかったのでしばらくの間私はこの要求に抵抗しました。しかし、私たちのシステムのこの「欠陥」をユーザーがどのように回避しているかを知ったとき、私の考えは変わりました。
レポートをPDFとして特定のディレクトリに保存するために[名前を付けて保存]機能を使用してビューアを開き、Acrobat Readerを使用してPDFファイルを開きます。次のレポートでも同じことをしてください。彼らは彼らが見たがっていたさまざまなレポート出力で走っている複数のAcrobat Readerを持つでしょう。
それで私は辞任し、ビューアをモードレスにしました。つまり、各視聴者にはタスクバーアイコンがあります。
先週彼らに最新版がリリースされた時、彼らからの圧倒的な反応は彼らがそれを愛しているということです。それは私たちの最も人気のある最近のシステムの機能強化のひとつです。
ですから、あなたは先に進んで、欲しいものは悪いとユーザに伝えますが、結局のところそれはあなたに何の恩恵も与えません。
いくつかの注:
ModalityType
引数ではなく、新しいmodal
を使用するコンストラクタを使用してください。これがこれらのダイアログにタスクバーアイコンを与えるものです。JInternalFrameをメインフレームにして非表示にします。それからあなたはさらなるイベントのためにそれを使うことができます。
jInternalFrame.setSize(300,150);
jInternalFrame.setVisible(true);
私が最後にswingに触れてからしばらく経ちましたが、一般的にはこれを行うのは悪い習慣です。頭に浮かぶ主な短所のいくつか:
よりコストがかかります。DialogやJInternalFrameなど、他の種類のウィンドウコンテナであるJFrameを描画するには、さらに多くのリソースを割り当てる必要があります。
ユーザーフレンドリーではありません。JFrameをいっしょに立ち往生させるのは簡単ではありません。あなたのアプリケーションは矛盾したアプリケーションのセットではないように見えます。設計。
JInternalFrameを使うのは簡単ですこれはちょっとした礼儀ですが、今では私たちがすでに考えているよりもずっと簡単で他の人々は賢くなりますDesktopとJInternalFrameのパターンなので、それを使うことをお勧めします。
間違いなく悪い習慣です。 1つの理由は、すべてのJFrame
が新しいタスクバーアイコンを表示するという事実にとって、それがあまり「ユーザーフレンドリー」ではないということです。複数のJFrame
sをコントロールすると、髪の毛がリッピングされます。
個人的には、私はあなたのアプリケーションにONE JFrame
を使います。複数のものを表示する方法はあなた次第です、たくさんあります。 Canvas
es、JInternalFrame
、CardLayout
、さらにはJPanel
s。
複数のJFrameオブジェクト=痛み、問題、そして問題.
複数のJframe
を使用するのはお勧めできません。
代わりに、同じJPanel
の中でJPanel
sを複数のJFrame
を使用することができます。
また、このJPanel
を切り替えることもできます。それで、それは私たちにJFrame
の中のもの以上のものを表示する自由を与えます。
JPanel
ごとに異なるものを設計することができ、このすべてのJPanel
を一度に1つのJFrame
oneに表示できます。
このJPanel
を切り替えるには、各JMenuBar
または 'JButtonfor each
JPanel`に対してJMenuItems
とJPanel
を使用します。
複数のJFrame
を使用することはお勧めできませんが、複数のJFrame
が必要な場合でも問題はありません。
しかし、複数のJFrame
を持つのではなく、異なるニーズに合わせて1つのJFrame
を変更することをお勧めします。
フレームが同じサイズになる場合は、フレームを作成してからその参照として代わりにフレームを渡します。
フレームを通過したら、次にそれを移植する方法を決めることができます。一連の数字の平均を計算する方法があるのと同じです。メソッドを何度も作成しますか。
これは良い習慣ではありませんが、使いたいとしてもシングルトンパターンをその良いものとして使うことができます。私は自分のプロジェクトのほとんどでシングルトンパターンを使ってきました。