gpt4 book ai didi

java - 在 Java(和 SWT)中同步 "Frontend"和 "Backend"

转载 作者:行者123 更新时间:2023-12-01 12:44:15 26 4
gpt4 key购买 nike

编辑:所以代码实际上工作正常 - 所有对象都按应有的方式进行修改。当该方法仍在运行时,这只是表面似乎存在更新自身的问题......

<小时/>

我正在开发一个 atm 项目,该项目基本上是关于解决推箱子谜语。现在,我们已经实现了 GUI 和算法来解决这个谜题,但连接似乎很棘手。例如,在 GUI 中,我选择“解决”,算法解决了谜题(在控制台中可见),但 GUI 不会更改为 InGame View (在调用solve() 之前初始化。如果我这样做//switchToRoboControl() 它将立即显示 InGame!)。 solve() 完成后它将切换到 InGame,这很不方便,因为它应该显示在 map 上移动并解决谜题的图标。

所以我真正的问题是:如何正确同步前端和后端,以便如果后端采取行动并通知前端,前端实际上会显示发生了什么。

此外,如果有人对此有任何想法,为什么 InGame 会在solve() 完成后出现,即使它之前已初始化且 isVisible() 返回 true?

如果有帮助的话,我可以发布代码,但是有数千行,所以我想也许解释问题并获得有助于我解决这个问题的提示就足够了......

谢谢!



public class SokobanGUIManager {
public SokobanGUIManager() {
this.display = new Display();

//initialsiere Shell
this.shell = new Shell(this.display);
shell.setText("Sokobots - The absolute best Sokoban-Solver you've ever seen!");
shell.setSize(735, 460);

//initialisiere Stack-Layout
this.layout = new StackLayout();
shell.setLayout(layout);
shell.layout();

//öffne Main-Menü;
goToMainMenu();

//Starte Fenster
this.shell.open();

//Lebensschleife
while (!this.shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
}
}

public class InGameGUI extends Composite {
...
public void initRoboControl() {
this.roboControl = new RoboControlGUI(this, manager, map, map.twoRobos(), this, this.roboStream); //RoboControlGUI is a child-Composite of InGameGUI
this.roboControl.setLayoutData(new RowData(300, 400));
this.layout();
this.guiCoordinator.setRoboControl(this.roboControl);
this.guiCoordinator.switchToRoboControl();
}
...
}

public class GUICoordinator {
...
protected void switchToRoboControl() {
if(this.roboControl != null) {
this.roboControl.setVisible(true);
System.out.println("RoboControl is visible");
this.roboCoordinator.switchToRoboControl();

} else {
System.out.println("Epic fail");
}
}
...
}

public class RoboCoordinator {
public void switchToRoboControl() { //TODO
this.gui.addToStreamEnd("switched to automatic control");
this.gui.deleteFirstLine();
this.gui.addToStreamEnd("the robots are calculating a solution. please wait");
try{ Thread.sleep(5000); } catch(Exception e) {}

this.map.setSolution(new Solution("1u:1l:1r:1d"));
this.gui.deleteFirstLine();
this.gui.deleteFirstLine();

this.gui.addToStreamEnd("robot 1 in direction u");
this.gui.addToStreamEnd("robot 1 in direction l");
this.gui.addToStreamEnd("robot 1 in direction r");
this.gui.addToStreamEnd("robot 1 in direction d");

try{ Thread.sleep(2000); } catch (Exception e) {}

this.map.moveRobo(1, 'u');
this.gui.updateMoves();
this.gui.updateSurface();
this.gui.deleteFirstLine();
System.out.println(this.map.toString());

System.out.println("Erster Zug fertig!");

try{ Thread.sleep(2000); } catch (Exception e) {}

this.map.moveRobo(1, 'l');
this.gui.updateMoves();
this.gui.updateSurface();
this.gui.deleteFirstLine();
System.out.println(this.map.toString());

System.out.println("Zweiter Zug fertig!");

try{ Thread.sleep(2000); } catch (Exception e) {}

this.map.moveRobo(1, 'r');
this.gui.updateMoves();
this.gui.updateSurface();
this.gui.deleteFirstLine();
System.out.println(this.map.toString());

try{ Thread.sleep(2000); } catch (Exception e) {}

this.map.moveRobo(1, 'd');
this.gui.updateMoves();
this.gui.updateSurface();
this.gui.deleteFirstLine();
System.out.println(this.map.toString());

}
}

(最后一部分是集成测试的模拟,稍后将被真正的方法调用(如“getSolution()”等)取代......这就是解决方案在代码中实现的原因。)

最佳答案

嗯,据我所知,你的问题是计算逻辑与 GUI 在同一线程中运行。这会导致计算期间没有更新。您需要将计算放在后台线程中。另外,您的 Thread.sleep() 将导致 GUI 不执行任何操作。

因此,请输入您的计算结果,例如在可运行中。

Runnable runnable = new Runnable(Display display) {
... some methods ...
@Override run() {
... your logic ...
display.asyncExec(new Runnable() {
run() {
// update your gui here
});
... some more logic ...
};

Display.asyncExec 会将您的更改转发到 gui 并立即返回到调用方法。当显示线程有时间时,UI 将被更新。

关于java - 在 Java(和 SWT)中同步 "Frontend"和 "Backend",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24840762/

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