2012-01-17 10 views
0

Observer/Observableメソッドを使用して、Javaの基本MVCパターンを把握しました。今ではそれをきれいにして読みやすいようにすることに興味があります。私の前に、私のViewを整理する方法についていくつかの指針が欲しいと思います。学校では、クラスごとのファイルサイズを20 KB以下に抑えて、可読性を保ち、後で保守しやすくしています。ここで私のビュー(MVC)をきれいに整理するにはどうすればいいですか?

は、私の見解である:新しいクラスまたはどのように役立つコードを最小限にするために分離するものに

package view; 

import model.*; 
import helper.*; 

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

import java.util.Observable; 
import java.util.Observer; 
import net.miginfocom.swing.MigLayout; 


public class View extends JFrame implements Observer 
{ 
    private Model model; 

    private JPanel left = new JPanel(new MigLayout()); 
    private JPanel center = new JPanel(new MigLayout()); 
    private JPanel right = new JPanel(new MigLayout()); 

    private void setConstraints() 
    { 
     this.left.setMinimumSize(new Dimension(252, 540)); 
     this.left.setMaximumSize(new Dimension(252, 37500)); 

     this.center.setMinimumSize(new Dimension(298, 540)); 

     this.right.setMinimumSize(new Dimension(250, 540)); 
     this.right.setMaximumSize(new Dimension(250, 37500)); 
    } 

    //Left panel contents 
    private Towers box = new Towers(); 
    private Modules tree = new Modules(); 

    private JPanel setupLeft() 
    { 
     this.left.add(this.box, "growx, pushx, wrap"); 
     this.left.add(new JScrollPane(this.tree), "grow, push"); 
     return this.left; 
    } 

    //Center panel contents 
    private Browser browser = new Browser(); 

    private JPanel setupCenter() 
    { 
     this.center.add(new JScrollPane(this.browser), "grow, push"); 
     return this.center; 
    } 

    //Right panel contents 
    private JLabel tower = new JLabel("No tower selected."); 
    private JLabel cap = new JLabel("Capacitor"); 
    private JLabel cpu = new JLabel("CPU"); 
    private JLabel shield = new JLabel("0"); 
    private JLabel armor = new JLabel("0"); 
    private JLabel em  = new JLabel("0.0"); 
    private JLabel th  = new JLabel("0.0"); 
    private JLabel kn  = new JLabel("0.0"); 
    private JLabel ex  = new JLabel("0.0"); 

    private JPanel setupRight() 
    { 
     this.right.add(this.tower, "span, wrap"); 
     this.right.add(this.cap, "span, wrap"); 
     this.right.add(this.cpu, "span, wrap"); 
     this.right.add(this.shield, "span, wrap"); 
     this.right.add(this.armor, "span, wrap"); 
     this.right.add(this.em, "span, wrap"); 
     this.right.add(this.th, "span, wrap"); 
     this.right.add(this.kn, "span, wrap"); 
     this.right.add(this.ex, "span, wrap"); 
     return this.right; 
    } 

    public View(Model ui_model) 
    { 
     model = ui_model; 

     this.setTitle("MVC Experiment 6"); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.setExtendedState(JFrame.MAXIMIZED_BOTH); 
     this.setMinimumSize(new Dimension(800, 600)); 
     this.setLayout(new MigLayout()); 

     this.setConstraints(); 

     this.add(this.setupLeft(), "dock west"); 
     this.add(this.setupCenter(), "dock center"); 
     this.add(this.setupRight(), "dock east"); 
    } 

//Left panel contents - Listeners and methods for addressing JComponents 
    public void xTowersBrowser(ActionListener event) 
    { 
     this.box.addActionListener(event); 
    } 

    public void xModulesBrowser(MouseListener event) 
    { 
     this.tree.addMouseListener(event); 
    } 

    public Towers getTowersBrowser() 
    { 
     return this.box; 
    } 

    public Modules getModulesBrowser() 
    { 
     return this.tree; 
    } 
    //Left panel - END 

    //Center panel - components :: listeners and methods 
    public void xBrowser(MouseListener event) 
    { 
     this.browser.addMouseListener(event); 
    } 

    public Browser getBrowser() 
    { 
     return this.browser; 
    } 
    //Center panel - END 

    public void update(Observable o, Object arg) 
    { 

    } 
} 

任意の提案。これは私のメインのViewクラスから削除されたものです。JComponentsがたくさん残っているので、もっと面倒です。

+0

これはおそらく[codereview](http://codereview.stackexchange.com)でより適切でしょう。あなたはどこでも 'this'を使う必要はありません。そして、Javaでは、改行の中にカッコを入れません。 – toto2

+0

非常に長いファイルを生成するためのUIプログラミングは有名です。 – toto2

+0

ああ、私はそれについてのcodereview感謝については知らなかった。私はこの部分を理解しています。それはPHPの日などの古い習慣です。 –

答えて

2

私はこの機会に私の理想的なMVCのアイデアを提示します。

コンポーネント間の配線には、クラスEventHandler,http://docs.oracle.com/javase/6/docs/api/java/beans/EventHandler.htmlの簡潔さの恩恵を受けることができます。

GUIをJavaスイングに制限しましょう。

  • GUIビルダーは、特にXMLやJava FXのフォームファイルを生成する場合、純粋な階層構造を提供するため、実行可能な可能性があります。標準的な順序付け。
  • ビュー(JPanel、MyJTextPane)を作成してビューを作成し、スタイリングプロパティを事前定義することができます。

MVCを統合するには、おそらくサブモデルで構成されるモデルがあります。そして、おそらくサブビューで構成された抽象ビュークラスを持つことができます。この抽象ビュークラスは、コントローラーがモデルとバインディングを挿入したすべてのスイングコンポーネント/サブビューのファクトリです。

GUIビルダーでは、カスタム作成コードview.a.create()としてJTextField aを追加できます。 initComponentsの後には、view.checkRequiredCreated()を呼び出すことができます。これは、欠落している作成に関する有益な例外をスローする可能性があります。

+0

非常に興味深い+1 – mKorbel

+0

私が終わった後、このアプリケーションを入手する場所がメインビューのクラスだったなら、これは厄介な方法だと言います。 私のメインビューは3つのJPanelで区切られているので、それぞれのモデルとコントローラを別々のビューとして別々のものにしてから、これらのJPanelをmainで設定するのではなく、このViewでアセンブルする方が良いでしょう表示します。 –

+0

**(1)要約:**私の考えは基本的に、抽象ビュークラスはJTextField 'a'などがあると指定しています。そして、GUIクラスJFrameはレイアウトを行います。 **(2)私はあなたのコードをどのように考えるか:**秩序ある、読みやすい。設定メソッドを使用すると、javadocで文書化することができます。 (JPanelが残ったように)サブビューを持つと、読みにくくなり(別のドキュメント)、簡単に(複雑さが軽減される)、再利用性が向上し、読みにくくなる可能性があります。依存します。 **(3)Miscellany:**変数名などを整列させるために努力しました。私はリフォームに頼っています。これは、チーム内の一貫したコーディングスタイルには適しています。 –

関連する問題