シミュレーションモデルの変更の内部状態としてguiを更新する際に問題があります。クラスシミュレータは、特定のステップ数だけ実行されます。毎回、コンピュータの内部状態が変化します。 Guiは通知を受け、現在の状態のテキストを含むコンピュータのグラフィック表示を再描画する必要があります。残念ながら、GUIの下で詳述されているクラスでは、シミュレーションの最後のステップが実行された後の変更のみが更新されます。私はオブザーバー(コンピューター)と観測可能な(GUICanvas)パターンを使用しています。シミュレーションの中間ステップでGUIが再描画されないのは間違っていますか?モデル変更の内部状態としてのJava GUIの更新
public class NwSim {
public NwSim() {
}
public static void main(String[] args) {
JFrame frame;
Simulator simulator = new Simulator();
canvas = new GUICanvas(); //create gui canvas, which paints guy computers
canvas.setBackground(Color.white);
contentPane.add(canvas, BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
simulator.simulate();
}
}
//represents the controller in the simulation
public class Simulator {
List<Computer> computers;
private int simulationSteps;
public Simulator()
simulationSteps = 200;
computers = new ArrayList<Computer>();
public void simulate() {
for(int step = 0; step < simulationSteps; step++) {
for(Computer computer : computers) {
computer.tick()
}
}
}
public Computer createComputer() {
Computer computer = new Computer();
computers.add(computer)
}
}
public class Computer extends Observable {
public void tick {
….. // update field state of the computer
if (state.stateChanged()) {
setChanged();
notifyObservers(); //notify observer- gui canvas that the state of computer has changed and it is time to repaint guiComputers
}
}
public string getState() {
return state;
}
}
public class GUIComputer {
private static final long serialVersionUID = 1L;
private int width;
private int height;
private Image image;
private Computer computer;
public GUIComputer(int x, int y, Computer computer component, Image image) {
this.computer = computer;
setX(x);
setY(y);
this.image = image;
width = image.getWidth(null);
height = image.getHeight(null);
}
@Override
public void drawGuiComputer(Graphics g){
g.drawImage(image, getX(), getY(), null);
Graphics2D g2 = (Graphics2D)g;
g2.drawString(computer.getState().toString(), getX() + 20, getY() // repaint the state for each guiComputer taken from Computer
+ height + 10);
}
}
public class GUICanvas extends JPanel implements Observer {
//
private List<GUIComputer> guiComputers;
public GUICanvas(Simulator simulator) {
this.guiComputers = new ArrayList<GUIComputer>();
// create guy computers using method createGuiComputer below , code omitted
}
public createGuiComputer(Transferable transferable, Point dropPoint, Computer computer) {
Image image = Toolkit.getDefaultToolkit().getImage("images/" + imageName);
Computer computer = simulator.createComputer();
GUIComputer guiComputer = new GUIComputer(dropPoint.x, dropPoint.y, computer, image);
guiComputers.add(guiComputer);
guiComputer.addObserver(this);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
if (!GuiComputers.isEmpty()) {
for(GUIComputer guiComputer : guiComputers) {
// redraw guiComputer
guiComputer.drawGuiComputer(g);
}
}
}
@Override
public void update(Observable o, Object o1) {
for(final GUIComputer guiComputer : guiComputers) {
if(guiComputer.getComputer().equals(o)) {
//if update requested by Computer object then update gui, redrawing all guiComputers
revalidate();
repaint();
}
}
}
}
あなたのコードのインデントが混乱ですが、あなたのコード例コンパイルされません。それが最初の問題です。 –