1

我正在创建一个基于代理的建模程序。到目前为止,我有相关的类来模拟模拟器、网格、不同的代理等。我还创建了一个 2D 对象数组,例如在数组周围移动的代理做任何事情。

我熟悉创建简单的 GUI,但我如何创建一个窗格\面板,然后将其添加到 GUI 中。它显示了运行时的二维数组,每个对象都有相应的颜色。另外我想尝试使用 MVC 模式来基本上以不同的方式显示模拟数据。例如,一个窗格显示不同的对象颜色,另一个窗格显示相同的对象,但每个对象的愤怒级别都具有不同的红色深浅。任何指南都会对类似的教程很有帮助。

谢谢

4

3 回答 3

1

我会创建一个队列(JMS 用于非常大的代理列表,但有一些内存队列实现使用起来更快),并允许您的所有代理在其中写入他们的状态。然后在另一方面,我会编写一个消费者来侦听队列,以便在这些状态到来时由您的 GUI 处理它们。

如果事件太多,您可能希望根据对您有意义的刷新率,定期分批处理它们。

于 2014-01-26T02:32:16.497 回答
1

您可以使用 awt 和 swing 之类的 GUI API(例如查看Java 2D 游戏图形)来创建一个画布,您可以在该画布上绘制系统的表示。例如,一组圆圈和边缘,如果圆圈被填充,则那里有一个代理,您可以将鼠标悬停在它上面或单击它,另一个面板会显示代理的一些相关属性。也许来自实心圆圈的箭头表示代理接下来要去的地方。

您可以实例化一个画布(如 java.awt.canvas),它可以像任何其他小部件(面板组合框等)一样适合您的 GUI,它是否具有可以添加滚动条等的大小。与组合框等其他控件相反,a画布是一个 2d 区域,您可以在其上绘制任何您想要的东西。

MVC 是一种设计结构,它沿视图、控制、模型轴分离应用程序关注点。虽然您可以将所有控制逻辑(例如用户输入处理、数据库连接处理、网络操作)都放在画布类事件处理方法中的一个位置,但在 MVC 中,您可以将所有控制逻辑与画布、画布事件处理程序分开只会调用适当的控制器方法(例如handleNewFile)。反过来,控制器查询模型并告诉视图要显示的内容(例如,它遍历模型中的所有代理并将代理“添加”到视图中。视图是您决定如何表示代理的地方,控制器与此无关表示。

于 2014-01-26T15:43:21.813 回答
1

一种更简单的方法是创建一个扩展 javax.swing.panel 并覆盖 paintComponent() 方法的新类。

在新类的构造函数中传递对二维数组的引用。

在您覆盖的 paintComponent() 方法中执行以下操作:

public void paintComponent(Graphics g) {
    for (int x=0;x<arrayWidth;x++) {
        for (int y=0;y<arrayHight;y++) {
            switch (array[x][y]) {
                case 1: g.setColor(Color.RED);break;
                case 2: g.setColor(Color.BLUE);break;
                case 3: g.setColor(Color.GREEN);break;
                case 4: g.setColor(Color.YELLOW);break;
            }
            g.drawRect(x*10,y*10,10,10);
        }
    }
}

只需根据您的需要调整数字和颜色即可。

编辑:如果您有某种不能在 switch 语句中使用的值(例如,旧 Java 版本中的自定义类或字符串),只需将其替换为 if/elseifs:

public void paintComponent(Graphics g) {
    for (int x=0;x<arrayWidth;x++) {
        for (int y=0;y<arrayHight;y++) {
            if (array[x][y].equals(value1)) {
                g.setColor(Color.RED);
            } else if (array[x][y].equals(value2)) {
                g.setColor(Color.BLUE);
            } else if (array[x][y].equals(value3)) {
                g.setColor(Color.GREEN);
            } else {
                g.setColor(Color.YELLOW);
            }
            g.drawRect(x*10,y*10,10,10);
        }
    }
}
于 2014-01-26T19:27:01.063 回答