♨️جلسه نوزدهم - کلاس JSpinner در جاوا
کلاس JSpinner اجزای (component) گرافیکی است که به کاربر اجازه میدهد یک عدد یا یک مقدار را از یک دنباله مرتب از پیش تعیین شده انتخاب کند. برای درک بهتر از ظاهر JSpinner تصویر(1) را مشاهده کنید:
• سازنده های پرکاربرد کلاس JSpinner :
• متدهای پرکاربرد کلاس JSpinner :
مثال:
package javalike ; import javax.swing.*; public class SpinnerExample { public static void main(String[] args) { JFrame f=new JFrame("Spinner Example"); SpinnerModel value = new SpinnerNumberModel(5, //initial value 0, //minimum value 10, //maximum value 1); //step JSpinner spinner = new JSpinner(value); spinner.setBounds(100,100,50,30); f.add(spinner); f.setSize(300,300); f.setLayout(null); f.setVisible(true); } } |
خروجی:تصویر(2)
توضیحات:
SpinnerModel value = new SpinnerNumberModel(5, 0, 10, 1); |
• برای ایجاد یک مدل داده ای برای Spinner خود از کلاس SpinnerModel شی ایجاد میکنیم.
• پارامتر سازنده کلاس SpinnerModel به ترتیب عبارت است از :
1. عدد 5 برای مقداردهی اولیه به Spinner است. هنگام نمایش Spinner مقدار انتخاب شده پیشفرض آن 5 است.
2. عدد 0 minimum مقدار Spinner ما است. یعنی مقدار Spinner را نمیتوانیم کمتر از عدد صفر تغییر دهیم.
3. عدد 10 maximum مقدار Spinner ما است. یعنی مقدار Spinner را نمیتوانیم بیشتر از عدد ده تغییر دهیم.
4. با توجه به موارد 2 و 3، محدوده مقادیر Spinner ما بین 0 تا 10 است و تنها در این بازه میتوانیم مقادیر Spinner را تغییر دهیم.
5. عدد 1 گام های تغییر مقدار Spinner ما را تعیین میکند. مثلا عدد 1 باعث میشود یکی یکی مقادیر Spinner خود را تغییر دهیم. اگر مثلا عدد 3 بود سه تا سه تا مقادیر Spinner تغییر میکرد.
JSpinner spinner = new JSpinner(value); |
• از کلاس JSpinner شی ایجاد کرده و شی value که از نوع SpinnerModel است و مدل داده ای Spinner را مشخص میکند به عنوان پارامتر به سازنده کلاس JSpinner داده ایم.
1. spinner.setBounds(100,100,50,30); 2. f.add(spinner); 3. f.setSize(300,300); 4. f.setLayout(null); 5. f.setVisible(true); |
1. تعیین مختصات و ابعداد spinner
2. اضاف کردن spinner به فریم
3. تعیین اندازه فریم
4. چون فعلا از طرح بندی خاصی استفاده نکردیم مقدار پارامتر این متد را null قرار میدهیم.
5. برای نمایش فریم و تمام اجزای گرافیکی از این متد استفاده میکنیم.
مثال:
package javalike ; import javax.swing.*; import javax.swing.event.*; public class SpinnerExample { public static void main(String[] args) { JFrame f = new JFrame("Spinner Example"); final JLabel label = new JLabel(); label.setHorizontalAlignment(JLabel.CENTER); label.setSize(250, 100); SpinnerModel value = new SpinnerNumberModel(5, // initial value 0, // minimum value 10, // maximum value 1); // step JSpinner spinner = new JSpinner(value); spinner.setBounds(100, 100, 50, 30); f.add(spinner); f.add(label); f.setSize(300, 300); f.setLayout(null); f.setVisible(true); spinner.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { label.setText("Value : " + ((JSpinner) e.getSource()).getValue()); } }); } } |
خروجی: تصویر(3)
توضیحات:
1. label.setHorizontalAlignment(JLabel.CENTER); 2. label.setSize(250, 100); |
spinner.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { label.setText("Value : " + ((JSpinner) e.getSource()).getValue()); } }); |
• متد addChangeListener برای افزودن یک ChangeListener به spinner ما کاربرد دارد.
• ChangeListener یک اینترفیس است که از طریق متد stateChanged که در بدنه آن قرار دارد رویدادهای مربوط به تغییر مقدار spinner را دریافت میکند.
• با هر بار رخ دادن رویدادی روی spinner متد stateChanged صدا زده میشود و دستورات درون آن اجرا میشود.
label.setText("Value : "+ ((JSpinner) e.getSource()).getValue()); |
• این دستور مقدار انتخاب شده spinner را درون label نمایش میدهد.
• خب چطور این کار انجام میشود؟!
وقتی رویدادی رخ میدهد درون شی e که از نوع کلاس ChangeEvent هستش ریخته میشود.حال ما از طریق شی e متد getSource را صدا زده ایم، این متد همون طور که از اسمش پیداست میگرده منبع رویداد ( منظور همون اجزای گرافیکی که رویدادی روی آن آنها اتفاق افتاده است) را پیدا میکند و بصورت یک شی از نوع کلاس Object (پدر همه کلاس هاست) برمیگرداند. یک مشکل کوچک پیش اومده! مقدار برگردانده شده از نوع کلاس Object است و از طرفی اجزای گرافیکی ما از نوع کلاس JSpinner هستش! چکار باید کنیم؟! باید شی از نوع کلاس Object را به شی از نوع کلاس JSpinner تبدیل میکنیم.
چگونه؟ با استفاده از روش casting یا تبدیل نوع، به سادگی نوع کلاس خود را درون پرانتز در کنار شی کلاسی که قصد داریم آن را تبدیل کنیم قرار میدهیم. مثلا در اینجا کلاس JSpinner درون پرانتز در کنار e.getSource که شی کلاس Object را برمیگرداند قرار داده ایم. حالا بعد از تبدیل شی از نوع کلاس Object به شی از نوع کلاس JSpinner به راحتی میتوانیم متد getValue را صدا بزنیم.متد getValue مقدار انتخاب شده Spinner را برمی گرداند.
حال از طریق شی label متد setText را صدا زده و رشته "Value : " همراه با مقدار spinner را درون لیبل نمایش میدهیم.
• اگر توضیحات گیج کننده بود نگران نباشید!! تنها با نگاه کردن به کد و تغییر دادن کد روش کار دستتون میاد. شما میگید مثال رو نگاه کن و دستکاری کن! تا یاد بگیری! مثلا چکار کنم؟! ی نمونه دستکاری که خودم انجام دادم که مفهوم دستور زیر رو یادبگیرم را در مثال بعدی نگاه کنید:
((JSpinner) e.getSource()).getValue() |
مثال:
package javalike ; import javax.swing.*; import javax.swing.event.*; public class SpinnerExample { public static void main(String[] args) { JFrame f = new JFrame("Spinner Example"); SpinnerModel value = new SpinnerNumberModel(5, // initial value 0, // minimum value 10, // maximum value 1); // step JSpinner spinner = new JSpinner(value); spinner.setBounds(100, 100, 50, 30); f.add(spinner); f.setSize(300, 300); f.setLayout(null); f.setVisible(true); spinner.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { System.out. print ln(e.getSource()); System.out. print ln((JSpinner) e.getSource()); System.out. print ln(((JSpinner) e.getSource()).getValue()); } }); } } |
خروجی: بعد از اجرای برنامه اگر مقدار spinner را به عدد 6 تغییر دهیم خروجی به صورت تصویر(4) خواهد بود:
• مقدار پیشفرض این spinner ابتدا 5 بود که به عدد 6 تغییر دادیم که نتیجه این تغییر در محیط کنسول به صورت زیر است:
خروجی در کنسول:
• خروجی سبز رنگ نتیجه دستور زیر است، خروجی سبز آدرس شی است که متد getSource برگردانده است.
System.out. print ln(e.getSource()); |
• خروجی آبی رنگ نتیجه دستور زیر است، خروجی آبی آدرس شی بعد از عمل casting است.
System.out. print ln(((JSpinner) e.getSource())); |
• خروجی صورتی رنگ نتیجه دستور زیر است:
System.out. print ln(((JSpinner) e.getSource()).getValue()); |
توضیحات:
System.out. print ln(e.getSource()); |
• این دستور منبعی که رویدادی روی آن رخ داده است را برمیگرداند و چاپ میکند.
• متد getSource منبع رویداد رخ داده را برمی گرداند.
• این منبع میتونه یک اجزای گرافیکی نظیر JSpinner و... باشد.
• همان طور که در جلسات گذشته گفتیم کلاس Object پدر همه کلاس ها است. به عبارتی همه کلاس های درون جاوا زیر کلاس و فرزند کلاس Object است.
• خب getSource شی که برمیگرداند از نوع کلاس Object است. این شی میتونه یکی از اجزای گرافیکی در جاوا باشد ولی نمیتوانیم مستقیم به متدها و ویژگی های آن اجزای گرافیکی دسرسی داشته باشیم و باید حتما عمل casting را انجام دهیم. برای درک سطح دسرسی شی که این متد بدون عمل casting برای ما برمیگرداند تصویر(5) را مشاهده کنید:
همان طور که در تصویر(5) مشاهده میکنید شی که این متد برمیگرداند فقط به ویژگیها و رفتارهای کلاس Object دسرسی دارد و خبری از متدها و ویژگیهای اجزای گرافیکی خاصی نیست! حال عمل casting را به صورت زیر انجام میدهیم:
System.out. print ln(((JSpinner) e.getSource())); |
• این دستور منبع رویدادی که متد getSource برمی گرداند را به شی از کلاس JSpinner تبدیل میکند.
• حالا سطح دسرسی منبع دریافت شده و تبدیل آن به JSpinner را در تصویر(6) مشاهده کنید:
• همان طور که در تصویر(6) مشاهده میکنید با عمل casting به انبوهی از متدهای اجزای گرافیکی از جمله به متد getValue دسرسی داریم.
• جالب است بدانید که خروجی دو دستور زیر شبیه به هم هستند اما در عمل متفاوت! :
System.out. print ln(e.getSource()); System.out. print ln(((JSpinner) e.getSource())); |
• حال با صدا زدن متد getValue مقدار spinner را دریافت میکنیم:
System.out. print ln(((JSpinner) e.getSource()).getValue()); |
خب چطور بود؟! پیشنهاد میکنم هنوز مثال های بیشتری ببینید کسی با یکی دوتا مثال برنامه نویس نشده!
پیروز و موفق باشید
بستن *نام و نام خانوادگی * پست الکترونیک * متن پیام |
دوره های آموزشی برنامه نویسی
انجام پروژه های برنامه نویسی
تدریس خصوصی برنامه نویسی
بیش از 7 سال از فعالیت جاواپرو میگذرد
جاواپرو دارای مجوز نشر دیجیتال از وزارت فرهنگ و ارشاد اسلامی است
جهت ارتباط مستقیم با جاواپرو در واتساپ و تلگرام :
09301904690
بستن دیگر باز نشو! |