Swing - الكلاس JSpinner

Java Swing الكلاس JSpinner

الكلاس JSpinner يستخدم لإضافة Spinner في واجهة المستخدم.
الـ Spinner عبارة عن مربع نص يحتوي على قيم جاهزة.
يمكن للمستخدم إختيار إحدى القيم الموجودة فيه بالنقر على الأسهم الملتصقة به, أو باستخدام أسهم لوحة المفاتيح , و يمكنه إدخال القيمة بنفسه.


بنيه الكلاس JSpinner

public class JSpinner
extends JComponent
implements Accessible
	

طريقة التعامل مع الكلاس JSpinner

عند التعامل مع الـ Spinner فأنت لا تضع فيه القيم مباشرةً. بل تضعهم في الـ Model الخاصة به.
إذاً سيكون عليك إنشاء كائن من إحدى الكلاسات التي تنفذ الإنترفيس SpinnerModel و وضعه كـ Model لكائن الـ JSpinner.
بعدها يمكنك إضافة العدد الذي تريده من القيم في كائن الـ SpinnerModel و التي ستظهر بدورها في الـ Spinner.


الكلاسات المهمة التي تطبق الإنترفيس SpinnerModel و التي يمكن إستخدامها:

  • SpinnerListModel: يستخدم لتخزين قيم من مصفوفة عادية أو من كائن من إحدى الكلاسات التي تنفذ الإنترفيس List, مثل الكلاس ArrayList.

  • SpinnerNumberModel: يستخدم لتخزين أرقام في الـ Spinner.

  • SpinnerDateModel: يستخدم لتخزين التاريخ أو الوقت في الـ Spinner.


لا تقلق ستفهم كل شيء من الأمثلة.

كونستركتورات الكلاس JSpinner

الجدول التالي يحتوي على كونستركتورات الكلاس JSpinner.

الكونستركتور مع تعريفه
public JSpinner() ينشئ كائن من الكلاس JSpinner يمثل Spinner فيه 0 كقيمة أولية نوعها Integer.
هنا الكائن JSpinner يستخدم كائن من الكلاس SpinnerNumberModel كـ Model إفتراضية.
public JSpinner(SpinnerModel model) ينشئ كائن من الكلاس JSpinner يمثل Spinner لها Model محددة. أي لها قيم محددة.
مكان الباراميتر model نمرر كائن من إحدى الكلاسات التي تنفذ الإنترفيس SpinnerModel.

يرمي الإستثناء NullPointerException في حال كان الـ Model فارغاً, أي قيمته تساوي null.

دوال الكلاس JSpinner

الجدول التالي يحتوي على بعض دوال الكلاس JSpinner.

الدالة مع تعريفها
public Ojbect getValue() ترجع القيمة الحالية الظاهرة في كائن الـ JSpinner الذي قام بإستدعائها.
public void setValue(Ojbect value) تستخدم لتحديد القيمة الأولية التي ستظهر في كائن الـ JSpinner الذي قام بإستدعائها.
مكان الباراميتر value نضع القيمة.

ترمي الإستثناء IllegalArgumentException في حال كان نوع القيمة الموضوعة لا يلائم نوع الـ Model المستخدمة.
public void addChangeListener(ChangeListener listener) تستخدم لتنفيذ أوامر معينة عند تغيير قيمة كائن الـ JSpinner الذي قام بإستدعائها.
مكان الباراميتر listener نضع كائن من الكلاس ChangeListener و نفعل بداخله Override لدالة إسمها stateChanged(StateEvent e).

 طريقة إنشاء JSpinner

المثال التالي يعلمك طريقة إنشاء كائن من الكلاس JSpinner و إضافته في النافذة.


مثال إنشاء كائن من الكلاس JSpinner و إضافته في النافذة.

Main.java
                    import javax.swing.JFrame;
                    import javax.swing.JSpinner;

                    public class Main {

                    public static void main(String[] args) {

                    JFrame frame = new JFrame("JSpinner demo");              // أي قمنا بإنشاء نافذة مع وضع عنوان لها JFrame هنا أنشأنا كائن من الكلاس
                    frame.setSize(300, 250);                                 // هنا قمنا بتحديد حجم النافذة. عرضها 300 و طولها 250
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    // هنا جعلنا زر الخروج من النافذة يغلق البرنامج
                    frame.setLayout(null);                                   // في النافذة بنفسنا Spinner لذلك سنقوم بتحديد مكان الـ Layout Manager أي لم نستخدم أي null هنا وضعنا

                    JSpinner spinner = new JSpinner();                       // Spinner أي قمنا بإنشاء JSpinner هنا أنشأنا كائن من الكلاس
                    spinner.setBounds(100, 40, 100, 30);                     // frame في الـ Spinner هنا قمنا بتحديد حجم و موقع الـ

                    frame.add(spinner);                                      // frame في الـ spinner هنا أضفنا الـ

                    frame.setVisible(true);                                  // هنا جعلنا النافذة مرئية

                    }

                    }
                  

ستظهر لك النافذة التالية عند التشغيل.

يمكنك النقر على الأسهم الموجودة في يمين الـ Spinner لزيادة أو إنقاص قيمته.

طريقة إضافة JSpinner في ال JFrame في جافا

 طريقة تنفيذ أوامر في كل مرة يتم فيها تغيير قيمة الـ JSpinner

المثال التالي يعلمك طريقة تنفيذ أوامر في كل مرة يتم فيها تغيير قيمة الـ Spinner.


مثال يشرح طريقة تنفيذ أوامر في كل مرة يتم فيها تغيير قيمة الـ Spinner.

Main.java
                    import javax.swing.JFrame;
                    import javax.swing.JLabel;
                    import javax.swing.JSpinner;
                    import javax.swing.event.ChangeEvent;
                    import javax.swing.event.ChangeListener;

                    public class Main {

                    // هنا قمنا بإنشاء النافذة و جميع الأشياء التي سنضعها فيها
                    static JFrame frame = new JFrame("JSpinner demo");
                    static JSpinner spinner = new JSpinner();
                    static JLabel label = new JLabel("Value: 0");

                    public static void main(String[] args) {

                    // frame هنا قمنا بتحديد أماكن الأشياء التي سنضيفها في الـ
                    spinner.setBounds(100, 40, 100, 30);
                    label.setBounds(100, 80, 100, 30);

                    // frame هنا قمنا بإضافة جميع الأشياء التي قمنا بتعريفها سابقاً في الـ
                    frame.add(spinner);
                    frame.add(label);

                    // frame هنا قمنا بتحديد خصائص الـ
                    frame.setSize(300, 250);
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setLayout(null);
                    frame.setVisible(true);


                    // spinner هنا نضع الأوامر التي نريد تنفيذها في كل مرة يتم فيها تغيير قيمة الـ
                    spinner.addChangeListener(new ChangeListener() {
                    @Override
                    // سيتم عرض القيمة التي إختارها
                    public void stateChanged(ChangeEvent e) {
                    label.setText("Value: " + spinner.getValue());
                    }
                    });

                    }

                    }
                  

ستظهر لك النافذة التالية عند التشغيل.

يمكنك النقر على الأسهم الموجودة في يمين الـ Spinner لزيادة أو إنقاص قيمته و تبديل نص الـ Label.

طريقة تنفيذ أوامر في كل مرة يتم فيها تغيير قيمة ال JSpinner في جافا

 طريقة تخزين مصفوفة نوعها String في JSpinner

المثال التالي يعلمك طريقة إنشاء Model لجعل الـ Spinner مخصص فقط لتخزين مصفوفة من النصوص.


مثال يعلمك طريقة إنشاء Model لجعل الـ Spinner مخصص فقط لتخزين مصفوفة من النصوص.

Main.java
                    import javax.swing.JFrame;
                    import javax.swing.JLabel;
                    import javax.swing.JSpinner;
                    import javax.swing.SpinnerListModel;
                    import javax.swing.event.ChangeEvent;
                    import javax.swing.event.ChangeListener;

                    public class Main {

                    // هنا قمنا بإنشاء النافذة و جميع الأشياء التي سنضعها فيها
                    static JFrame frame = new JFrame("JSpinner demo");
                    static String[] levels = { "Easy", "Meduim", "Hard" };
                    static SpinnerListModel model = new SpinnerListModel(levels);
                    static JSpinner spinner = new JSpinner(model);
                    static JLabel label = new JLabel("Level: Easy");

                    public static void main(String[] args) {

                    // frame هنا قمنا بتحديد أماكن الأشياء التي سنضيفها في الـ
                    spinner.setBounds(100, 40, 100, 30);
                    label.setBounds(100, 80, 100, 30);

                    // frame هنا قمنا بإضافة جميع الأشياء التي قمنا بتعريفها سابقاً في الـ
                    frame.add(spinner);
                    frame.add(label);

                    // frame هنا قمنا بتحديد خصائص الـ
                    frame.setSize(300, 250);
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setLayout(null);
                    frame.setVisible(true);


                    // spinner هنا نضع الأوامر التي نريد تنفيذها في كل مرة يتم فيها تغيير قيمة الـ
                    spinner.addChangeListener(new ChangeListener() {
                    @Override
                    // سيتم عرض القيمة التي إختارها
                    public void stateChanged(ChangeEvent e) {
                    label.setText("Level: " + spinner.getValue());
                    }
                    });

                    }

                    }
                  

ستظهر لك النافذة التالية عند التشغيل.

يمكنك النقر على الأسهم الموجودة في يمين الـ Spinner لتبديل قيمة الـ Spinner.

طريقة تخزين مصفوفة String في JSpinner في جافا

 طريقة إنشاء واجهة لإدخال الوقت من خلال JSpinner

المثال التالي يعلمك طريقة إنشاء واجهة لإدخال الوقت تحتوي 4 Spinners.
عند النقر على الزر Display Time سيتم إظهار الوقت الذي تم تحديده في Label.

ملاحظة: قمنا بتعريف الـ Model الخاصة بكل Spinner أثناء تعريف الـ Spinner بهدف تقليل حجم الكود.


مثال يشرح لك طريقة إنشاء واجهة لإدخال الوقت تحتوي 4 Spinners.

Main.java
                    import javax.swing.JFrame;
                    import javax.swing.JLabel;
                    import javax.swing.JSpinner;
                    import javax.swing.JButton;
                    import javax.swing.SpinnerListModel;
                    import javax.swing.SpinnerNumberModel;
                    import java.awt.event.ActionEvent;
                    import java.awt.event.ActionListener;

                    public class Main {

                    // هنا قمنا بإنشاء النافذة و جميع الأشياء التي سنضعها فيها
                    static JFrame frame = new JFrame("JSpinner demo");
                    static JLabel label = new JLabel("Enter Time:");
                    static JSpinner hours = new JSpinner(new SpinnerNumberModel(1, 1, 12, 1));
                    static JSpinner minutes = new JSpinner(new SpinnerNumberModel(0, 0, 59, 1));
                    static JSpinner seconds = new JSpinner(new SpinnerNumberModel(0, 0, 59, 1));
                    static JSpinner amOrPm = new JSpinner(new SpinnerListModel( new String[]{"AM", "PM"} ));
                    static JButton btn = new JButton("Display Time");
                    static JLabel enteredTime = new JLabel();

                    public static void main(String[] args) {

                    // frame هنا قمنا بتحديد أماكن الأشياء التي سنضيفها في الـ
                    label.setBounds(40, 40, 100, 22);
                    hours.setBounds(130, 40, 36, 22);
                    minutes.setBounds(180, 40, 36, 22);
                    seconds.setBounds(230, 40, 36, 22);
                    amOrPm.setBounds(280, 40, 36, 22);
                    btn.setBounds(40, 100, 110, 30);
                    enteredTime.setBounds(170, 100, 200, 30);

                    // frame هنا قمنا بإضافة جميع الأشياء التي قمنا بتعريفها سابقاً في الـ
                    frame.add(label);
                    frame.add(hours);
                    frame.add(minutes);
                    frame.add(seconds);
                    frame.add(amOrPm);
                    frame.add(btn);
                    frame.add(enteredTime);

                    // frame هنا قمنا بتحديد خصائص الـ
                    frame.setSize(400, 250);
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setLayout(null);
                    frame.setVisible(true);


                    // btn هنا نضع الأوامر التي نريد تنفيذها في كل مرة يتم فيها تغيير قيمة الـ
                    btn.addActionListener(new ActionListener() {
                    @Override
                    // سيتم غرض القيمة التي إختارها
                    public void actionPerformed(ActionEvent e) {
                    enteredTime.setText(hours.getValue()+":"+minutes.getValue()+":"+seconds.getValue()+"  "+amOrPm.getValue());
                    }
                    });

                    }

                    }
                  

ستظهر لك النافذة التالية عند التشغيل.

أنقر على الأسهم الموجودة في الـ Spinner لتحديد الوقت. بعدها أنقر على الـ Button ليظهر لك الوقت الذي قمت بإدخاله.

إنشاء واجهة لإدخال الوقت من خلال JSpinner في جافا