الاثنين، 16 نوفمبر 2020

اكتب برنامج بلغة الجافا يقوم بحساب الاعمار

اكتب برنامج بلغة الجافا يقوم بحساب الاعمار
 

اكتب برنامج بلغة الجافا يقوم بحساب الاعمار


هذا الكود المكتوب بلغة الجافا يقوم بعملية حساب الاعمار وكل ما عليك ان تفعله هو اختيار السنه واليوم والشهر الذي تمت ولادتك فية فيهم وهو يقوم بحساب عمرك بالايام والاشهر والسنوات فكره البرنامج رائعه وهي مثال على تطبيق Java swing ونعتبر هذا البنرماج من مشاريع الجافا و للتوضيح انا مجرد ناقل للكود من المصدر


مقدمة عن لغة الجافا ؟


 هي لغة برمجة عالية المستوى إبتكرها James Gosling في عام 1991 لاستخدامها بمثابة العقل المفكر المستخدم لتشغيل الأجهزة الذكية وفي عام 1995 تم تطويرها لبناء تطبيقات للويب, سطح المكتب, الهواتف ... الخ


ماهي Java swing ؟


في البداية, واجهة المستخدم تسمى Graphical User Interface في اللغة الإنجليزية و تختصر بـ GUI. المقصود من واجهة المستخدم هو بناء برامج فيها واجهات رسومية المكتبة Swing تعتمد على المكتبة AWT.


كيفية تعلم لغة برمجة الجافا ببساطة ؟


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


افضل البرنامج و المحررات للكتابة بالجافا ؟


يوجد مقالة سابقة عن تحميل افضل البرنامج التي تساعدك في كتابة اكواد بلغة الجافا بسهولة ومن تلك البرامج وافضلها للمبتدئين netbeans يمكنك بناء و عمل برامج كبيرة عن طريق عن البرنامج البسيط ، ارجع الى المصدر وهو ( java compiler ) لتجد مجموعة منوعة من البرامج اللازمة  مع ذكر عيوب و مميزات كل برنامج ملاحظة هذة البرامج تعمل على جهاز الكمبيوتر  ، أو يتم استخدام مواقع اونلاين لكتابة ألاكواد عن طريق هذة المقالة ( java online compiler ) وستجد افضل محرر بداخل هذة المقالة ، ويوجد تطبيق او مجموعة تطبيقات للهاتف المحمول للاندرويد والايفون للكتابة بالجافا و يمكنك صناعه و تنفيذ من خلالها program يعمل على جهازك 


اين يكتب الكود بداخل المحرر ؟


الاكواد المكتوبة بلغة الجافا او اي لغة نقوم بكتابتها داخل class ويمكنك ربط مجموعة methods داخل الكلاس و تعمل مع بعضها البعض عند استدعائها ملاحظة : عند استدعاء اي شيئ في الجافا يجب ان تستخدم او تقوم بي إنشاء مكتبة مخصصة ( معينة ) لهذا الشيئ مثل Scanner نستدعي المكتبة المخصصة لة لعدم حدوث مشاكل والمكتبة عبارة عن مجموعة من النصوص وهذة من قواعد الجافا ، اذا كان المحرر الذي تعمل علية بسيط لا يوجد بة مكتبات سوف تجدة لا يقبل اي عملية داخلة ويجب عليك ان تقوم بعمل تنزيل الواجهات المخصصة لكل مكتبة في المحرر ليعمل وهذة المكتبات يمكنك تحميلها مجانا وانصحك بقراءة الجزء الاعلى والذي اقدم لكم فية افضل برامج لكتابة الاكواد ، اذا حدث معك مشكلة او ظهر Error في مشروع الجافا الذي تعمل علية يمكنك ترجمة الكلام ومحاولة حله ليعمل البرنامج في بيئة متكاملة بدون اخطاء 



المتطلبات التي يحتاج ان تكتب في كل كود جافا


يجب ان يحتوي كل كود مكتوب ببرمجة جافا الى مجموعة أدوات معرفة داخل البرنامج لكي يعمل معك بدون اي مشاكل ، ليس الا ان تقم بكتابة الاوامر التالية :
قبل جملة
package ###;
### : هو اسم الباكج الذي قمت بانشاه
ضغط هذا الكود
import java.util.Scanner;
فقط كل ما عليك هو تغيير
GC الى اسم الباكج الذي قمت بانشاه

طريقة عمل الكود ؟


قم بإنشاء ملف جافا باي اسم تريده
قم بإنشاء كلاس بإسم Main
قم بكتابة الكود التالي داخل الملف الذي قمت بإنشائه
Main n = new Main ();


قم بلصق الكود التالي داخل Main


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();
            }
        });
    }
 
}



احمد محمود هو طالب جامعي يدرس في احدى الجامعات المصرية , تم تاسيس موقع جي كودرس في منتصف عام 2020 حيث يسعى الموقع الى مساعدة الطلاب في تعلم البرمجة وتوفير الاكواد الجاهزة للاستخدام لمساعدة الطلاب ً