ما هي أفضل طريقة للتعامل مع السياقات AWT الرسومات؟

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

  •  03-07-2019
  •  | 
  •  

سؤال

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

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

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

ما أود أن أعرفه هو أفضل وسيلة للتعامل مع السياقات الرسومات، وخاصة في سياق paintComponent (). أرى الكثير من ...

public void paintComponent( Graphics g ) {
    super.paintComponent( g );
    Graphics2D gfx = (Graphics2D)g;
    // ...Whole lotta drawing code...
}

هل ممارسة أفضل للقيام بذلك؟

public void paintComponent( Graphics g ) {
    super.paintComponent( g );
    Graphics2D gfx = (Graphics2D)g.create();
    // ...Whole lotta drawing code...
    gfx.dispose();
}

إذا المعلمة ز سوف يتم استخدامها في الدهانات أخرى ثم لا أحتاج لإعادته إلى حالة جيدة، التراجع عن AffineTransforms، الخ.؟

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

المحلول

ووفقا لعملاء قذر ريتش، يجب أن لا تغيير الكائن Graphics مرت عليك (التي تمتص باعتبارها API، IMO).

والطريقة الصحيحة للتعامل مع ذلك هي أكثر بقليل مطول:

public void paintComponent(Graphics g1) {
    super.paintComponent(g1);
    final Graphics2D g = (Graphics2D)g1.create();
    try {
         // ...Whole lotta drawing code...
    } finally {
         g.dispose();
    }
}

وIIRC، في تنفيذ الشمس لا يهم إذا كنت لا تتخلص من الأشياء "شبه الرسومات". (لا اقتبس لي على ذلك.)

وقد ترغب في تفويض هذا التعليق قليلا إلى كائن آخر.

نصائح أخرى

وسمعت أن هذا قد تم إصلاحها في جدك-إصدار 1.6.12، ولكن لم يحاول ذلك.

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