Заменить определенный элемент GUI динамически - PullRequest
2 голосов
/ 26 декабря 2011

Я создаю игру, в которой каждый игрок заполняет сетку 3х3, и у каждого из них свое состояние сетки (у объекта игрока есть переменная экземпляра в виде сетки, и сетка состоит из множества JPanel с).

У меня JList игроков слева и справа отображается сетка.Есть ли способ динамически изменять сетку, когда я нажимаю на имя игрока в списке?

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

РЕДАКТИРОВАТЬ: Кроме того, я думал об измененииссылка на объект динамически и обновляет пользовательский интерфейс, однако у меня есть некоторые события действия, которые заставляют меня сделать переменные FINAL.Поэтому я тоже не могу этого сделать.

Ответы [ 4 ]

3 голосов
/ 26 декабря 2011

Вы можете разместить 9 панелей с CardLayout и поменять местами соответствующие карты. Или вы можете удалить старый компонент и добавить новый, вместо этого вызывая revalidate() и repaint() после добавления.

3 голосов
/ 26 декабря 2011

Вы не должны менять сетку при изменении выбора.Вы должны изменить данные, отображаемые сеткой (то есть модель данных сетки).Например, предположим, что сетка представляет собой панель, содержащую 9 меток, каждая из которых отображает один элемент из String[][].Ваш Grid объект должен иметь setModel(String[][] data), который изменяет значение каждой метки в сетке.

Каждый раз, когда изменяется выбор игрока, вы должны спросить выбранного игрока о его данных и вызвать setData() в сетке.Если данные проигрывателя могут изменяться во время удаления, вы также должны вызывать setData () каждый раз, когда они изменяются.Это можно сделать, вызвав PropertyChangeEvent с помощью Player при изменении своих данных, и слушателя, который обновляет сетку новыми данными, если игрок, инициирующий событие, выбранный игрок.

1 голос
/ 26 декабря 2011

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

Что-то вродеthis:

public static void main(String... args)
{
  // Used to schedule a job for event-dispatcher thread
  SwingUtilites.invokeLater(new RUnnable()
   {
     public void run()
     {
        // put your code for creating and displaying the GUI here.
        // or call the method which is creating and displaying the GUI here.
     }
   }
  );
}

Чтобы внести изменения, просто используйте методы revalidate () и repaint ().Это будет делать то, что вы пытаетесь достичь.Надеюсь, что это поможет.

С уважением

1 голос
/ 26 декабря 2011

Таким образом, в основном у вас есть список игроков, где выбранный игрок определяет, какая сетка отображается.Если бы вы использовали CardLayout для панели, содержащей сетку, вы можете попросить ее показать сетку, соответствующую определенному игроку, когда выбор будет обновлен.

Нет необходимости в специальных for -петлях,но просто вызовите метод CardLayout#show.

Полный учебник доступен с информацией о работе с CardLayouts

...