시뮬레이션 모델 변경 내부 상태로 gui를 업데이트하는 데 문제가 있습니다. 클래스 시뮬레이터는 특정 단계 수만큼 실행됩니다. 모든 단계에서 컴퓨터의 내부 상태가 변경됩니다. 그런 다음 Gui는 알림을 받고 현재 상태의 텍스트를 포함한 컴퓨터의 그래픽 표현을 다시 그려야합니다. 불행히도 아래에 자세히 나와있는 클래스는 시뮬레이션 실행 마지막 단계 이후의 변경 사항 만 업데이트합니다. 나는 관찰자 (컴퓨터)와 관측 가능한 (GUICanvas) 패턴을 사용하고 있습니다. GUI의 중간 단계에서 다시 그리지 않는다. 당신은 아마 이벤트 스레드에서 실행되는 코드의 비트를 소모 긴 실행 시간 이벤트 디스패치 스레드 또는 EDT를 묶는하고모델 변경의 내부 상태로 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();
}
}
}
}
귀하의 코드 들여 쓰기가 엉망이 당신의 코드 예제 컴파일되지 않습니다. 그것이 첫 번째 문제입니다. –