java - 如何在更改的文本上动态更新 JLabel?
问题描述
我的 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())
}
}
现在你的分配器类应该充当 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);
推荐阅读
- javascript - 使用Javascript / Jquery根据数组中的键值计算记录数
- c# - Selenium Click 不起作用 - Chrome 驱动程序 - 版本 73.0.3683.68
- command-line-interface - 通过cli模式登录pcf后如何获取pcf空间中所有正在运行的应用程序的详细信息
- regex - 提取数字的正则表达式出现在字符串中的第 36 个字符之后
- forms - 带有实体的 Symfony 表单
- javascript - 仅在用户单击按钮时触发 Google 登录功能
- reactjs - reactjs - 处理自定义 404 页面
- python - 如何在 Windows 中的 Python 中将 CPU 保存在特定的无限循环中
- javascript - :: moment() :: jQuery 转换并比较输入的值与给定的日期
- wordpress - #wordpress。如何在数组中存储与数据库中的 $postid => $metavalue 相同的元键值