gpt4 book ai didi

java - jPanel 的同步

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

我尝试使用 Java Swing 模拟无人机群。

无人机通过跟踪红外点进行集群飞行。

每个群体成员类都扩展 jPanel 并重写绘制函数,其作用是根据领导者位置在其面板上绘制 IR 点

@Override
public void paint(Graphics g) {
super.paint(g);

for (int x = currX_1 - currIRdim; x < currX_1 + currIRdim; x++) {
for (int y = currY_1 - currIRdim; y < currY_1 + currIRdim; y++) {
g.setColor(Color.RED);
g.drawLine(x, y, x, y);
}
}

for (int x = currX_2 - currIRdim; x < currX_2 + currIRdim; x++) {
for (int y = currY_2 - currIRdim; y < currY_2 + currIRdim; y++) {
g.setColor(Color.RED);
g.drawLine(x, y, x, y);
}
}
}

集群首领和他旁边的无人机会在每次移动时更新以下成员的面板

private void updateFollowers(AgentIrPanel[] screensToUpdate, String command) {
int xdiff = screensToUpdate[0].getDiffX();
int dimdiff = screensToUpdate[0].getDiffDim();
switch (behaviour) {
case SWARM_LEADER:
screensToUpdate[0].setCurrX_1(screensToUpdate[0].getCurrX_1() + xdiff);
screensToUpdate[0].setCurrX_2(screensToUpdate[0].getCurrX_2() + xdiff);
screensToUpdate[0].repaintPoints(); // call jpanel.repaint()

screensToUpdate[1].setCurrIRdim(screensToUpdate[1].getCurrIRdim() - dimdiff);
screensToUpdate[1].repaintPoints();
break;
case FOLLOW_LEFT:
screensToUpdate[0].setCurrIRdim(screensToUpdate[0].getCurrIRdim() - dimdiff);
screensToUpdate[0].repaintPoints();
}
}

以下成员在他们的面板上获得 2 个 IR 点,并通过认识到与之前点的差异,决定他们应该移动的方向

private String secRowReading() {
BufferedImage img = new BufferedImage(300, 300, BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = img.createGraphics();
this.paint(g2);

if ((new Color(img.getRGB(X_1 - IRdim ,Y_1 - IRdim)).equals(Color.BLACK))
&& (new Color(img.getRGB(X_2 - IRdim ,Y_2 - IRdim)).equals(Color.BLACK))
&& (new Color(img.getRGB(X_1 - IRdim + diffX, Y_1 - IRdim)).equals(Color.RED))
&& (new Color(img.getRGB(X_2 - IRdim + diffX, Y_1 - IRdim)).equals(Color.RED))){
ans = "right";
}else if ((new Color(img.getRGB(X_1 - IRdim ,Y_1 - IRdim)).equals(Color.BLACK))
&& (new Color(img.getRGB(X_2 - IRdim ,Y_2 - IRdim)).equals(Color.BLACK))
&& (new Color(img.getRGB(X_1 - IRdim - diffX, Y_1 - IRdim)).equals(Color.RED))
&& (new Color(img.getRGB(X_2 - IRdim - diffX, Y_1 - IRdim)).equals(Color.RED))){
ans = "left";
}else if ((new Color(img.getRGB(X_1 - IRdim ,Y_1 - IRdim)).equals(Color.BLACK))
&& (new Color(img.getRGB(X_2 - IRdim,Y_2 - IRdim)).equals(Color.BLACK))
&& (new Color(img.getRGB(X_1 - IRdim + diffDim ,Y_1 - IRdim + diffDim)).equals(Color.RED))
&& (new Color(img.getRGB(X_2 - IRdim + diffDim ,Y_2 - IRdim + diffDim)).equals(Color.RED))) {
ans = "front";
}else if ((new Color(img.getRGB(X_1 - IRdim - diffDim,Y_1 - IRdim -diffDim)).equals(Color.RED))
&& (new Color(img.getRGB(X_2 - IRdim - diffDim,Y_2 - IRdim -diffDim)).equals(Color.RED))){
ans = "back";
}else {
ans = "stop";
}

g2.dispose();
return ans;
}

问题是 - 以下无人机不能一起成功读取,只有当它们单独操作时。在飞行过程中,其中一名追随者没有及时识别领导者对其进行的更改并停止,这扰乱了整个飞行。

我尝试使用 Timer().schedule 延迟每个跟随无人机的读取,但没有成功。如何同步才能正常工作?

最佳答案

Every swarm member class extend jPanel and override paint function whose role is to paint IR points on its panel according to leaders position

这里有一个问题。不要这样做。不要让您的 Sprite 扩展不必要的“重量级”类,这会不必要地使您的程序复杂化。相反,让您的 Sprite 成为非组件类,即不扩展任何 Swing 或 AWT 组件类型,而是在一个绘图 JPanel 中绘制它们,该 JPanel 的 PaintComponent 方法已被重写,并且其 super.paintComponent(g)已被调用。

我会给Swarm类一个public void draw(Graphics2D g2)方法,创建它们的集合,也许 List<Swarm> ,然后在paintComponent方法中,迭代列表,传入从JVM获取的Graphics2D对象,绘制每个sprite/swarm对象。

其他问题:请务必从 GUI 代码中提取 Swarm 对象的行为和逻辑。逻辑代码应该是程序模型的一部分,而不是 View (GUI)的一部分, View 的作用是显示模型的状态,并允许用户与模型交互(通过 Controller )。

关于java - jPanel 的同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44855118/

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