gpt4 book ai didi

java - 随着模型内部状态的变化更新 java GUI

转载 作者:行者123 更新时间:2023-12-02 00:29:15 25 4
gpt4 key购买 nike

当模拟模型的内部状态发生变化时,我在更新 GUI 时遇到问题。类模拟器运行一定数量的步骤。每一步,计算机的内部状态都会发生变化。然后 Gui 会收到通知,并应该重新绘制计算机的图形表示,包括当前状态的文本。不幸的是,对于下面详细介绍的类,GUI 仅在模拟运行的最后一步后更新更改。我正在使用观察者(计算机)和可观察(GUICanvas)模式。我做错了什么,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();
}
}
}
}

最佳答案

您可能会将事件分派(dispatch)线程或 EDT 与在事件线程上运行的一段运行时间较长的代码捆绑在一起:

public void simulate() {
for(int step = 0; step < simulationSteps; step++) {
for(Computer computer : computers) {
computer.tick()
}
}
}

尝试使用 SwingWorker或其他后台线程来解决这个问题。

关于java - 随着模型内部状态的变化更新 java GUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9436542/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com