Изучите шаблон Model View Controller .Сохраните состояние игры и данные в модели и используйте наблюдателей или слушателей, чтобы уведомить компоненты пользовательского интерфейса об изменениях данных.
Например, если вы следуете тому, как реализован Swing, определите интерфейс слушателя следующим образом:
public interface PlayersListener {
void playerSaved(Player player);
}
Тогда вместо списка savePlayers у вас может быть класс Players
примерно так:
public class Players {
private List<PlayersListener> listeners = ...;
private List<Player> players = ...;
public void addPlayersListener(PlayersListener listener) {
if (!listeners.contains(listener)) {
listeners.add(listener);
}
}
public voi removePlayerListener(PlayerListener listener) {
listeners.remove(listener);
}
public voi savePlayer(Player player) {
players.add(player);
for (PlayerListener listener : listeners) {
listener.playerSaved(player);
}
Когда вы создаете новую панель, которая должна наблюдать за сохраненными игроками, вы можете просто передать экземпляр класса Players на панели в конструкторе:
controlButtonsPanel = new GameControlButtons(players);
..
gameDataPanel = new GameDataPanel(players);
А внутри конструктора просто зарегистрируйте панель в качестве слушателя players
.
Таким образом, когда что-то спасает игрока, независимо от того, какой это компонент / класс, все заинтересованные стороны будут уведомлены об изменениях.И обязательно передайте в один и тот же экземпляр Players
всем панелям.
Это на самом деле так же работают компоненты Swing, если вы посмотрите, например, на JPanel, он имеет несколько разныхметоды addSomethingListener.Слушатели - это классы, которые реализуют определенный интерфейс слушателя.И модели взаимозаменяемы во многих компонентах, например, JTable использует TableModel, которая, в свою очередь, также определяется как интерфейс.Однако в вашем случае вам, вероятно, не нужно использовать различные реализации моделей.