سؤال

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

Graphics g = this.getGraphics();
g.setColor(Color.blue);
g.fillRect(e.getX(), e.gety(), 40, 40);

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

كيف يمكنني استخدام g.fillRect() داخل الماوس المستمع أساليب وجعلها عصا ؟

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

المحلول

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

إليك كيفية إنشاء و رسم على صورة:
http://java.sun.com/docs/books/tutorial/2d/images/drawonimage.html

ثم في الطلاء الخاص بك طريقة استخدام الرسومات الخاصة بك' drawImage(...) طريقة لعرض الصورة التي قمت بإنشائها.

نصائح أخرى

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

وكنت قد حصلت على تجاوز العمل المستمع نافذة تغيير الحجم، وندعو <لأ href = "http://java.sun.com/docs/books/tutorial/uiswing/events/componentlistener.html" يختلط = "نوفولو noreferrer "> إعادة رسم داخل منه.

ووالرسومات هي مؤقتة. عندما يحصل منطقة قذرة، سيتم طلاؤها ذلك.

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

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