كيف يمكنني رسم شيء على jPanel التي لن يتم طلاؤها؟

StackOverflow https://stackoverflow.com/questions/275778

  •  07-07-2019
  •  | 
  •  

سؤال

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

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

المحلول

وأنا لست متأكد من أنك تريد فعلا الطريق للم يتم طلاؤها - إعادة رسم الأحداث النار (على سبيل المثال) عند تغيير حجم نافذة، أو عندما يصبح مرئيا يلي نافذة أخرى عرقلة ذلك. إذا لوحة الخاص بك أبدا يعيد طلاء ثم انها سوف تبدو غريبة.

وبقدر ما أتذكر، سوينغ سوف إطلاق فقط الأحداث الطلاء المناسبة لهذه الظروف، لذلك يجب عليك أن تكون على ما يرام وفقا للطريقة المعتادة JPanel إن شاء subclasses ترث مع تجاوز مناسب:

public class RoadPanel extends JPanel {

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        // your drawing code here
    }
}

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

نصائح أخرى

لمعرفتي، لا، ما لم يكن هناك خدعة مع تراكب شفافة.

ومعظم التطبيقات الرسومية رأيت (وفعل) مجرد إعادة رسم لوحة كاملة على كل إعادة رسم. الآن، يمكنك أن تفعل ذلك مرة واحدة، في منطقة عازلة الجرافيكي، وبعد ذلك فقط رسم الخلفية كلها في وقت واحد، وبسرعة، عن طريق نسخ المخزن المؤقت الرسم إلى JPanel. وينبغي أن يكون أسرع من استدعاء جميع الأوليات رسومية لرسم الطريق.

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

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

// Field that stores the image so it is always accessible
private Image roadImage = null;
// ...
// ...
// Override paintComponent Method
public void paintComponent(Graphics g){

  if (roadImage == null) {
      // Create the road image if it doesn't exist
      roadImage = createImage(width, height);
      // draw the roads to the image
      Graphics roadG = roadImage.getGraphics();
      // Use roadG like you would any other graphics
      // object to draw the roads to an image
  } else {
      // If the buffer image exists, you just need to draw it.
      // Draw the road buffer image
      g.drawImage(roadImage, 0, 0, null);
  }
  // Draw everything else ...
  // g.draw...
}

وماذا أفعل يتم تعيين قيمة منطقية أم لا جزء معين يحتاج إلى إعادة رسم. ثم، في طريقة paintComponent() يمكنني التحقق من قيمة وإعادة رسم شيء معين، أو لا.

protected void paintComponent(Graphics g){
    super.paintComponent(g);
    if (drawRoad) {
        drawRoadMethod(g);
    }
    drawTheRest(g);
}

وكندة من هذا القبيل.

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