到目前为止,我设法掌握了这一切是如何工作的,我已经让每个模块都可以正常工作:
- View:构建 UI 并提供在主框架上寻址 JComponents 的方法
- 控制器:提供动作监听器并链接视图和模型
- 模型:包含更改时的所有逻辑视图通过观察者/观察者通知
现在我的困境是如何在这个设计模式中实现 JProgressBar。问题是我像这样画我的 JProgressBar:
bar = new JProgressBar(); bar.setString(已消耗 + " / " + 总计); bar.setStringPainted(true);
无论如何,如果产生某种问题或者错误,或者它只是更新消耗的值但不绘制 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 中选择元素,它更改了一些标签并通过调用 setCapacitorBar() 设置 JProgressBar。现在,将附加模块添加到主元素中,函数 model.incConsumedCap(5000); 增加消耗量并设置 setChaned() 标志并在更新方法中调用 notifyObservers() 提到的 JProgressBar 直接设置消耗值但无效。
- 我知道这本书读起来太难了,所以我只想问一个直接的建议,如果你在 Observer 上构建一个 GUI 应用程序,你将如何实现 JProgressBar - 可观察设计