Java - MVC, реализующий JProgressBar с наблюдателем / наблюдаемым - PullRequest
0 голосов
/ 06 января 2012

Пока мне удалось понять, как все это работает, я запустил каждый модуль без проблем:

  • Представление: создает пользовательский интерфейс и предоставляет методы для адресации JComponents в главном фрейме
  • Контроллер: предоставляет слушателей действий и связывает представление и модель
  • Модель: содержит всю логику при ее изменении. Просмотр уведомляется через Observer / Observable

Теперь моя дилемма в том, как бы вы внедрили JProgressBar в этот шаблон проектирования. Проблема в том, что я рисую свой JProgressBar так:

bar = новый JProgressBar (); bar.setString (потребляется + "/" + всего); bar.setStringPainted (истина);

В любом случае, я выбираю способ реализации JProgressBar в этом шаблоне проектирования, если возникает какая-то проблема, либо ошибка, либо просто обновляется потребляемое значение, но не отрисовывается потребляемая часть JProgressBar.

Вот мой сокращенный код:

Просмотр >> Метод обновления:

public void update(Observable servlet, Object argument)
{
    if(argument.equals("cap-cons-add")) {
        cap_bar.setValue(model.getConsumedCap());
    }
}

Контроллер >>

class moduleBrowserAction implements MouseListener
{
    public void mouseClicked(MouseEvent arg0)
    {
        if(arg0.getClickCount() == 2 && model.getTower() != null)
        {
            String module = view.getModuleTree().getLastSelectedPathComponent().toString();
            model.addModule(module);
            model.incModulesCount(1);
            model.incConsumedCap(5000);
        }
    }
    public void mouseEntered(MouseEvent arg0){}
    public void mouseExited(MouseEvent arg0){}
    public void mousePressed(MouseEvent arg0){}
    public void mouseReleased(MouseEvent arg0){}
}

class towerBrowseAction implements ActionListener
{
    public void actionPerformed(ActionEvent arg0)
    {
        String tower = view.getTowerBrowser().getSelectedItem().toString();
        String[] data = dataStream.serializeData(tower);
        Integer s = Integer.valueOf(data[3]).intValue();
        Integer a = Integer.valueOf(data[4]).intValue();

        Double  em = Double.valueOf(data[5]).doubleValue();
        Double  th = Double.valueOf(data[6]).doubleValue();
        Double  kn = Double.valueOf(data[7]).doubleValue();
        Double  ex = Double.valueOf(data[8]).doubleValue();

        Integer cap = Integer.valueOf(data[1]).intValue();

        if(model.getTower() == null && model.validateTower(tower) == true)
        {
            model.setTower(tower);
            model.setCapacitorBar(view.getCapBar(), cap);
            model.setHardners(em, th, kn, ex);
            model.setSieldAndArmor(s, a);               
        } else {
            integrity.towerSelectedWarning();
        }
    }   
}

И моя модель:

private int cap_total = 0;
private int cap_consumed = 0;

public void incConsumedCap(int amount)
{
    this.cap_consumed += amount;
    this.setChanged();
    this.notifyObservers("cap-cons-add");
}

public int getConsumedCap()
{
    return this.cap_consumed;
}

public void setCapacitorBar(JProgressBar bar, int max)
{
    this.cap_total = max;
    bar.setMaximum(max);
    bar.setString(cap_consumed + " / " + max);
    bar.setStringPainted(true);
}

Итак, приложение работает следующим образом: И элемент выбирается из JComboBox, он меняет несколько меток и устанавливает JProgressBar, вызывая setCapacitorBar () .. Теперь, когда к основному элементу добавлены дополнительные модули, функция model.incConsumedCap (5000); который увеличивает потребляемую сумму и устанавливает флаг setChaned () и вызывает notifyObservers () в методе обновления, упомянутый JProgressBar адресован непосредственно, устанавливая потребленное значение, однако, безрезультатно.

  1. Я знаю, что это адское чтение, поэтому я просто попросил бы прямое предложение, как бы вы реализовали JProgressBar, если бы вы создавали приложение с графическим интерфейсом на основе Observer - Observable design
...