سؤال

لقد أنشأت فئة Jbutton مخصصة لتمثيل المساحات على لوحة الاحتكار. اللعبة متعددة اللاعبين ، لذا يتم الاحتفاظ بالكثير من المعلومات اللازمة لرسم الزر على الخادم (يمكن الوصول إليه عبر RMI).

مشكلتي هي أنه عندما أقوم بالماوس فوق الزر ، يبدو أنه يطلق تلقائيًا على إعادة الرسم () (ويسحب الحدود). هذا يجعل البرنامج بطيئًا للغاية لأنه يضطر إلى سحب البيانات من الخادم في كل مرة يكون فيها الماوس فوق أحد المساحات.

لقد كنت أحاول إيجاد طريقة لإيقاف حدوث هذا ، لكن يبدو أن كل شخص آخر على الإنترنت يواجهون مشكلة في الحصول على الزر لإعادة الشوط () بدلاً من إيقافه.

هل يعرف أي شخص طريقة يمكنني تجاوزها أو خاصية يمكنني تغييرها لإيقاف حدوث هذا؟

هل كانت مفيدة؟

المحلول

أود أن أقترح أن يعيد النظر في التصميم الخاص بك. أعترف أنني لا أعرف كل العوامل التي تلعبها ، لكن من وصفك ، أعتقد أن حالة اللوحة لا تتغير كثيرًا ، لذلك لا ينبغي أن يكون هناك سبب للاتصال بالخادم مع كل محاولة للطلاء. بدلاً من ذلك ، إذا كان الخادم الخاص بك لبث أحداث اللعبة إلى العميل ، سيكون لديك الحالة التي تحتاجها محليًا عندما تكون repaint يتم إجراء المكالمات.

أيضًا ، من وصفك ، يبدو الأمر كما لو أنه يمكنك الاتصال بالخادم من داخلك repaint رمز ، الناجم عن أحداث الماوس. هذا جيد جدا يمكن أن يتم في EDT. يجب ألا تجري مكالمات الخادم في موضوع اللوحة الخاص بك ، لأنه سيؤدي إلى إبطاء بقية واجهة المستخدم الرسومية. يجب إجراء مكالمات طويلة المدى في موضوع عامل. ألق نظرة على Swingworker و المفاهيم حول الخيوط في التأرجح لمزيد من التفاصيل.

ومع ذلك ، لا أعتقد أن العبث مع منطق إعادة الطلاء سيكون أفضل مسار للعمل. إن توفير الزر الخاص بك مع ما يحتاجه لجعل نفسه هو خطوة أفضل.

نصائح أخرى

لا ينبغي أبدًا أن تكون هناك حسابات كبيرة في أساليب REPAINT () (و PANT ()) لمكونات التأرجح الخاصة بك ، ناهيك عن مكالمات الخادم ...

طوابير يمكنك ، ولكن ليس مباشرة إلى الأمام.

كل ما تحاول أن ترسمه على jbutton ، اجعلها تفريغ في حدوث مخزن مؤقت. يجب أن يعيد الطلاء () من JButton بشكل أساسي صورة مخزنة. تعتبر BufferedImages سريعة جدًا أثناء إعادة الطلاء ، فهي مجرد مصفوفة من وحدات البكسل وستستغرق وقتًا بين إعادة الطلاء.

package test;

import java.awt.Graphics;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ButtonTest {
    public static void main(String[] args){
        new ButtonTest().test();
    }

    public void test(){
        JFrame frame = new JFrame("TestFrame");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel pnl = new JPanel();
        pnl.add(new MyButton());
        frame.add(pnl);
        frame.setSize(600, 600);
        frame.setVisible(true);
    }

    class MyButton extends JButton{
        public void paint(Graphics g){
            //return a buffered image everytime
        }
    }
}

على الرغم من أن التقنية المذكورة أعلاه تبدو غبية بعض الشيء ، إلا أنه يمكنك بشكل أساسي الحصول على صورة مخزنة واحدة في الذاكرة وينبغي إرجاعها من طريقة Paint (). وأيًا كانت الأشياء التي تتلقاها من الخادم (RMI) يمكن إلقاؤها في كائن BufferedImage باستخدام مؤشر ترابط منفصل يعمل في الخلفية.

هل حاولت تعطيل لوحة حدود التركيز؟ ألق نظرة على وثائق JButton API للتفاصيل.

أيضًا ، يمكنك محاولة التخزين المؤقت للبيانات المعروضة على الزر. وهل زر مناسب حقًا لما تحاول القيام به؟ تذكر أن المستخدمين يتوقعون أن تتفاعل عناصر واجهة المستخدم الرسومية المعروفة بطريقة محددة للغاية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top