1

Я занимаюсь созданием программы моделирования баз данных. До сих пор у меня есть относительные классы для моделирования симулятора, сетки, разных агентов и т. Д. Я также создал 2D-массив объекта, например. агенты, перемещающиеся по массиву, делают что угодно.Отображение содержимого 2D-массива в цветах графического интерфейса

Я знаком с созданием простого графического интерфейса, но как я могу создать панель/панель, которая затем добавляется в графический интерфейс. который показывает 2D-массив во время выполнения с каждым объектом с соответствующим цветом. Также я хочу попробовать и использовать шаблон MVC для отображения данных моделирования по-разному. Например, на одной панели отображается цвет разных объектов, а на другой панели показаны одни и те же объекты, но у всех объектов разгневаны уровни с разными оттенками красного. Любые рекомендации будут действительно полезными и аналогичными учебниками.

Благодаря

ответ

1

Я бы создать очередь (JMS для очень большого списка агентов, но есть некоторые реализации очереди в памяти, которые быстрее использовать) и позволили бы всем вашим агентам, чтобы написать свои состояния там. Затем в другой стороне я бы написал потребителя, который слушает очередь, чтобы эти состояния обрабатывались вашим графическим интерфейсом по мере их поступления.

Если событий слишком много, вы можете обрабатывать их периодически, в соответствии с некоторой частотой обновления, которая имеет смысл для вас.

+0

Любой пример пожалуйста? Потребитель мог бы быть методом внутри класса агента или отдельного класса самостоятельно? – user3112844

+0

, если ваши агенты вписываются в какую-либо коллекцию памяти, пожалуйста, проигнорируйте мой ответ. См. Ответ @dakkaron. Я бы только улучшил его решение немного, не устанавливая только 4 цвета, но вместо этого используя более широкую цветовую палитру. Но я думаю, что он все это сказал. – Leo

1

Вы можете использовать API-интерфейс GUI, такой как awt и swing (смотрите, например, Java 2D game graphics), чтобы создать холст, на котором вы могли бы представить представление вашей системы. Например, набор кругов и ребер, если круг заполнен, там есть агент, вы можете навести на него курсор мыши и щелкнуть по нему, а на другой панели - некоторые соответствующие свойства агента. Возможно, стрелка из заполненного круга указывает, куда агент собирается идти дальше.

Вы можете создать экземпляр холста (например, java.awt.canvas), он вписывается в ваш графический интерфейс, как и любой другой виджет (панель со списком панелей и т. Д.), Имеет ли он размер, который можно добавить полосы прокрутки и т. Д. В отличие от других элементов управления, таких как combo box, холст - это 2d-область, на которой вы рисуете все, что хотите.

MVC - это конструктивная структура, которая отделяет приложения от вида, управления, оси модели. Принимая во внимание, что вы можете поместить всю свою логику управления, такую ​​как обработка пользовательских входных данных, управление подключением к базе данных, сетевые операции, все, что может быть дон в одном месте в методах обработки событий класса canvas, в MVC вы должны отделить всю логику управления от обработчика canvas, canvas просто вызовет соответствующий метод контроллера (например, handleNewFile). В свою очередь, контроллер запрашивает модель и сообщает о представлении о том, что нужно показать (например, он перебирает все агенты в вашей модели и «добавляет» агента в представление. Представление - это то, где вы решаете, как представлять агенту контроллер ничего о . представление

+0

Так что в основном создать холст с соответствующей строкой, столбцами 2D-массива, будет ли холст компонентом, который входит в графический интерфейс? Также я могу включить это в шаблон MVC. – user3112844

+0

Расширенный ответ – Schollii

+0

Как работает мой симулятор, он выполняет итерацию через коллекции и вызывает метод act в агентах для эффективного перемещения по сетке (2D-массив) на один шаг. Как насчет частоты обновления рисунка холста? Я хочу рисовать графику на холсте когда-либо. 1 шаг моделирования завершен. Как мне добиться этого? – user3112844

1

Один из самых простых способов пойти, чтобы создать новый класс, который расширяет javax.swing.panel и переопределить paintComponent() -. метод

в конструкторе нового класса передать ссылку . ваш 2D-массив

В вашем перекрываться 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); 
     } 
    } 
} 
+0

Оператор switch появляется с ошибкой «Невозможно включить значение типа« Агент ». Разрешены только значения конвертируемых значений int, строк или переменных перечисления» – user3112844

+0

, тогда если ваш массив имеет агент, а если ваш агент имеет значение int, вы делаете переключатель Agent.getValue() – Leo

+0

Вы также можете заменить конструкцию case-switch if-elseifs. Я добавлю это к решению. – Dakkaron