简体   繁体   English

如何更好地清理和组织我的视图(MVC)

[英]How can i clean and organize up my View (MVC) better

So i got the grip on the basic MVC patterns in java using Observer / Observable method. 所以我使用Observer / Observable方法掌握了java中的基本MVC模式。 Now in interest of keeping it clean and readable i would like some pointers before i move on regarding how to well organize my View as this is where my Classes get most filled up. 现在为了保持它的清洁和可读性,我想在我继续讨论如何很好地组织我的视图之前有一些指示,因为这是我的课程最充满的地方。 We been told in school to keep file size per class bellow 20kb to keep it readable and later easier maintainable. 我们在学校被告知要保持每个类的文件大小低于20kb以保持可读性,以后更容易维护。

Here is my view: 这是我的观点:

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)
    {

    }
}

Any suggestions on what to separate in new classes or how to minimize the code are helpful. 关于在新类中分离什么或如何最小化代码的任何建议都是有帮助的。 This is just a cut out of my main View class there are still a lot of JComponents missing so it will get more messy. 这只是我的主要View类的一个缺失,仍然有很多JComponents丢失,所以它会变得更加凌乱。

I take this opportunity to present my ideal MVC ideas. 我借此机会展示我理想的MVC创意。

The wiring between the components can benefit from the brevity of the class EventHandler , http://docs.oracle.com/javase/6/docs/api/java/beans/EventHandler.html . 组件之间的连接可以受益于EventHandler类的简洁, http://docs.oracle.com/javase/6/docs/api/java/beans/EventHandler.html

Let's constrain the GUI to java swing. 让我们将GUI限制为java swing。

  • GUI Builders, especially if they generate form files, preferably in XML or Java FX, might be feasible, as they provide a pure hierarchical organisation. GUI构建器,特别是如果它们生成表单文件,最好是XML或Java FX,可能是可行的,因为它们提供了纯粹的分层组织。 A canonical ordering. 规范的排序。
  • One may create components (JPanel, MyJTextPane), to compose views and predefine styling properties. 可以创建组件(JPanel,MyJTextPane)来组合视图和预定义样式属性。

To integrate MVC one has a model, possibly composed of submodels. 为了集成MVC,有一个模型,可能由子模型组成。 And one could have an abstract view class, possibly composed of subviews. 人们可以拥有一个抽象的视图类,可能由子视图组成。 This abstract view class is the factory of all swing components / subviews, with the injection of the model and the binding, by the controller. 这个抽象视图类是所有swing组件/子视图的工厂,由控制器注入模型和绑定。

In the GUI builder one can add a JTextField a with as custom creation code view.a.create() . 在GUI构建器中,可以添加JTextField a作为自定义创建代码view.a.create() After initComponents one can call view.checkRequiredCreated() which might throw an informative exception on missing creations. 在initComponents之后,可以调用view.checkRequiredCreated() ,这可能会在缺少的创建上引发一个信息性异常。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM