これまでのところ、すべてのモジュールが問題なく動作するようになりました。
- 表示: UI を構築し、メイン フレームで JComponents をアドレス指定するためのメソッドを提供します。
- コントローラー: アクション リスナーを提供し、ビューとモデルをリンクします。
- モデル: 変更されたすべてのロジックが含まれます ビューは Observer / Observable を介して通知されます
ここでの私のジレンマは、このデザイン パターンに JProgressBar をどのように実装するかということです。問題は、次のように JProgressBar をペイントすることです。
バー = 新しい JProgressBar(); bar.setString(consumed + " / " + total); 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() フラグを設定し、 update メソッドで notifyObservers() を呼び出します。前述の JProgressBar は消費値を直接設定しますが、効果はありません。
- 私はこれが非常に読みにくいことを知っているので、Observer に基づいて構築する GUI アプリケーションを作成している場合、JProgressBar をどのように実装するかについて直接的な提案を求めたいと思います - Observable design