سؤال

أحب واجهة المستخدم الرسومية لأعلى لأنني بحاجة إلى تحديثه من خلال 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 متغير مؤقت:

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

نصائح أخرى

عليك أن تجعلها نهائية أو لديك Runnable مرجع حقل (فئة متنوعة). إذا تم الرجوع إلى حقل تأكد من أنه مؤكدة مؤشر ترابط (عبر مزامنة أو متقلبة).

وماذا عن هذا:

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

ملاحظة: أفترض أن البروتوكول الاختياري لديه سبب وجيه لعدم وضع علامة 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