В этом случае вы можете использовать шаблон наблюдателя .
Вам потребуется и класс Observer, такой как этот ( примечание: эта реализация предполагает, что equals
и hashCode
реализованы в классе Player
):
public class JLabelObserver{
private JLabel label;
private Player player;
public JLabelObserver(JLabel label, Player player){
this.label = label;
this.player = player;
}
public update(Player player){
if(this.player.equals(player))
label.setText(player.getAlk())
}
}
Теперь ваш класс диспенсера должен действовать как класс Obervable, так что вы Dispenser
будете выглядеть так:
public class Dispenser extends Thread {
List<Player> players = GameManager.getInstance().getRegisteredPlayers();
List<JLabelObserver> observers = new ArrayList<>();
public void run() {
while (true) {
System.out.println("alive");
try {
for (Player p : players) {
p.setAlk(p.getAlk() + p.getDifficulty()); // TODO too hard
notifyObservers(p)
}
} catch (ConcurrentModificationException e) {
System.out.println("playerlist in use, retry");
}
try {
sleep(1000); // TODO too short
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
public static addObserver(JLabelObserver observer){
observers.add(observer);
}
public static notifyObservers(Player player){
for(JLabelObserver observer : observers){
observer.update(player);
}
}
}
и, наконец, после создания JLabel вы также создаете и Observer:
JLabel alkLabel = new JLabel(Integer.toString(gm.getPlayerByListIndex(index).getAlk()));
JLabelObserver alkLabelObserver = new JLabelObserver(alkLabel, index);
Dispenser.addObserver(alkLabelObserver);