View Full Version : سوال: اشکال در متد paintComponen
yegane8
جمعه 05 خرداد 1391, 18:08 عصر
سلام
میخواستم بدونم تو کدی که گذاشتم
import java.awt.Graphics;
import javax.swing.JPanel;
public class DrawPanel extends JPanel{
public void paintComponent( Graphics g ){
super.paintComponent( g );
int width = getWidth(); // total width
int height = getHeight(); // total height
g.drawLine( 0, 0, width, height );
g.drawLine( 0, height, width, 0 );
}}
تو متد paintComponen چرا این متد رو نوشتیم و فقط اینطوری super.paintComponent( g );
صداش نکردیم چون این متد در ابن supperclass JPanel وجود داره دیگه؟ و چرا به اسم همون متدی که در supperclass JPanel وجود داره این متد رو نوشتیم؟
یه سوال دیگه : من اهمیت وراثت رو وقتی خودم یه کلاسی رو مینویسم میفهمم ولی وقتی که یه کلاسی رو import میکنم به برنامه نمیدونم چرا و چه جوری باید از وراثت استفاده کنم .
متشکرم
spiderman200700
جمعه 05 خرداد 1391, 18:33 عصر
سلام.
شما هین الآنم از ارث بری استفاده کردید. یعنی کلاس DrawPanel رو از JPanel مشتق کردید. این ارث بریه دیگه.
شما وقتی اینو نوشتی:
super.paintComponent( g );
یعنی صداش زدی.
در ضمن این متد در supperclass JPanel نیست. در خود JPanel وجود داره. یعنی در supperclass DrawJPanel هست.
yegane8
جمعه 05 خرداد 1391, 22:37 عصر
سلام.
شما هین الآنم از ارث بری استفاده کردید. یعنی کلاس DrawPanel رو از JPanel مشتق کردید. این ارث بریه دیگه.
شما وقتی اینو نوشتی:
super.paintComponent( g );
یعنی صداش زدی.
در ضمن این متد در supperclass JPanel نیست. در خود JPanel وجود داره. یعنی در supperclass DrawJPanel هست.
منظورم این بود که نمی دونم چرا jpanel رو new نکردیم مثلا :Panel = new JPanel(); و از متد paintComponent( g ) اینطوری استفاده نکردیم :paintComponent(g)
چه مزیتی داره؟ لطفا توضیح کامل دهید :گیج:
spiderman200700
شنبه 06 خرداد 1391, 01:16 صبح
شما وقتی از یه کلاس ارث بری میکنید. کلاستون تبدیل به نوع خاصی از کلاس پدر میشه.
مثلا کلاس مار از کلاس خزندگان ارث بری کرده. یعنی مار تبدیل به نوعی از خزندگان شده.
حالا در این برنامه کلاس DrawPanel از کلاس JPanel ارث بری کرده یعنی DrawPanel تبدیل به نوعی JPanel شده. و میتونیم ازش به عنوان JPanel استفاده کنیم.
کلمه ی کلیدیه super در جاوا دوتا کاربرد داره که یکیش برای صدا زندن یه متد در کلاس پدر هست.
در کلاس پدر یعنی همون کلاس JPanel یه متد به نام paintComponent وجود داره که اینطوری صدا زنده شده:
super.paintComponent( g );
حالا چون DrawPanel الآن دیکه خودش نوعی JPanel هست، دیگه لازم نیس بیایم از JPanel شی بسازیم. بلکه توی برنامه ای که قراره از JPanel استفاده کنه، از DrawPanel شی میسازیم.
حالا این کارا برای اینه که هر چیزی که دلمون بخواد روی JPanel رسم کنیم. مثلا میتونیم JPanel رو به یه برنامه ی نقاشی تبدیل کنیم.
یه نگاهی به این برنامه بنداز:
http://barnamenevis.org/showthread.php?343032-%D8%AF%D8%B3%D8%AA%D8%B1%D8%B3%DB%8C-%D8%A8%D9%87-%D9%BE%DB%8C%DA%A9%D8%B3%D9%84-%D9%87%D8%A7-%D8%AF%D8%B1-%D8%AC%D8%A7%D9%88%D8%A7&p=1512996&viewfull=1#post1512996
امیدوارم فهمیده باشی.
موفق باشی
yegane8
شنبه 06 خرداد 1391, 12:50 عصر
خیلی ممنون
دلیل خاصی داره که تو کلاس drawPanel متدی هم اسم متد paintComponent( g ) که تو کلاس پدر هست رو نوشتیم (خط 4 برنامه) و توی همون متد از کلاس drawPanel متد
super.paintComponent( g ); رو صدا کردیم؟
spiderman200700
شنبه 06 خرداد 1391, 14:11 عصر
ما با نوشتن متد paintComponent در کلاسDrawPanel ، در اصلا اونو Override کردیم. اگه بخوام خیلی خلاصه در مورد Override توضیح بدم اینه که ما بیایم یه متد رو در که در کلاس پدر وجود داره دوباره بنویسیم ولی برای کارا دیگه ای. ، که این یک از مفاهیم پلی مورفیزم یا چند ریختی هستن.
در اصل با Override کردن متد paintComponent ، ما متدی داریم که کار متد paintComponent موجود در کلاس پدر رو انجام میده به اضافه ی کارای اضافه ای که خودمون براش تعریف میکنیم. این کارای اضافه همون چیزاییه که قصد داریم روی JPanel رسم کنیم.
public void paintComponent( Graphics g ){
super.paintComponent( g ); // تمام قابلیت های متد، در کلاس پدر به این متد اضافه می شود
// از اینجا به پایین قابلیت های جدیدی است که ما به متد اضافه کردیم
int width = getWidth(); // total width
int height = getHeight(); // total height
g.drawLine( 0, 0, width, height );
g.drawLine( 0, height, width, 0 );
}
نمیدونم تونستم روشن توضیح بدم یانه.
yegane8
شنبه 06 خرداد 1391, 14:22 عصر
بله روشن بود ممنون
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.