イベントディスパッチスレッドに変数を渡します
-
09-09-2019 - |
質問
私はEDTを通してそれを更新する必要があるため、
私のGUIが固まっ、しかし、私はまた、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
一時変数を使用することです
final int currentNumOfPlayers = numOfPlayers;
EventQueue.invokeLater(new Runnable() {
public void run() {
numPlayers.setText("There are currently " +
currentNumOfPlayers + " players in this game");
}
});
他のヒント
あなたはそれが最終的に作るかRunnable
参照フィールド(クラスvarable)を持っている必要があります。フィールドを参照する場合(同期または揮発性を経由して)それはスレッドセーフだことを確認してください。
これはどうます:
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
をマーキングないための十分な理由を持っていることを前提としています。したがって、そのnumOfPlayers
がwhile
ループの前に宣言されます。
newText
をすることはないだろう。
あなたの方法の外に、このクラスを定義します:
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");
}
});
(この例の目的のために、私はなぜローカルに、最終的な一時変数が動作しませんスコープを使用して、正当な理由があると仮定しています。私は正直にかかわらず、その制限のために何らかの理由を考えることはできません。)
所属していません StackOverflow