在GUI颜色上显示2D数组内容

时间:2014-01-26 01:56:30

标签: java model-view-controller simulation multidimensional-array agent-based-modeling

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

我很熟悉创建简单的GUI,但我如何创建一个窗格\面板然后添加到GUI。它在运行时显示2D数组,每个对象具有相应的颜色。此外,我想尝试使用MVC模式基本上以不同方式显示模拟数据。例如,一个窗格显示不同的对象颜色,另一个窗格显示相同的对象,但每个对象生气级别具有不同的红色阴影。任何指南对类似的教程都非常有帮助。

谢谢

3 个答案:

答案 0 :(得分:1)

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

如果事件太多,您可能需要定期处理它们,根据一些对您有意义的刷新率。

答案 1 :(得分:1)

您可以使用像awt和swing这样的GUI API(例如在Java 2D game graphics处查看)来创建画布,您可以在其上绘制系统的表示。例如,一组圆和边,如果圆被填充,那里有一个代理,您可以将鼠标悬停在它上面或单击它,另一个面板显示代理的一些相关属性。也许一个圆圈中的箭头表示代理人下一步要去的地方。

你可以实例化一个画布(比如java.awt.canvas),它适合你的GUI,因为任何其他小部件(面板组合框等)它有一个大小你可以添加滚动条等。与其他控件如组合相反框中,画布是一个2d区域,您可以在其上绘制任何内容。

MVC是一种设计结构,可以根据视图,控件和模型轴分离应用程序问题。您可以将所有控制逻辑(例如用户输入处理,数据库连接处理,网络操作)放在画布类事件处理方法中的所有位置,在MVC中,您可以将所有控制逻辑与画布,画布事件处理程序分开。只会调用apprpriate控制器方法(例如handleNewFile)。反过来,控制器查询模型并告诉视图显示什么(例如,它遍历模型中的所有代理,并且#34;将代理添加到视图中。视图是您决定如何表示代理控制器没有任何表示。

答案 2 :(得分:1)

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

在新类的构造函数中传递对2D-Array的引用。

在覆盖的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);
        }
    }
}