اكتب برنامج بلغة الجافا يقوم بحساب الاعمار
هذا الكود المكتوب بلغة الجافا يقوم بعملية حساب الاعمار وكل ما عليك ان تفعله هو اختيار السنه واليوم والشهر الذي تمت ولادتك فية فيهم وهو يقوم بحساب عمرك بالايام والاشهر والسنوات فكره البرنامج رائعه وهي مثال على تطبيق 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 في مشروع الجافا الذي تعمل علية يمكنك ترجمة الكلام ومحاولة حله ليعمل البرنامج في بيئة متكاملة بدون اخطاء
المتطلبات التي يحتاج ان تكتب في كل كود جافا
طريقة عمل الكود ؟
قم بلصق الكود التالي داخل 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();
}
});
}
}