Swing - طريقة إنشاء برنامج لحساب الأعمار

Java Swing طريقة إنشاء برنامج لحساب الأعمار

في هذا الدرس ستتعلم طريقة إنشاء برنامج لحساب الأعمار ( Age Calculator ) باستخدام إطار الـ Swing.

In this lesson, you will learn how to create an Age Calculator using the Swing framework.

java swing age calculator source code تحميل كود برنامج حساب الأعمار في جافا


مميزات برنامج إنشاء برنامج لحساب الأعمار

  • يمكن إستخدام هذا البرنامج لحساب عمر الشخص الحي أو المدة التي عاشها الشخص المتوفي.

  • لحساب عمر الشخص الحي, ضع فقط تاريخ ميلاده.

  • لحساب المدة التي عاشها الشخص المتوفي, ضع تاريخ ميلاده و تاريخ وفاته.

⇓ تحميل البرنامج ⇓ تحميل المشروع كاملاً


كود برنامج إنشاء برنامج لحساب الأعمار

Main.java
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.time.LocalDate;
import java.time.Period;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;
 
// و بالتالي أصبح إنشاء كائن منه يمثل إنشاء نافذة JFrame يرث من الكلاس Main هنا جعلنا الكلاس
public class Main extends JFrame {
 
    // هنا قمنا بتعريف الأشياء التي سيتم وضعها في النافذة
    JLabel birthDate, deathDate, result;
    JCheckBox deathDateState;
    JComboBox dayOfBirth, monthOfBirth, yearOfBirth, dayOfDeath, monthOfDeath, yearOfDeath;
    JButton calculateAge;
 
    // سنستخدم هذه المتغيرات لتخزين التواريخ التي إختارها المستخدم من النافذة بشكل مؤقت
    int d1, d2, m1, m2, y1, y2;
 
    // لتخزين تاريخ وفاته endDate لتخزين تاريخ ميلاد الشخص, و الكائن startDate سنستخدم الكائن
    LocalDate startDate, endDate;
 
    // سنستخدم هذه المتغيرات لعرض الفارق النهائي بين تاريخ الميلاد و التاريخ الحالي أو تاريخ الوفاة
    long daysCounter, monthsCounter, yearsCounter;
 
    // لتحديد نوع خط و حجم العناوين التي سنضيفها في النافذة font سنستخدم الكائن
    Font font = new Font("Arial", Font.BOLD, 18);
 
    // فقط createAndShowGUI() سيقوم الكونستركتور بإستدعاء الدالة ColorPicker عند إنشاء كائن من الكلاس
    public Main() {
        createAndShowGUI();
    }
 
 
    // هنا نضع كود إنشاء النافذة و محتوياتها
    private void createAndShowGUI() {
 
        // لجعل النافذة محتوى االنافذة يظهر بشكل أجمل Nimbus إلى الـ UIManager هنا قمنا بتغيير الـ
        try {
            for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        }
        catch (Exception e) { }
 
        // هنا وضعنا أسماء الأشهر التي تظهر في قائمة الأشهر
        String[] months = {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
            "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
 
        // هنا وضعنا أرقام الأشهر الأولية التي سنضعها في قائمة الأرقام
        Integer[] days = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
            11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
            21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31};
 
        // currentYear هنا قمنا بتخزين رقم السنة الحالية في المتغير
        int currentYear = LocalDate.now().getYear();
 
        // هنا قمنا بإنشاء مصفوفة, عدد عناصرها يساوي عدد السنة الحالية
        Integer[] years = new Integer[currentYear];
 
        // هنا قمنا بتخزين أرقام السنين من 1 إلى عدد السنين الحالية
        for (int i = 0; i < years.length; i++)
            years[i] = i + 1;
 
        // هنا قمنا بإنشاء جميع الأشياء التي سنضيفها فيا النافذة
        birthDate = new JLabel("Birth Date");
        deathDate = new JLabel("Death Date");
        deathDateState = new JCheckBox();
        dayOfBirth = new JComboBox(days);
        monthOfBirth = new JComboBox(months);
        yearOfBirth = new JComboBox(years);
        dayOfDeath = new JComboBox(days);
        monthOfDeath = new JComboBox(months);
        yearOfDeath = new JComboBox(years);
        calculateAge = new JButton("Calculate Age");
        result = new JLabel("", JLabel.CENTER);
 
        // هنا قمنا بتحديد حجم و مكان كل شيء سيتم إضافته في النافذة
        birthDate.setBounds(175, 40, 200, 30);
        dayOfBirth.setBounds(120, 80, 50, 30);
        monthOfBirth.setBounds(173, 80, 70, 30);
        yearOfBirth.setBounds(246, 80, 70, 30);
        deathDateState.setBounds(158, 140, 20, 30);
        deathDate.setBounds(183, 140, 200, 30);
        dayOfDeath.setBounds(120, 180, 50, 30);
        monthOfDeath.setBounds(173, 180, 70, 30);
        yearOfDeath.setBounds(246, 180, 70, 30);
        calculateAge.setBounds(118, 250, 200, 60);
        result.setBounds(0, 345, 440, 30);
 
        // هنا قمنا بتحديد حجم و نوع خط العناوين الموجودة في النافذة
        birthDate.setFont(font);
        deathDate.setFont(font);
        calculateAge.setFont(font);
        result.setFont(new Font("Arial", Font.BOLD, 17));
 
        // هنا قمنا بتحديد السنة الإفتراضية المختارة من قوائم السنين
        yearOfBirth.setSelectedItem(2000);
        yearOfDeath.setSelectedItem(2000);
 
        // هنا جعلنا خيار تحديد الوفاة و القوائم الموجودة ضمنه غير مفعلة إفتراضياً
        deathDate.setEnabled(false);
        dayOfDeath.setEnabled(false);
        monthOfDeath.setEnabled(false);
        yearOfDeath.setEnabled(false);
 
 
        // هنا قمنا بإضافة جميع الأشياء التي قمنا بإنشائها في النافذة
        add(birthDate);
        add(deathDate);
        add(dayOfBirth);
        add(monthOfBirth);
        add(yearOfBirth);
        add(deathDateState);
        add(dayOfDeath);
        add(monthOfDeath);
        add(yearOfDeath);
        add(calculateAge);
        add(result);
 
 
        // Check Box هنا قمنا بتحديد ما يحدث عندما يقوم المستخدم بوضع علامة صح أو إزالتها من الـ
        deathDateState.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                // عند وضع علامة الصح سيتم تفعيل خيار تحديد تاريخ الوفاة
                if (deathDateState.isSelected()) {
                    deathDate.setEnabled(true);
                    dayOfDeath.setEnabled(true);
                    monthOfDeath.setEnabled(true);
                    yearOfDeath.setEnabled(true);
                }
                // عند إزالة علامة الصح سيتم تفعيل خيار تحديد تاريخ الوفاة
                else {
                    deathDate.setEnabled(false);
                    dayOfDeath.setEnabled(false);
                    monthOfDeath.setEnabled(false);
                    yearOfDeath.setEnabled(false);
                }
            }
        });
 
 
        // هنا قمنا بتحديد ما يحدث عندما يقوم المستخدم بتغيير الشهر من قائمة الأشهر في تاريخ الميلاد
        monthOfBirth.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
 
                // سيتم تخزين إسم الشهر المختار من قائمة الأشهر و على أساسه سيتم توليد عدد الأيام الموجودة في الشهر
                String month = monthOfBirth.getSelectedItem().toString();
 
                if( month.equals("Jan") || month.equals("Mar") || month.equals("May")
                    || month.equals("Jul") || month.equals("Aug") || month.equals("Oct") || month.equals("Dec") )
                    for( int i = 1; i <= 31; i++ )
                        dayOfBirth.addItem(i);
 
                else if( month.equals("Feb") )
                    for( int i = 1; i <= 28; i++ )
                        dayOfBirth.addItem(i);
 
                else
                    for( int i = 1; i <= 30; i++ )
                        dayOfBirth.addItem(i);
 
            }
        });
 
 
        // هنا قمنا بتحديد ما يحدث عندما يقوم المستخدم بتغيير الشهر من قائمة الأشهر في تاريخ الميلاد
        monthOfDeath.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
 
                // سيتم تخزين إسم الشهر المختار من قائمة الأشهر و على أساسه سيتم توليد عدد الأيام الموجودة في الشهر
                String month = monthOfDeath.getSelectedItem().toString();
 
                if( month.equals("Jan") || month.equals("Mar") || month.equals("May")
                    || month.equals("Jul") || month.equals("Aug") || month.equals("Oct") || month.equals("Dec") )
                    for( int i = 1; i <= 31; i++ )
                        dayOfDeath.addItem(i);
 
                else if( month.equals("Feb") )
                    for( int i = 1; i <= 28; i++ )
                        dayOfDeath.addItem(i);
 
                else
                    for( int i = 1; i <= 30; i++ )
                        dayOfDeath.addItem(i);
 
            }
        });
 
 
        // هنا قمنا بتحديد ما يحدث عند النقر على زر إظهار العمر
        calculateAge.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
 
                // سنستخدم هذا المتغير لتخزين نص النتيجة التي ستظهر
                String text = "";
 
                // هنا قمنا بتخزين تاريخ الميلاد الذي إختاره المستخدم في المتغيرات التالية
                y1 = yearOfBirth.getSelectedIndex() + 1;
                m1 = monthOfBirth.getSelectedIndex() + 1;
                d1 = dayOfBirth.getSelectedIndex() + 1;
 
                // إذا كان خيار تحديد الميلاد مفعل, سيتم تخزين التاريخ المحدد في المتغيرات التالية
                if (deathDateState.isSelected()) {
                    y2 = yearOfDeath.getSelectedIndex() + 1;
                    m2 = monthOfDeath.getSelectedIndex() + 1;
                    d2 = dayOfDeath.getSelectedIndex() + 1;
                }
                // إذا كان خيار تحديد الميلاد غير مفعل, سيتم تخزين التاريخ الحالي في المتغيرات التالية
                else {
                    y2 = LocalDate.now().getYear();
                    m2 = LocalDate.now().getMonthValue();
                    d2 = LocalDate.now().getDayOfMonth();
                }
 
                // endDate و التاريخ الثاني في الكائن startDate هنا قمنا بوضع تاريخ الميلاد الذي حدده المستخدم في الكائن
                startDate = LocalDate.of(y1, m1, d1);
                endDate = LocalDate.of(y2, m2, d2);
 
                // هنا قمنا بتخزين الفارق بين التواريخ في المتغيرات التالية
                yearsCounter = Period.between(startDate, endDate).getYears();
                monthsCounter = Period.between(startDate, endDate).getMonths();
                daysCounter = Period.between(startDate, endDate).getDays();
 
                // هنا قلنا إذا كان التاريخين متواسيين سيتم إظهار التنبيه التالي
                if (yearsCounter == 0 && monthsCounter == 0 && daysCounter == 0) {
                    result.setForeground(Color.red);
                    result.setText("Cannot compare same date!");
                }
 
                // هنا قلنا أنه إذا كانت التواريخ المحددة هي منطقياً صحيحة سيتم إظهار العمر
                else if (!Period.between(startDate, endDate).isNegative())
                {
 
                    if (yearsCounter == 1)
                        text += yearsCounter + " year ";
 
                    else if (yearsCounter > 1)
                        text += yearsCounter + " years ";
 
                    if (monthsCounter == 1)
                    {
                        if (yearsCounter > 0 && daysCounter > 0)
                            text += ", " + monthsCounter + " month ";
 
                        else if (yearsCounter > 0 && daysCounter == 0)
                            text += "and " + monthsCounter + " month ";
 
                        else
                            text += monthsCounter + " month ";
                    }
 
                    if (monthsCounter > 1)
                    {
                        if (yearsCounter > 0 && daysCounter > 0)
                            text += ", " + monthsCounter + " months ";
 
                        else if (yearsCounter > 0 && daysCounter == 0)
                            text += "and " + monthsCounter + " months ";
 
                        else
                            text += monthsCounter + " months ";
                    }
 
                    if (daysCounter == 1)
                    {
                        if (yearsCounter == 0 && monthsCounter == 0)
                            text += daysCounter + " day";
 
                        else
                            text += "and " + daysCounter + " day";
                    }
 
                    if (daysCounter > 1)
                    {
                        if (yearsCounter == 0 && monthsCounter == 0)
                            text += daysCounter + " days";
 
                        else
                            text += "and " + daysCounter + " days";
                    }
 
                    result.setForeground(Color.black);
                    result.setText(text);
                }
 
                // هنا قلنا أنه إذا كانت التواريخ المحددة هي منطقياً غير مقبولة سيتم إظهار التنبيه التالي
                else
                {
                    result.setForeground(Color.red);
                    result.setText("Logic order of Dates is wrong!");
                }
 
            }
        });
 
 
        // هنا قمنا بتحديد بعض خصائص النافذة و جعلناها مرئية
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(436, 446);
        setTitle("Age Calculator");
        setLocationRelativeTo(null);
        setResizable(false);
        setLayout(null);
        setVisible(true);
 
    }
 
 
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                // التي ستنشئ النافذة createAndShowGUI() و بالتالي سيتم إستدعاء الدالة Main هنا قمنا بإنشاء كائن من الكلاس
                new Main();
            }
        });
    }
 
}