【问题标题】:How can i clean and organize up my View (MVC) better我怎样才能更好地清理和组织我的视图(MVC)
【发布时间】:2012-01-17 20:26:13
【问题描述】:

所以我使用 Observer / Observable 方法掌握了 Java 中的基本 MVC 模式。现在为了保持它的清洁和可读性,在我继续讨论如何很好地组织我的视图之前,我想要一些指示,因为这是我的课程最充实的地方。我们在学校被告知将每个班级的文件大小保持在 20kb 以下,以保持其可读性和以后更易于维护。

这是我的看法:

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

    }
}

任何关于在新类中分离什么或如何最小化代码的建议都是有帮助的。这只是我的主视图类的一部分,仍然缺少很多 JComponents,所以它会变得更加混乱。

【问题讨论】:

  • 这可能更适合codereview。你不需要在任何地方都使用this,在Java中你不需要将左大括号放在一个新的行中。
  • UI 编程因生成非常长的文件而臭名昭著。
  • 哦,哇,我不知道 codereview,谢谢。我理解“这个”部分,这只是 PHP 时代的一个旧习惯等。
  • 我确实理解您在进行 UI 工作时会收到大文件,但我正在努力学习如何做到最好,以使其接近行业标准。因此,如果有人在我之后查看代码,他就会明白发生了什么

标签: java model-view-controller swing user-interface


【解决方案1】:

我借此机会展示我理想的 MVC 想法。

组件之间的连线可以受益于EventHandlerhttp://docs.oracle.com/javase/6/docs/api/java/beans/EventHandler.html类的简洁性。

让我们将 GUI 限制为 java swing。

  • GUI 构建器,特别是如果它们生成表单文件(最好是 XML 或 Java FX)可能是可行的,因为它们提供了一个纯粹的分层组织。规范排序。
  • 可以创建组件(JPanel、MyJTextPane)来组合视图和预定义样式属性。

要集成 MVC,需要一个模型,可能由子模型组成。并且可以有一个抽象视图类,可能由子视图组成。这个抽象视图类是所有摆动组件/子视图的工厂,由控制器注入模型和绑定。

在 GUI 构建器中,可以添加 JTextField a 和自定义创建代码 view.a.create()。在 initComponents 之后,可以调用 view.checkRequiredCreated(),这可能会在缺少创建时引发信息异常。

【讨论】:

  • 如果你在我完成后从哪里获得这个应用程序并且这是主视图的类,你会认为这是可以接受的,还是你会说这是一种混乱的方式。由于我的主视图由左、中、右的 3 个 JPanel 隔开,最好将它们作为单独的视图,每个视图都有自己的模型和控制器,然后将它们组装在此视图中,而不是在主视图中设置所有这些 JPanel。
  • (1) 回顾: 我的想法基本上是说一个抽象的 View 类指定有一个 JTextField a 等。GUI 类 JFrame 进行布局。 (2) 我如何看待您的代码: 有序且可读。具有设置方法允许在 javadoc 中记录。拥有子视图(例如左侧的 JPanel)可能会使阅读变得更难(单独的文档)或更容易(降低复杂性),并且可重用性可能会使更难的阅读变得有价值。要看。 (3) Miscellany:您努力对齐变量名称等。我依赖于重新格式化,这对于团队中连贯的编码风格更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 2015-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-06
相关资源
最近更新 更多