質問

私は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をマーキングないための十分な理由を持っていることを前提としています。したがって、そのnumOfPlayerswhileループの前に宣言されます。

この仮定がなければ、私は追加の変数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");
    }
});

(この例の目的のために、私はなぜローカルに、最終的な一時変数が動作しませんスコープを使用して、正当な理由があると仮定しています。私は正直にかかわらず、その制限のために何らかの理由を考えることはできません。)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top