jPanel的同步

时间:2017-06-30 21:35:54

标签: java swing synchronization jpanel paint

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

通过跟踪IR点,无人机作为群体飞行。

每个群组成员类扩展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()延迟读取每个跟随无人机。安排但没有成功。如何同步它才能正常工作?

1 个答案:

答案 0 :(得分:2)

  

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

这是一个问题。不要这样做。不要让你的精灵延伸到比必要的“更重的”级别,这不必要地使你的程序复杂化。相反,你的Sprites是非组件类,即不扩展任何Swing或AWT组件类型,而是在一个绘制JPanel中绘制它们的paintComponent方法已被覆盖且其super.paintComponent(g)具有被称为。

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

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