문제

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 필드를 참조하십시오 (Class 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");
    }
});

(이 예제의 목적 상, 로컬로 스코핑 된 최종 임시 임시 변수를 사용하는 것이 효과가 없을만큼 충분한 이유가 있다고 가정합니다. 그러나 나는 그 제한에 대한 어떤 이유도 정직하게 생각할 수 없습니다.)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top