[英]How to dynamically update JLabel on changed text?
我的 JLabel 以一個在繪制 JLabel 時為 0 的變量開始。 另一個線程不斷增加這個值,我想更新標簽。
如果可能的話,我不希望線程訪問標簽。 (gm.getPlayerByListIndex(index).getAlk()) 得到更新
createPlayer.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
boolean checked = checkInputs(nameInput, difficultyInput);
if (checked) {
String playername = getInput(nameInput);
addPlayerToMainWindow(gm.getRegisteredPlayers().size(), playername);
gm.createPlayer(playername, Integer.parseInt(getInput(difficultyInput)));
dialog.dispose();
JLabel alkLabel = new JLabel(Integer.toString(gm.getPlayerByListIndex(index).getAlk()));
window.getWindow().getContentPane().add(alkLabel);
alkLabel.setVisible(true);
alkLabel.setBounds(160, (120 * index) + 50, 100, 50);
}
}
});
增加價值的線程:
public class Dispenser extends Thread {
List<Player> players = GameManager.getInstance().getRegisteredPlayers();
public void run() {
while (true) {
System.out.println("alive");
try {
for (Player p : players) {
p.setAlk(p.getAlk() + p.getDifficulty()); // TODO too hard
}
} 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();
}
}
}
}
在這種情況下,您可以使用觀察者模式。
您將需要像這樣的 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())
}
}
現在你的 dispenser 類應該充當 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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.