Java - реализация MVC - PullRequest
       9

Java - реализация MVC

0 голосов
/ 03 января 2012

Я только начал создавать приложения на Java Swing, используя шаблон MVC, и до сих пор я обнаружил, что это сильно упростило мою работу и решило немало проблем. Теперь у меня есть несколько вопросов, которые меня беспокоят или не решают:

Вот мой пользовательский интерфейс:

package env.view;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import net.miginfocom.swing.MigLayout;

import env.helper.*;

public class UI_View extends JFrame
{

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

    //LEFT PANEL
    private Tower_Helper towers = new Tower_Helper();
    private Tree_Helper modules = new Tree_Helper();
    private JScrollPane mod_bar = new JScrollPane(modules);

    //CENTER PANEL
    private Browse_Helper browser = new Browse_Helper();
    private JScrollPane   browser_bar = new JScrollPane(browser);

    //RIGHT PANEL - LABELS
    private JLabel tower_name = new JLabel("No tower selected");
    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");

    //RIGHT PANEL - CONTROLLS
    private JProgressBar cap_bar    = new JProgressBar();
    private JProgressBar cpu_bar    = new JProgressBar();
    private int total   = 0;
    private int consumed    = 0;

    public UI_View()
    {
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setMinimumSize(new Dimension(800, 600));
        this.setExtendedState(JFrame.MAXIMIZED_BOTH);
        this.setTitle("Environment Prototype");
        this.setLayout(new MigLayout());

        left.setMinimumSize(new Dimension(252, 540));
        left.setMaximumSize(new Dimension(252, 37500));
        left.add(towers, "growx, pushx, wrap");
        left.add(mod_bar,"grow, push");

        center.setMinimumSize(new Dimension(298, 540));
        center.add(browser_bar, "grow, push");

        right.setMinimumSize(new Dimension(250, 540));
        right.setMaximumSize(new Dimension(250, 37500));
        tower_name.setToolTipText("Double click to remove tower if modules have been removed.");
        right.add(tower_name, "span, wrap");

        right.add(new JLabel(""), "wrap, span");
        right.add(new JLabel(""), "wrap, span");

        right.add(new JLabel("Capacitor"), "wrap, span");
        cap_bar.setMinimumSize(new Dimension(215, 40));
        right.add(cap_bar, "wrap, span");

        right.add(new JLabel("CPU"), "wrap, span");
        cpu_bar.setMinimumSize(new Dimension(215, 40));
        right.add(cpu_bar, "wrap, span");

        right.add(new JLabel("Shield:  "));
        right.add(shield, "wrap");

        right.add(new JLabel("Armor:  "));
        right.add(armor, "wrap");

        right.add(new JLabel(""), "wrap, span");
        right.add(new JLabel(""), "wrap, span");

        right.add(new JLabel("EM:  "));
        right.add(em, "wrap");

        right.add(new JLabel("TH:  "));
        right.add(th, "wrap");

        right.add(new JLabel("KN:  "));
        right.add(kn, "wrap");

        right.add(new JLabel("EX:  "));
        right.add(ex, "wrap");

        this.add(left, "dock west");
        this.add(center, "dock center");
        this.add(right, "dock east");
    }

    //getter - JLabel tower name
    public JLabel getTowerNameLabel()
    {
        return this.tower_name;
    }

    //listener - JLabel tower name
    public void towerLabelListner(MouseListener event)
    {
        this.tower_name.addMouseListener(event);
    }

    //getter - JList browser
    public JList getBrowserList()
    {
        return this.browser;
    }

    //listener - JList browser
    public void browserListListener(MouseListener event)
    {
        this.browser.addMouseListener(event);
    }

    //getter - JTree modules
    public JTree getModuleTree()
    {
        return this.modules;
    }

    //listener - JTree modules
    public void modulesTreeListener(MouseListener event)
    {
        this.modules.addMouseListener(event);
    }

    //getter - JComboBox towers
    public JComboBox getTowers()
    {
        return this.towers;
    }

    //lisetner - JComboBox towers
    public void towersBoxListener(ActionListener evnet)
    {
        this.towers.addActionListener(evnet);
    }

}

Вот мой UI CONTROLLER

package env.controller;

import env.model.UI_Model;
import env.view.UI_View;
import java.awt.event.*;

import javax.swing.*;

public class UI_Controller
{    
    private UI_Model ui_model;
    private UI_View  ui_view;

    public UI_Controller(UI_Model model, UI_View view)
    {
        ui_model = model;
        ui_view  = view;

        ui_view.towersBoxListener(new towerSelectionListener());
        ui_view.modulesTreeListener(new modulesSelectionListener());
        ui_view.browserListListener(new browserSelectionListener());
        ui_view.towerLabelListner(new towerRemovalListener());
    }

    class towerRemovalListener implements MouseListener
    {
        @Override public void mouseClicked(MouseEvent e) 
        {
            if(e.getClickCount() == 2 && ui_model.getModulesCounter() == 0)
            {
                ui_view.getTowerNameLabel().setText(ui_model.reset_label());
                ui_model.retsetSelectionInfo();
            } else if (ui_model.getModulesCounter() != 0){
                JFrame dialog = new JFrame();
                JOptionPane.showMessageDialog(dialog, "Cannot remove tower whit modules still selected.",
                "Cannot remove tower !", JOptionPane.WARNING_MESSAGE);
            }
        }
        @Override public void mousePressed(MouseEvent e) {}
        @Override public void mouseReleased(MouseEvent e) {}
        @Override public void mouseEntered(MouseEvent e) {}
        @Override public void mouseExited(MouseEvent e) {}
    }

    class browserSelectionListener implements MouseListener
    {
        @Override public void mouseClicked(MouseEvent e) 
        {
            if(e.getClickCount() == 2)
            {
                String selection = ui_view.getBrowserList().getSelectedValue().toString();
                ui_model.removeFromList(selection);
                ui_view.getBrowserList().setModel(ui_model.getSelectedModules());
            }
        }
        @Override public void mousePressed(MouseEvent e) {}
        @Override public void mouseReleased(MouseEvent e) {}
        @Override public void mouseEntered(MouseEvent e) {}
        @Override public void mouseExited(MouseEvent e) {}
    }

    class modulesSelectionListener implements MouseListener
    {
        @Override public void mouseClicked(MouseEvent e) 
        {
            if(e.getClickCount() == 2 && ui_model.getSelectionInfo() != null)
            {
                String output = ui_view.getModuleTree().getLastSelectedPathComponent().toString();
                ui_model.addToList(output);
                ui_view.getBrowserList().setModel(ui_model.getSelectedModules());
            }
        }
        @Override public void mousePressed(MouseEvent e) {}
        @Override public void mouseReleased(MouseEvent e) {}
        @Override public void mouseEntered(MouseEvent e) {}
        @Override public void mouseExited(MouseEvent e) {}
    }

    class towerSelectionListener implements ActionListener
    {
        @Override public void actionPerformed(ActionEvent e) 
        {
            String output   = ui_view.getTowers().getSelectedItem().toString();
            if(ui_model.getSelectionInfo() == null)
            {
                if(ui_model.validateTower(output))
                {
                    ui_model.setSelectionInfo(output);
                    ui_view.getTowerNameLabel().setText(ui_model.getSelectionInfo());
                }
            } else {
                JFrame dialog = new JFrame();
                JOptionPane.showMessageDialog(dialog, "There is a already selected tower: "
                + ui_model.getSelectionInfo(), "Cannot select a new tower !",
                JOptionPane.WARNING_MESSAGE);
            }
        }
    }
}

Вот моя МОДЕЛЬ UI:

package env.model;

import javax.swing.*;

public class UI_Model 
{
    private String is_tower_selected = null;
    private DefaultListModel selected_modules = new DefaultListModel();
    private int module_counter = 0;
    private final String reset_tower_name = "No tower selected";

    private int shield = 0;
    private int armor  = 0;
    private double em  = 0.0;
    private double th  = 0.0;
    private double kn  = 0.0;
    private double ex  = 0.0;

    public String reset_label()
    {
        return this.reset_tower_name;
    }

    public int getModulesCounter()
    {
        return this.module_counter;
    }

    public UI_Model()
    {

    }

    public DefaultListModel getSelectedModules()
    {
        return this.selected_modules;
    }

    public void removeFromList(String input)
    {
        this.selected_modules.removeElement(input);
        this.module_counter -= 1;
    }

    public void addToList(String output)
    {
        if(validateInput(output) == true)
        {
            this.selected_modules.addElement("   " + output);
            this.module_counter += 1;
        }
    }

    public String getSelectionInfo()
    {
        return this.is_tower_selected;
    }

    public void setSelectionInfo(String tower)
    {
        this.is_tower_selected = tower;
    }

    public void retsetSelectionInfo()
    {
        this.is_tower_selected = null;
    }

    public void outputSelection(String output)
    {
        System.out.println(output);
    }    

    public boolean validateTower(String input)
    {
        if(input.equals("Select a Control Tower "))
        {
            return false;
        }
        return true;
    }

    public boolean validateInput(String input)
    {
        if(input.contains("<html>") || input.equals("Starbase Modules"))
        {
            return false;
        }
        return true;
    }
}

Большое спасибо, если вы зашли так далеко:) Теперь за вопросы:

  1. Я пытаюсь реализовать компонент JProgressBar, на мой взгляд создал экземпляр этого, но я немного смущен тем, что является правильный способ реализовать это, потому что, как элементы добавляются в JList компоненты потребляемой части из общего максимального количества JProgressBar будет обновлен.

  2. В начале проекта мне сказали реализовать Observable класс на мой взгляд и наблюдатель на мою модель. Однако мне сказали предоставить некоторый код, который я не имел в то время для справки. Ну, теперь у меня есть некоторый код, однако я не вижу, как этот Observer / Наблюдаемая реализация может помочь мне в моем случае Проблема JProgressBar в частности. Могу ли я получить некоторые предложения по как реализация O / O может помочь мне в этом коде.

  3. Так как я не могу применить BorderFactory.createEmptyBorder к JLabel для сделать интервал между метками на моей JPanel я использую "right.add (новый JLabel (""), "wrap, span") ", чтобы создать вертикальный разрыв между тем, как можно я заменяю это. Есть ли заранее определенный метод, который может установить разрыв между элементами JPanel или мне нужно обратиться к макету Менеджер.

Приветствуются любые советы по исправлению, изменению или замене. Я знаю, что я поместил здесь много данных, но я пытаюсь изучить это должным образом, и у меня нет другого места для ссылки.

Ответы [ 2 ]

4 голосов
/ 03 января 2012

Вы сказали

В начале проекта мне сказали реализовать класс Observable, на мой взгляд, и Observer - для моей модели.

но для меня это звучит довольно задом наперед.Представление больше всего похоже на Observer, а модель похожа на Observable. Возможно, вы ошиблись?

Кроме того, проверьте класс MouseAdapter - создайте подклассы вместо прямой реализации MouseListenerвырежет много бесполезного кода!

3 голосов
/ 03 января 2012
  1. Я не уверен, что вы получаете здесь, если вы не связываете их, он не будет обновляться?

  2. Если вы расширяете Observable накласс UI_Model, измените addToList () на вызов setChanges (), затем notifyObservers ().


 public void addToList(String output)
    {
        if (validateInput(output) == true)
        {
            this.selected_modules.addElement("   " + output);
            this.module_counter += 1;
            setChanged();
            notifyObservers();
        }
    }

Затем реализуйте Observer на вашем объекте представления, затем добавьте представление в качестве наблюдателя кМодель в контроллере:

public UI_Controller(UI_Model model, UI_View view)
{
    ui_model = model;
    ui_view  = view;

    ui_model.addObserver(ui_view);

    ui_view.towersBoxListener(new towerSelectionListener());
    ui_view.modulesTreeListener(new modulesSelectionListener());
    ui_view.browserListListener(new browserSelectionListener());
    ui_view.towerLabelListner(new towerRemovalListener());
}
  1. Глядя на спецификацию и другие источники, кажется, что JLabel.setBorder (BorderFactory.createEmptyBorder (...)) должен работать.
...