1

私はJavaでグラフィカルユーザーインターフェイスを構築していますが、誰かが私にいくつかの指示を与えることができるかどうか疑問に思っていました。具体的には、このGUIのボタンをクリックすると、大きなJDialog(JDialogを拡張するクラス)が開き、ユーザーは情報を入力したり、情報を表示したり、クリックしたりすることができます。

このクラスには、複数のJLabelとその他のコンポーネントが含まれています。私の質問は、どのようにしてそのようなインスタンスを作成するのでしょうか?現在、コンストラクターにはすべてが含まれているため、500(!)行のコンストラクターになっています。それに代わるものが必要です!コンストラクターは、コンポーネントの配置と設定の約300行のコードであり、リスナーが与えるまたは取るための別の200行です。

また、頭に浮かぶもう1つの質問は、今、別のクラスからこのウィンドウを開いて、

MyClassExtendsJDIalog temp = new MyClassExtendsJDIalog();

ただし、「temp」のコンストラクターはすべてを実行するため、作成するクラスではこの「temp」変数をまったく使用しません。繰り返しになりますが、私は間違った方法で何かをしているようです。

これを読んでくれてありがとう。

4

3 に答える 3

5

コードを分割して読みやすく管理しやすくしたい場合は、常にフィールドをJPanelのサブクラス(Panel1、Panel2など)にグループ化してから、JDialogサブクラスコンストラクターに追加するだけです。しかし、スイングでGUIを設定するには、多くの行が必要です。

使用されていない一時変数については、コンストラクターでshow()を呼び出していると思いますか?通常、私はそれをしませんが、代わりにダイアログを作成するコードでそれを呼び出します。

MyDialog dialog = new MyDialog();
dialog.setVisible(true);
于 2012-04-23T21:54:34.747 に答える
4

コードを見ずに、コードとデザインを改善するための具体的なヒントを提供することは困難です。

同意します。コンストラクターの最大500行は、直感的に問題のように感じます。少なくとも、インスタンスが作成されるまで、その作業の一部を延期することをお勧めします。これをinit()メソッド(または一連のメソッド)に移動することは、1つのアプローチです。

また、JDialogを拡張するのではなく、JDialogを含むようにクラスを設計することを検討することもできます(このトピックの説明については、継承の構成を参照してください)。そうでない場合は、いくつかのクラスの懸念を混乱させていると思います。

最後に、Swingベースのユーザーインターフェイスを作成するための一般的なヒントとテクニックについて、JavaSwingチュートリアルを確認することをお勧めします。

于 2012-04-23T22:05:27.190 に答える
3

はい、あなたは何か間違ったことをしていますが、あなたは良い(または悪い)仲間です。

他のことと同様に、優れたオブジェクト指向デザインとクリーンなコードのルールをスイングクラスに適用する必要があります。

300行以上のコードを見ずに正確に何ができるかを判断するのは難しいです(そして私は本当に見たくありません;-)が、おそらく適用できるものがここにあります。

私の主な設計ルールは、単一責任の原則です。あなたの説明(そして私の推測)によると、あなたはコンストラクターで次のことをしています:

* creating (including configuring) components

* placing them in some kind of layout

* registering Listeners

* implementing Listners

これらは4つのまったく異なる懸念事項です。

いくつかの重いリファクタリングの後、次のような結果になる可能性があります。

コンポーネントを作成するファクトリが必要になる場合があります。

コンポーネントまたはコンポーネントのグループ(ラベルと一致するテキストボックスなど)を取得してパネルに配置するLayouterクラスがある場合があります。

クラスにコンポーネント(およびモデルなど)を取得し、リスナーを使用してそれらを相互に接続する場合があります。

そして、これらすべてに合格したクラスは、適切な方法でそれを使用し、すべてのコンポーネントがオンになっているパネルでJDialogを吐き出します。

注:理想的には、JDialogを拡張するものはもうありません。新しいSwingコンポーネントを構築する場合にのみ、Janythingを拡張する必要があります。

この例ではScalaを使用していますが、それでもいくつかのインスピレーションを提供する必要があります:http: //blog.schauderhaft.de/2011/06/26/clean-code-with-swing-and-scala/

于 2012-04-23T22:16:05.943 に答える