Перекраска / обновление JLabels на JPanel - PullRequest
1 голос
/ 02 апреля 2011

У меня проблемы с получением JLabels в двумерном массиве для обновления во время выполнения.

Программа, над которой я работаю, является вариантом Connect Four.Я создаю 2D-массив JLabels, который по умолчанию использует ImageIcon, содержащий изображение пустого слота.Игроки 1 и 2 выбирают свои цвета, и на ходу игрок может щелкнуть, чтобы бросить фигуру в столб (гравитация заставляет фигуру упасть на дно или пока она не упадет на другую фигуру).

IЯ довольно уверен, что мой метод addToColumn работает нормально.Моя единственная проблема в том, что я не могу заставить JLabels обновиться.Вот метод, над которым я работаю:

p1, p2 и current являются объектами Player.grid [] [] - это двумерный массив целых чисел, установленный в 0, 1 или 2, чтобы легче отслеживать, кому принадлежат какие плитки.tile [] [] - это мой 2D-массив JLabels.

public void addToColumn(int column) { // drop a tile in the specified column
int i = 0;
while (grid[column][5-i] != 0) i++; // move upward through the 6 rows of tiles
                                    // until we find an empty one
if (current == p1) grid[column][5-i] = 1; // update to the current player's value
else grid[column][5-i] = 2;

tiles[column][5-i] = new JLabel(findColorIcon(current.getColor()));

tiles[column][5-i].setIcon(findColorIcon(current.getColor()));

repaint();

теперь с этими двумя последними строками, меняющими JLabel в тайлах [] [], очевидно, мне не нужны оба, не знаю, какой путьлучше ... это лишь часть того, что я пробовал, но безрезультатно.(мой метод getColor () возвращает Color, а findColorIcon (Color c) возвращает соответствующий JLabel с этим цветом плитки).

и да, я также добавил в свой метод paintComponent:

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
}

Я застрял на этом некоторое время и чувствую, что упускаю что-то очевидное.какие-либо предложения?

1 Ответ

3 голосов
/ 02 апреля 2011

Я не вижу, чтобы ваш paintComponent() метод что-то делал.В частности, замена JLabel требует от вас validate() контейнера.В качестве альтернативы вы можете посмотреть, как эта простая игра использует шаблон Модель – Вид – Контроллер и рисует цветные значки.

Приложение: Это связано пример описывает, как заменить только Icon, а не весь JLabel.В отличие от этого пример показывает, как validate() контейнер после замены компонентов.

...