代码之家  ›  专栏  ›  技术社区  ›  Logan Serman

向事件调度线程传递变量

  •  5
  • Logan Serman  · 技术社区  · 17 年前

    我的GUI锁定,因为我需要通过EDT更新它,但是,我还需要通过GUI传递一个正在更新的变量:

    while ((message = this.in.readLine()).startsWith("NUMPLAYERS"))
    {
        numOfPlayers = Integer.parseInt(message.split(":")[1]);
        numPlayers.setText("There are currently " + numOfPlayers + " players in this game");
    }
    

    这不起作用。我需要在EDT中设置文本,但如果不声明它是最终版本,我就无法将numofplayers传递给它(我不想这样做,因为它随着新玩家加入服务器而改变)。

    4 回复  |  直到 10 年前
        1
  •  10
  •   Michael Myers KitsuneYMG    17 年前

    最简单的解决方案是使用 final 临时变量:

    final int currentNumOfPlayers = numOfPlayers;
    EventQueue.invokeLater(new Runnable() {
        public void run() {
           numPlayers.setText("There are currently " + 
                   currentNumOfPlayers + " players in this game");
        }
    });
    
        2
  •  2
  •   Steve Kuo    17 年前

    你必须最终决定还是 Runnable 引用字段(类变量)。如果引用一个字段,请确保它是线程安全的(通过同步或易失性)。

        3
  •  1
  •   Eddie    17 年前

    这个怎么样?

    while ((message = this.in.readLine()).startsWith("NUMPLAYERS")) {
        numOfPlayers = Integer.parseInt(message.split(":")[1]);
        final newText = "There are currently " + numOfPlayers + " players in this game";
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                numPlayers.setText(newText);
            }
        });
    }
    

    注:我认为OP有充分的理由不作标记。 numOfPlayers 最后,可能在以后的同一个 while 循环输入与问题无关的代码,因此未显示。因此 数字播放器 在 虽然 循环。

    如果没有这个假设,我不会使附加变量 newText .

        4
  •  0
  •   jsight TaherT    17 年前

    在方法之外定义此类:

    public abstract class MyRunnable implements Runnable {
        protected int var;
        public MyRunnable (int var) {
            this.var = var;
        }
    }
    
    Now your code can look like this:
    SwingUtilities.invokeAndWait(new MyRunnable(5) {
        @Override
        public void run() {
            //numPlayers.setText("There are currently " + var + " players in this game");
        }
    });
    

    (在本例中,我假设有一个很好的理由可以解释为什么使用局部范围的最终临时变量不起作用。不过,老实说,我想不出任何理由来限制这种限制。)