1

エージェント ベースのモデリング プログラムを作成中です。これまでのところ、シミュレーター、グリッド、さまざまなエージェントなどをモデル化するための関連クラスがあります。オブジェクトの 2D 配列も作成しました。たとえば、エージェントが配列の周りを移動して何でもします。

私は単純な GUI の作成に慣れていますが、GUI に追加されるペイン\パネルを作成するにはどうすればよいですか。これは、実行時の 2D 配列を、各オブジェクトに対応する色で表示します。また、MVC パターンを使用して、基本的にシミュレーション データを別の方法で表示したいと考えています。あるペインには異なるオブジェクトの色が表示され、別のペインには同じオブジェクトが表示されますが、すべてのオブジェクトは異なる赤の色合いで怒っています。同様のチュートリアルでも、ガイドラインは非常に役立ちます。

ありがとう

4

3 に答える 3

1

キューを作成し (エージェントの非常に大きなリストには JMS を使用しますが、より高速に使用できるインメモリ キューの実装がいくつかあります)、すべてのエージェントがそこに状態を書き込むことができるようにします。それから別の側面では、キューをリッスンして、これらの状態が来ているときに GUI によって処理されるようにするコンシューマーを作成します。

イベントが多すぎる場合は、適切なリフレッシュ レートに従って定期的にバッチで処理することをお勧めします。

于 2014-01-26T02:32:16.497 に答える
1

簡単な方法の 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/elseif に置き換えます。

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 に答える