簡體   English   中英

如何在更改的文本上動態更新 JLabel?

[英]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 類(注意:此實現假定equalshashCode是在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM