将变量传递给Event Dispatch Thread

时间:2009-04-15 21:53:17

标签: java multithreading event-dispatch-thread

我的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传递给它而不将其声明为final(我不想这样做,因为它随着新玩家加入服务器而改变)

4 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:2)

你必须让它成为最终或让Runnable引用一个字段(类varable)。如果引用一个字段,请确保它是线程安全的(通过synchronized或volatile)。

答案 2 :(得分:1)

这个怎么样:

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标记为final,也许稍后会在与问题无关的代码中的相同while循环中进行更改,因此没有显示。因此numOfPlayerswhile循环之前声明。

如果没有这个假设,我就不会制作额外的变量newText

答案 3 :(得分:0)

在方法之外定义此类:

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");
    }
});

(为了这个例子的目的,我假设有一个很好的理由为什么使用本地范围的最终临时变量将不起作用。但老实说,我真的想不出有任何理由限制这种限制。)