Прежде всего, примите мои извинения, если этот вопрос является основным, я в основном знаю C #, но вынужден использовать Java для этого конкретного проекта!
Я пытаюсь реализовать графический интерфейс для отображения сетки занятости на основе данных датчика робота. Сетка занятости будет довольно большой, возможно, до 1500x1500 квадратов сетки, представляющих реальную площадь около 10 см2 на ячейку сетки.
Каждый квадрат сетки будет просто хранить статус Enumerable, например:
- Неизвестно
- Незанятые
- Занято
- Robot
Я просто хотел бы найти лучший способ визуализировать это как сетку, используя разные цветные квадраты, чтобы изобразить различный статус ячейки сетки '.
Я реализовал наивный, базовый алгоритм рисования квадратов и линий сетки, однако он ОЧЕНЬ плохо работает на больших сетках занятости. Другой код в классе перерисовывает окно каждые 0,5 с, когда собираются новые данные датчика. Я подозреваю, что причиной очень низкой производительности является тот факт, что я КАЖДУЮ раздачу КАЖДУЮ ячейку. Есть ли простой способ, которым я могу выборочно визуализировать эти ячейки, должен ли я обернуть каждую ячейку в наблюдаемый класс?
Моя текущая реализация:
@Override
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
int width = getSize().width;
int height = getSize().height;
int rowHeight = height / (rows);
int colWidth = width / (columns);
//Draw Squares
for (int row = 0; row < rows; row++) {
for (int col = 0; col < columns; col++) {
switch (this.grid[row][col]) {
case Unexplored:
g.setColor(Color.LIGHT_GRAY);
break;
case Empty:
g.setColor(Color.WHITE);
break;
case Occupied:
g.setColor(Color.BLACK);
break;
case Robot:
g.setColor(Color.RED);
break;
}
g.drawRect(col * colWidth, height - ((row + 1) * rowHeight), colWidth, rowHeight);
g.fillRect(col * colWidth, height - ((row + 1) * rowHeight), colWidth, rowHeight);
}
}
int k;
if (outline) {
g.setColor(Color.black);
for (k = 0; k < rows; k++) {
g.drawLine(0, k * rowHeight, width, k * rowHeight);
}
for (k = 0; k < columns; k++) {
g.drawLine(k * colWidth, 0, k * colWidth, height);
}
}
}
private void setRefresh() {
Action updateUI = new AbstractAction() {
boolean shouldDraw = false;
public void actionPerformed(ActionEvent e) {
repaint();
}
};
new Timer(updateRate, updateUI).start();
}
Пожалуйста, помогите! Заранее спасибо.