2012-01-17 3 views
0

Итак, я получил сцепление с основными шаблонами MVC в java, используя метод Observer/Observable. Теперь, в интересах сохранения чистоты и удобочитаемости, я хотел бы указать некоторые указатели, прежде чем я перейду к рассмотрению того, как хорошо организовать мой просмотр, поскольку именно здесь мои классы больше всего заполняются. Нам сказали в школе, чтобы сохранить размер файла в классе ниже 20kb, чтобы он был читабельным и более легким для обслуживания.Как можно очистить и упорядочить мой вид (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

Программирование пользовательского интерфейса печально известно для создания очень длинных файлов. – toto2

+0

oh wow я не знал о codereview, спасибо за это. Я понимаю, что эта «эта» часть - это просто старая привычка из PHP-дней и т. Д. –

ответ

2

Я пользуюсь этой возможностью, чтобы представить свои идеальные идеи MVC.

Проводка между компонентами может быть выгодна из-за краткости класса EventHandler, http://docs.oracle.com/javase/6/docs/api/java/beans/EventHandler.html.

Давайте ограничим графический интерфейс java swing.

  • GUI Builders, особенно если они создают файлы форм, предпочтительно в формате XML или Java FX, могут быть осуществимы, поскольку они обеспечивают чистую иерархическую организацию. Каноническое упорядочение.
  • Можно создавать компоненты (JPanel, MyJTextPane) для создания представлений и предопределения свойств стиля.

Чтобы интегрировать MVC, у вас есть модель, возможно, состоящая из субмоделей. И можно было бы иметь класс абстрактного вида, возможно, состоящий из подзонов. Этот абстрактный класс представления является фабрикой всех компонентов/подсистемы swing с инжекцией модели и привязкой контроллером.

В конструкторе GUI можно добавить JTextField a с кодом пользовательского кода view.a.create(). После initComponents можно вызвать view.checkRequiredCreated(), который может выдать информативное исключение из недостающих созданий.

+0

очень интересно +1 – mKorbel

+0

Если вы хотите получить это приложение после того, как я закончил, и это был класс для основного вида, вы найдете это приемлемым или вы бы скажем, это способ запутать. Поскольку мой основной вид разделен на 3 JPanels влево, в центре, справа, было бы лучше сделать их отдельными представлениями с их собственными моделями и контроллерами для каждого, а затем собрать их в этом представлении вместо того, чтобы настраивать все эти JPanels в главном Посмотреть. –

+0

** (1) Recap: ** В моей идее в основном говорится, что абстрактный класс View указывает, что есть JTextField 'a' и т. Д. И GUI-класс JFrame выполняет макетирование. ** (2) Как я считаю ваш код: ** Упорядоченный и читаемый. Наличие методов настройки позволяет документировать в javadoc. Наличие подзонов (например, JPanel слева) может сделать чтение более сложным (отдельная документация) или проще (уменьшенная сложность), а повторное использование может сделать более трудным чтение. Зависит. ** (3) Сборник: ** Вы предприняли попытку выровнять имена переменных и т. Д.Я полагаюсь на реформацию, которая лучше подходит для последовательного стиля кодирования в командах. –