Swingطريقة إنشاء آلة حاسبة
في هذا الدرس ستتعلم طريقة إنشاء آلة حاسبة بسيطة باستخدام إطار الـ Swing.
⇓ تحميل البرنامج ⇓ تحميل المشروع كاملاً
كود البرنامج
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;
import java.text.DecimalFormat;
// و بالتالي أصبح إنشاء كائن منه يمثل إنشاء نافذة JFrame يرث من الكلاس Main هنا جعلنا الكلاس
public class Main extends JFrame {
// هنا قمنا بتعريف جميع محتويات النافذة
JButton b1, b2, b3, b4, b5, b6, b7, b8, b9, b0, comma, plus, equal, minus, divide, multiple, clear, back;
JTextField textField;
JLabel oldValueLabel, operandLabel;
// لتخزين العدد الذي تم إدخاله قبل النقر على زر الجمع, الطرح, الضرب أو القسمة num سنستخدم المتغير
double num;
// لتخزين الناتج النهائي عند النقر على زر المساواة answer سنستخدم المتغير
double answer;
// ÷ × - + لتخزين ناتج جميع العمليات السابقة في كل مرة يتم فيها النقر على الأزرار oldAnswer سنستخدم المتغير
double oldAnswer;
// لتخزين رقم عادي يمثل نوع العملية التي سيتم إجراءها operation سنستخدم المتغير
int operation;
// لمعرفة إذا تم تغيير الرقم الظاهر في مربع النص أم لا isTextChanged سنستخدم المتغير
boolean isTextChanged = false;
// لمعرفة إذا تم النقر على أحد هذه الأزرار ÷ × - + أم لا noClickedOperator سنستخدم المتغير
boolean noClickedOperator = true;
// لمعرفة إذا تم النقر على الزر = أم لا isEqualClicked سنستخدم المتغير
boolean isEqualClicked = false;
// لإخفاء الأصفار التي لا حاجة إلى ظهورها format سنستخدم الكائن
DecimalFormat format = new DecimalFormat("0.###############");
// لتحديد نوع خط و حجم الأشياء التي سنضيفها في النافذة font سنستخدم الكائن
Font font = new Font("Arial", Font.BOLD, 17);
// ÷ × - + سنستخدم هذه الدالة لتخزين ناتج جميع العمليات السابقة في كل مرة يتم فيها النقر على الأزرار
private void calculateOldAnswer() {
switch(operation) {
case 1:
oldAnswer += num;
break;
case 2:
if(!oldValueLabel.getText().isEmpty())
oldAnswer -= num;
else
oldAnswer = num - oldAnswer;
break;
case 3:
oldAnswer *= num;
break;
case 4:
oldAnswer /= num;
break;
}
}
// هذه الدالة تقوم ببناء كل شيء في البرنامج و تحدد ماذا سيحدث عندما يتفاعل المستخدم مع محتوى النافذة
private void createAndShowGUI() {
// لجعل محتوى االنافذة يظهر بشكل أجمل Nimbus إلى الـ UIManager هنا قمنا بتغير الـ
try {
for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
UIManager.setLookAndFeel(info.getClassName());
break;
}
}
}
catch (Exception e) { }
// هنا قمنا بإنشاء محتوى النافذة
b0 = new JButton("0");
b1 = new JButton("1");
b2 = new JButton("2");
b3 = new JButton("3");
b4 = new JButton("4");
b5 = new JButton("5");
b6 = new JButton("6");
b7 = new JButton("7");
b8 = new JButton("8");
b9 = new JButton("9");
comma = new JButton(".");
plus = new JButton("+");
minus = new JButton("-");
multiple = new JButton("×");
divide = new JButton("÷");
equal = new JButton("=");
clear = new JButton("C");
back = new JButton("←");
textField = new JTextField("0");
oldValueLabel = new JLabel("", JLabel.RIGHT);
operandLabel = new JLabel("", JLabel.RIGHT);
// هنا قمنا بتحديد حجم و موقع كل شيء أضفناه في النافذة
oldValueLabel.setBounds(11, 5, 214, 20);
operandLabel.setBounds(225, 5, 20, 20);
textField.setBounds(11, 25, 234, 47);
b7.setBounds(10, 80, 45, 42);
b8.setBounds(58, 80, 45, 42);
b9.setBounds(106, 80, 45, 42);
plus.setBounds(154, 80, 45, 42);
clear.setBounds(202, 80, 45, 42);
b4.setBounds(10, 125, 45, 42);
b5.setBounds(58, 125, 45, 42);
b6.setBounds(106, 125, 45, 42);
minus.setBounds(154, 125, 45, 42);
back.setBounds(202, 125, 45, 42);
b1.setBounds(10, 170, 45, 42);
b2.setBounds(58, 170, 45, 42);
b3.setBounds(106, 170, 45, 42);
multiple.setBounds(154, 170, 45, 42);
equal.setBounds(202, 170, 45, 87);
b0.setBounds(10, 215, 93, 42);
comma.setBounds(106, 215, 45, 42);
divide.setBounds(154, 215, 45, 42);
// هنا قمنا بتحديد حجم و نوع خط كل شيء أضفناه في النافذة
b0.setFont(font);
b1.setFont(font);
b2.setFont(font);
b3.setFont(font);
b4.setFont(font);
b5.setFont(font);
b6.setFont(font);
b7.setFont(font);
b8.setFont(font);
b9.setFont(font);
comma.setFont(font);
equal.setFont(font);
plus.setFont(font);
minus.setFont(font);
multiple.setFont(font);
divide.setFont(font);
clear.setFont(font);
back.setFont(font);
oldValueLabel.setFont(font);
operandLabel.setFont(font);
// textField هنا قمنا بتحديد بعض خصائص الـ
textField.setEditable(false);
textField.setHorizontalAlignment(JTextField.RIGHT);
textField.setFont(new Font("Monospaced", Font.BOLD, 19));
// هنا قمنا بتحديد لون خط كل شيء سنضيفه في النافذة
oldValueLabel.setForeground(Color.cyan);
operandLabel.setForeground(Color.yellow);
b0.setForeground(Color.white);
b1.setForeground(Color.white);
b2.setForeground(Color.white);
b3.setForeground(Color.white);
b4.setForeground(Color.white);
b5.setForeground(Color.white);
b6.setForeground(Color.white);
b7.setForeground(Color.white);
b8.setForeground(Color.white);
b9.setForeground(Color.white);
comma.setForeground(Color.white);
equal.setForeground(Color.white);
plus.setForeground(Color.white);
minus.setForeground(Color.white);
multiple.setForeground(Color.white);
divide.setForeground(Color.white);
clear.setForeground(Color.white);
back.setForeground(Color.white);
// هنا قمنا بتحديد لون خلفية كل شيء سنضيفه في النافذة
b0.setBackground(Color.darkGray);
b1.setBackground(Color.darkGray);
b2.setBackground(Color.darkGray);
b3.setBackground(Color.darkGray);
b4.setBackground(Color.darkGray);
b5.setBackground(Color.darkGray);
b6.setBackground(Color.darkGray);
b7.setBackground(Color.darkGray);
b8.setBackground(Color.darkGray);
b9.setBackground(Color.darkGray);
comma.setBackground(Color.darkGray);
plus.setBackground(Color.black);
minus.setBackground(Color.black);
multiple.setBackground(Color.black);
divide.setBackground(Color.black);
equal.setBackground(Color.black);
clear.setBackground(new Color(223, 1, 1));
back.setBackground(new Color(255, 128, 0));
getContentPane().setBackground(Color.black);
// هنا قمنا بإضافة جميع الأشياء التي قمنا بتعريفها و تحديد خصائصها في النافذة
add(b0);
add(b1);
add(b2);
add(b3);
add(b4);
add(b5);
add(b6);
add(b7);
add(b8);
add(b9);
add(comma);
add(equal);
add(plus);
add(multiple);
add(minus);
add(divide);
add(clear);
add(back);
add(textField);
add(oldValueLabel);
add(operandLabel);
// يمثل ما يحدث عند النقر على أي زر موضوع في البرنامج ActionListener هنا قمنا بتعريف كائن من الإنترفيس
ActionListener actionListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// عند النقر على الزر 0 سيتم إضافة 0 في مربع النص مع التأكد من عدم وجود أي صفر لا فائدة له من الناحية اليسرى
if (e.getSource() == b0)
{
if (isEqualClicked == true || textField.getText().equals("0"))
textField.setText("0");
else
textField.setText(textField.getText()+"0");
isEqualClicked = false;
isTextChanged = true;
noClickedOperator = true;
}
// عند النقر على الزر 1 سيتم إضافة 1 في مربع النص مع التأكد من عدم وجود أي صفر لا فائدة له من الناحية اليسرى
else if (e.getSource() == b1)
{
if (isEqualClicked == true || textField.getText().equals("0"))
textField.setText("1");
else
textField.setText(textField.getText()+"1");
isEqualClicked = false;
isTextChanged = true;
noClickedOperator = true;
}
// عند النقر على الزر 2 سيتم إضافة 2 في مربع النص مع التأكد من عدم وجود أي صفر لا فائدة له من الناحية اليسرى
else if (e.getSource() == b2)
{
if (isEqualClicked == true || textField.getText().equals("0"))
textField.setText("2");
else
textField.setText(textField.getText()+"2");
isEqualClicked = false;
isTextChanged = true;
noClickedOperator = true;
}
// عند النقر على الزر 3 سيتم إضافة 3 في مربع النص مع التأكد من عدم وجود أي صفر لا فائدة له من الناحية اليسرى
else if (e.getSource() == b3)
{
if (isEqualClicked == true || textField.getText().equals("0"))
textField.setText("3");
else
textField.setText(textField.getText()+"3");
isEqualClicked = false;
isTextChanged = true;
noClickedOperator = true;
}
// عند النقر على الزر 4 سيتم إضافة 4 في مربع النص مع التأكد من عدم وجود أي صفر لا فائدة له من الناحية اليسرى
else if (e.getSource() == b4)
{
if (isEqualClicked == true || textField.getText().equals("0"))
textField.setText("4");
else
textField.setText(textField.getText()+"4");
isEqualClicked = false;
isTextChanged = true;
noClickedOperator = true;
}
// عند النقر على الزر 5 سيتم إضافة 5 في مربع النص مع التأكد من عدم وجود أي صفر لا فائدة له من الناحية اليسرى
else if (e.getSource() == b5)
{
if (isEqualClicked == true || textField.getText().equals("0"))
textField.setText("5");
else
textField.setText(textField.getText()+"5");
isEqualClicked = false;
isTextChanged = true;
noClickedOperator = true;
}
// عند النقر على الزر 6 سيتم إضافة 6 في مربع النص مع التأكد من عدم وجود أي صفر لا فائدة له من الناحية اليسرى
else if (e.getSource() == b6)
{
if (isEqualClicked == true || textField.getText().equals("0"))
textField.setText("6");
else
textField.setText(textField.getText()+"6");
isEqualClicked = false;
isTextChanged = true;
noClickedOperator = true;
}
// عند النقر على الزر 7 سيتم إضافة 7 في مربع النص مع التأكد من عدم وجود أي صفر لا فائدة له من الناحية اليسرى
else if (e.getSource() == b7)
{
if (isEqualClicked == true || textField.getText().equals("0"))
textField.setText("7");
else
textField.setText(textField.getText()+"7");
isEqualClicked = false;
isTextChanged = true;
noClickedOperator = true;
}
// عند النقر على الزر 8 سيتم إضافة 8 في مربع النص مع التأكد من عدم وجود أي صفر لا فائدة له من الناحية اليسرى
else if (e.getSource() == b8)
{
if (isEqualClicked == true || textField.getText().equals("0"))
textField.setText("8");
else
textField.setText(textField.getText()+"8");
isEqualClicked = false;
isTextChanged = true;
noClickedOperator = true;
}
// عند النقر على الزر 9 سيتم إضافة 9 في مربع النص مع التأكد من عدم وجود أي صفر لا فائدة له من الناحية اليسرى
else if (e.getSource() == b9)
{
if (isEqualClicked == true || textField.getText().equals("0"))
textField.setText("9");
else
textField.setText(textField.getText()+"9");
isEqualClicked = false;
isTextChanged = true;
noClickedOperator = true;
}
// سيتم إضافة نقطة (أي فاصلة) عند النقر على زر النقطة في حال لم يكن هناك نقطة أصلاً
else if (e.getSource() == comma)
{
if (isEqualClicked == true || textField.getText().isEmpty())
textField.setText("0.");
else if (!textField.getText().contains("."))
textField.setText(textField.getText()+".");
isEqualClicked = false;
isTextChanged = true;
}
// للإشارة إلى أنه يوجد عملية جمع operation و وضع القيمة 1 للمتغير num عند النقر على الزر + سيتم تخزين القيمة المدخلة في المتغير
else if (e.getSource() == plus && noClickedOperator == true)
{
// قبل أي شيء سيتم التأكد من أنه لا يوجد عملية قسمة سابقة لأي رقم على صفر, و إن وجدت سيتم عرض النص التالي في مربع النص
if (textField.getText().equals("0") && operandLabel.getText().equals("÷"))
textField.setText("cannot divide by 0");
// إذا كان هناك أي قيمة مدخلة في مربع النص أو كان هناك ناتج معروض لعملية سابقة فوق مربع النص سيتم تنفيذ التالي
else if (isTextChanged == true || oldValueLabel.getText().isEmpty()) {
try {
// إذا لم يكن هناك قيمة مدخلة حالياً في مربع النص num سيتم وضع 0 في المتغير
if (textField.getText().isEmpty())
num = 0;
// num إذا لم يكن مربع النص فارغاً سيتم وضع الرقم المدخل فيه في المتغير
else
num = Double.parseDouble(textField.getText());
// حتى لا يؤثر على عملية الجمع oldAnswer إذا لم يكن هناك أي ناتج ظاهر لعملية سابقة فوق مربع النص, سيتم وضع 0 في المتغير
if (oldValueLabel.getText().isEmpty()) {
operation = 1;
oldAnswer = 0;
}
// oldAnswer إذا كان يوجد ناتج ظاهر لعملية سابقة فوق مربع النص, سيتم تخزينه في المتغير
else
oldAnswer = Double.parseDouble(oldValueLabel.getText());
// و مسح النص الذي كان موجوداً في مربع النص oldValueLabel بعدها سيتم وضع ناتج العملية السابقة كنص للكائن
calculateOldAnswer();
operandLabel.setText("+");
oldValueLabel.setText(format.format(oldAnswer));
textField.setText("");
// calculateOldAnswer() للإشارة إلى أنه يجب جمع القيم المدخلة عند أول إستدعاء للدالة operation بعدها سيتم وضع 1 في المتغير
operation = 1;
}
catch(Exception ex) {
textField.setText("Error");
}
}
// في الأخير سيتم الإشارة إلى أنه تم النقر على إحدى الأزرار ÷ × - + و أن القيمة المدخلة في مربع النص قد تغيرت
isTextChanged = false;
noClickedOperator = false;
}
// للإشارة إلى أنه يوجد عملية طرح operation و وضع القيمة 2 للمتغير num عند النقر على الزر - سيتم تخزين القيمة المدخلة في المتغير
else if (e.getSource() == minus && noClickedOperator == true)
{
// قبل أي شيء سيتم التأكد من أنه لا يوجد عملية قسمة سابقة لأي رقم على صفر, و إن وجدت سيتم عرض النص التالي في مربع النص
if (textField.getText().equals("0") && operandLabel.getText().equals("÷"))
textField.setText("cannot divide by 0");
// إذا كان هناك أي قيمة مدخلة في مربع النص أو كان هناك ناتج معروض لعملية سابقة فوق مربع النص سيتم تنفيذ التالي
else if (isTextChanged == true || oldValueLabel.getText().isEmpty()) {
try {
// إذا لم يكن هناك قيمة مدخلة حالياً في مربع النص num سيتم وضع 0 في المتغير
if (textField.getText().isEmpty())
num = 0;
// num إذا لم يكن مربع النص فارغاً سيتم وضع الرقم المدخل فيه في المتغير
else
num = Double.parseDouble(textField.getText());
// حتى لا يؤثر على عملية الطرح oldAnswer إذا لم يكن هناك أي ناتج ظاهر لعملية سابقة فوق مربع النص, سيتم وضع 0 في المتغير
if (oldValueLabel.getText().isEmpty()) {
operation = 2;
oldAnswer = 0;
}
// oldAnswer إذا كان يوجد ناتج ظاهر لعملية سابقة فوق مربع النص, سيتم تخزينه في المتغير
else
oldAnswer = Double.parseDouble(oldValueLabel.getText());
// و مسح النص الذي كان موجوداً في مربع النص oldValueLabel بعدها سيتم وضع ناتج العملية السابقة كنص للكائن
calculateOldAnswer();
operandLabel.setText("-");
oldValueLabel.setText(format.format(oldAnswer));
textField.setText("");
// calculateOldAnswer() للإشارة إلى أنه يجب طرح القيم المدخلة عند أول إستدعاء للدالة operation بعدها سيتم وضع 2 في المتغير
operation = 2;
}
catch(Exception ex) {
textField.setText("Error");
}
}
// في الأخير سيتم الإشارة إلى أنه تم النقر على إحدى الأزرار ÷ × - + و أن القيمة المدخلة في مربع النص قد تغيرت
isTextChanged = false;
noClickedOperator = false;
}
// للإشارة إلى أنه يوجد عملية ضرب operation و وضع القيمة 3 للمتغير num عند النقر على الزر × سيتم تخزين القيمة المدخلة في المتغير
else if (e.getSource() == multiple && noClickedOperator == true)
{
// قبل أي شيء سيتم التأكد من أنه لا يوجد عملية قسمة سابقة لأي رقم على صفر, و إن وجدت سيتم عرض النص التالي في مربع النص
if (textField.getText().equals("0") && operandLabel.getText().equals("÷"))
textField.setText("cannot divide by 0");
// إذا كان هناك أي قيمة مدخلة في مربع النص أو كان هناك ناتج معروض لعملية سابقة فوق مربع النص سيتم تنفيذ التالي
else if (isTextChanged == true || oldValueLabel.getText().isEmpty()) {
try {
// إذا لم يكن هناك قيمة مدخلة حالياً في مربع النص num سيتم وضع 1 في المتغير
if (textField.getText().isEmpty())
num = 1;
// num إذا لم يكن مربع النص فارغاً سيتم وضع الرقم المدخل فيه في المتغير
else
num = Double.parseDouble(textField.getText());
// حتى لا يؤثر على عملية الضرب oldAnswer إذا لم يكن هناك أي ناتج ظاهر لعملية سابقة فوق مربع النص, سيتم وضع 1 في المتغير
if (oldValueLabel.getText().isEmpty()) {
operation = 3;
oldAnswer = 1;
}
// oldAnswer إذا كان يوجد ناتج ظاهر لعملية سابقة فوق مربع النص, سيتم تخزينه في المتغير
else
oldAnswer = Double.parseDouble(oldValueLabel.getText());
// و مسح النص الذي كان موجوداً في مربع النص oldValueLabel بعدها سيتم وضع ناتج العملية السابقة كنص للكائن
calculateOldAnswer();
operandLabel.setText("×");
oldValueLabel.setText(format.format(oldAnswer));
textField.setText("");
// calculateOldAnswer() للإشارة إلى أنه يجب ضرب القيم المدخلة عند أول إستدعاء للدالة operation بعدها سيتم وضع 3 في المتغير
operation = 3;
}
catch(Exception ex) {
textField.setText("Error");
}
}
// في الأخير سيتم الإشارة إلى أنه تم النقر على إحدى الأزرار ÷ × - + و أن القيمة المدخلة في مربع النص قد تغيرت
isTextChanged = false;
noClickedOperator = false;
}
// للإشارة إلى أنه يوجد عملية قسمة operation و وضع القيمة 4 للمتغير num عند النقر على الزر ÷ سيتم تخزين القيمة المدخلة في المتغير
else if (e.getSource() == divide && noClickedOperator == true)
{
// قبل أي شيء سيتم التأكد من أنه لا يوجد عملية قسمة سابقة لأي رقم على صفر, و إن وجدت سيتم عرض النص التالي في مربع النص
if (textField.getText().equals("0") && operandLabel.getText().equals("÷"))
textField.setText("cannot divide by 0");
// إذا كان هناك أي قيمة مدخلة في مربع النص أو كان هناك ناتج معروض لعملية سابقة فوق مربع النص سيتم تنفيذ التالي
else if (isTextChanged == true || oldValueLabel.getText().isEmpty()) {
try {
// إذا لم يكن هناك قيمة مدخلة حالياً في مربع النص num سيتم وضع 1 في المتغير
if (textField.getText().isEmpty())
num = 1;
// num إذا لم يكن مربع النص فارغاً سيتم وضع الرقم المدخل فيه في المتغير
else
num = Double.parseDouble(textField.getText());
if (oldValueLabel.getText().isEmpty())
oldAnswer = num;
else {
oldAnswer = Double.parseDouble(oldValueLabel.getText());
calculateOldAnswer();
}
// و مسح النص الذي كان موجوداً في مربع النص oldValueLabel بعدها سيتم وضع ناتج العملية السابقة كنص للكائن
operandLabel.setText("÷");
oldValueLabel.setText(format.format(oldAnswer));
textField.setText("");
// calculateOldAnswer() للإشارة إلى أنه يجب قسم القيم المدخلة عند أول إستدعاء للدالة operation بعدها سيتم وضع 4 في المتغير
operation = 4;
}
catch(Exception ex) {
textField.setText("Error");
}
}
// في الأخير سيتم الإشارة إلى أنه تم النقر على إحدى الأزرار ÷ × - + و أن القيمة المدخلة في مربع النص قد تغيرت
isTextChanged = false;
noClickedOperator = false;
}
// = هنا قمنا بتحديد ما يحدث عند النقر على الزر
else if (e.getSource() == equal)
{
// إذا كان يوجد قيمة في مربع النص و قيمة سابقة ظاهرة فوقه سيتم حساب ناتجهم و عرض الناتج في مربع النص
if (!textField.getText().isEmpty() && !oldValueLabel.getText().isEmpty() && isEqualClicked == false) {
double a = Double.parseDouble(oldValueLabel.getText());
double b = Double.parseDouble(textField.getText());
char operand = operandLabel.getText().charAt(0);
switch (operand) {
case '+':
answer = a + b;
textField.setText(format.format(answer));
break;
case '-':
answer = a - b;
textField.setText(format.format(answer));
break;
case '×':
answer = a * b;
textField.setText(format.format(answer));
break;
case '÷':
if (b == 0)
textField.setText("cannot divide by 0");
else {
answer = a / b;
textField.setText(format.format(answer));
}
break;
}
}
// إذا لم تكن هناك قيمة في مربع النص و كانت هناك قيمة سابقة ظاهرة فوقه سيتم وضعها في مربع النص
else if (textField.getText().isEmpty() && !oldValueLabel.getText().isEmpty())
textField.setText(oldValueLabel.getText());
// في الأخير سيتم مسح قيمة العملية السابقة و العامل الموضوعين فوق مربع النص لإظهار النتيجة النهائية فقط
oldValueLabel.setText("");
operandLabel.setText("");
// = بالإضافة إلى الإشارة إلى أنه لم يتم النقر على إحدى الأزرار ÷ × - + و أنه تم النقر على الزر
isEqualClicked = true;
noClickedOperator = true;
}
// عند النقر على الزر ← سيتم مسح رقم واحد من مربع النص أو مسح أي خطأ ظاهر
else if (e.getSource() == back)
{
if (textField.getText().equals("Error") || textField.getText().equals("cannot divide by 0"))
textField.setText("");
else if (!textField.getText().isEmpty())
textField.setText(textField.getText().substring(0, textField.getText().length() - 1));
}
// سيتم مسح كل شيء ظاهر و تصفير جميع القيم المخزنة للبدء من جديد C عند النقر على الزر
else if (e.getSource() == clear) {
oldValueLabel.setText("");
textField.setText("");
operandLabel.setText("");
oldAnswer = 0;
num = 0;
noClickedOperator = true;
}
}
};
// الموجودة فيه كلما تم النقر على زر actionPerformed() حتى يتم إستدعاء الدالة actionListener هنا قمنا بربط جميع الأزرار بالكائن
b0.addActionListener(actionListener);
b1.addActionListener(actionListener);
b2.addActionListener(actionListener);
b3.addActionListener(actionListener);
b4.addActionListener(actionListener);
b5.addActionListener(actionListener);
b6.addActionListener(actionListener);
b7.addActionListener(actionListener);
b8.addActionListener(actionListener);
b9.addActionListener(actionListener);
comma.addActionListener(actionListener);
plus.addActionListener(actionListener);
multiple.addActionListener(actionListener);
divide.addActionListener(actionListener);
minus.addActionListener(actionListener);
equal.addActionListener(actionListener);
clear.addActionListener(actionListener);
back.addActionListener(actionListener);
// هنا قمنا بتحديد بعض خصائص النافذة و جعلناها مرئية
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("Calculator");
setSize(263, 300);
setLocationRelativeTo(null);
setResizable(false);
setLayout(null);
setVisible(true);
}
// فقط createAndShowGUI() سيقوم الكونستركتور بإستدعاء الدالة Main عند إنشاء كائن من الكلاس
public Main() {
createAndShowGUI();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
// التي ستنشئ النافذة createAndShowGUI() و بالتالي سيتم إستدعاء الدالة Main هنا قمنا بإنشاء كائن من الكلاس
new Main();
}
});
}
}
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;
import java.text.DecimalFormat;
// و بالتالي أصبح إنشاء كائن منه يمثل إنشاء نافذة JFrame يرث من الكلاس Main هنا جعلنا الكلاس
public class Main extends JFrame {
// هنا قمنا بتعريف جميع محتويات النافذة
JButton b1, b2, b3, b4, b5, b6, b7, b8, b9, b0, comma, plus, equal, minus, divide, multiple, clear, back;
JTextField textField;
JLabel oldValueLabel, operandLabel;
// لتخزين العدد الذي تم إدخاله قبل النقر على زر الجمع, الطرح, الضرب أو القسمة num سنستخدم المتغير
double num;
// لتخزين الناتج النهائي عند النقر على زر المساواة answer سنستخدم المتغير
double answer;
// ÷ × - + لتخزين ناتج جميع العمليات السابقة في كل مرة يتم فيها النقر على الأزرار oldAnswer سنستخدم المتغير
double oldAnswer;
// لتخزين رقم عادي يمثل نوع العملية التي سيتم إجراءها operation سنستخدم المتغير
int operation;
// لمعرفة إذا تم تغيير الرقم الظاهر في مربع النص أم لا isTextChanged سنستخدم المتغير
boolean isTextChanged = false;
// لمعرفة إذا تم النقر على أحد هذه الأزرار ÷ × - + أم لا noClickedOperator سنستخدم المتغير
boolean noClickedOperator = true;
// لمعرفة إذا تم النقر على الزر = أم لا isEqualClicked سنستخدم المتغير
boolean isEqualClicked = false;
// لإخفاء الأصفار التي لا حاجة إلى ظهورها format سنستخدم الكائن
DecimalFormat format = new DecimalFormat("0.###############");
// لتحديد نوع خط و حجم الأشياء التي سنضيفها في النافذة font سنستخدم الكائن
Font font = new Font("Arial", Font.BOLD, 17);
// ÷ × - + سنستخدم هذه الدالة لتخزين ناتج جميع العمليات السابقة في كل مرة يتم فيها النقر على الأزرار
private void calculateOldAnswer() {
switch(operation) {
case 1:
oldAnswer += num;
break;
case 2:
if(!oldValueLabel.getText().isEmpty())
oldAnswer -= num;
else
oldAnswer = num - oldAnswer;
break;
case 3:
oldAnswer *= num;
break;
case 4:
oldAnswer /= num;
break;
}
}
// هذه الدالة تقوم ببناء كل شيء في البرنامج و تحدد ماذا سيحدث عندما يتفاعل المستخدم مع محتوى النافذة
private void createAndShowGUI() {
// لجعل محتوى االنافذة يظهر بشكل أجمل Nimbus إلى الـ UIManager هنا قمنا بتغير الـ
try {
for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
UIManager.setLookAndFeel(info.getClassName());
break;
}
}
}
catch (Exception e) { }
// هنا قمنا بإنشاء محتوى النافذة
b0 = new JButton("0");
b1 = new JButton("1");
b2 = new JButton("2");
b3 = new JButton("3");
b4 = new JButton("4");
b5 = new JButton("5");
b6 = new JButton("6");
b7 = new JButton("7");
b8 = new JButton("8");
b9 = new JButton("9");
comma = new JButton(".");
plus = new JButton("+");
minus = new JButton("-");
multiple = new JButton("×");
divide = new JButton("÷");
equal = new JButton("=");
clear = new JButton("C");
back = new JButton("←");
textField = new JTextField("0");
oldValueLabel = new JLabel("", JLabel.RIGHT);
operandLabel = new JLabel("", JLabel.RIGHT);
// هنا قمنا بتحديد حجم و موقع كل شيء أضفناه في النافذة
oldValueLabel.setBounds(11, 5, 214, 20);
operandLabel.setBounds(225, 5, 20, 20);
textField.setBounds(11, 25, 234, 47);
b7.setBounds(10, 80, 45, 42);
b8.setBounds(58, 80, 45, 42);
b9.setBounds(106, 80, 45, 42);
plus.setBounds(154, 80, 45, 42);
clear.setBounds(202, 80, 45, 42);
b4.setBounds(10, 125, 45, 42);
b5.setBounds(58, 125, 45, 42);
b6.setBounds(106, 125, 45, 42);
minus.setBounds(154, 125, 45, 42);
back.setBounds(202, 125, 45, 42);
b1.setBounds(10, 170, 45, 42);
b2.setBounds(58, 170, 45, 42);
b3.setBounds(106, 170, 45, 42);
multiple.setBounds(154, 170, 45, 42);
equal.setBounds(202, 170, 45, 87);
b0.setBounds(10, 215, 93, 42);
comma.setBounds(106, 215, 45, 42);
divide.setBounds(154, 215, 45, 42);
// هنا قمنا بتحديد حجم و نوع خط كل شيء أضفناه في النافذة
b0.setFont(font);
b1.setFont(font);
b2.setFont(font);
b3.setFont(font);
b4.setFont(font);
b5.setFont(font);
b6.setFont(font);
b7.setFont(font);
b8.setFont(font);
b9.setFont(font);
comma.setFont(font);
equal.setFont(font);
plus.setFont(font);
minus.setFont(font);
multiple.setFont(font);
divide.setFont(font);
clear.setFont(font);
back.setFont(font);
oldValueLabel.setFont(font);
operandLabel.setFont(font);
// textField هنا قمنا بتحديد بعض خصائص الـ
textField.setEditable(false);
textField.setHorizontalAlignment(JTextField.RIGHT);
textField.setFont(new Font("Monospaced", Font.BOLD, 19));
// هنا قمنا بتحديد لون خط كل شيء سنضيفه في النافذة
oldValueLabel.setForeground(Color.cyan);
operandLabel.setForeground(Color.yellow);
b0.setForeground(Color.white);
b1.setForeground(Color.white);
b2.setForeground(Color.white);
b3.setForeground(Color.white);
b4.setForeground(Color.white);
b5.setForeground(Color.white);
b6.setForeground(Color.white);
b7.setForeground(Color.white);
b8.setForeground(Color.white);
b9.setForeground(Color.white);
comma.setForeground(Color.white);
equal.setForeground(Color.white);
plus.setForeground(Color.white);
minus.setForeground(Color.white);
multiple.setForeground(Color.white);
divide.setForeground(Color.white);
clear.setForeground(Color.white);
back.setForeground(Color.white);
// هنا قمنا بتحديد لون خلفية كل شيء سنضيفه في النافذة
b0.setBackground(Color.darkGray);
b1.setBackground(Color.darkGray);
b2.setBackground(Color.darkGray);
b3.setBackground(Color.darkGray);
b4.setBackground(Color.darkGray);
b5.setBackground(Color.darkGray);
b6.setBackground(Color.darkGray);
b7.setBackground(Color.darkGray);
b8.setBackground(Color.darkGray);
b9.setBackground(Color.darkGray);
comma.setBackground(Color.darkGray);
plus.setBackground(Color.black);
minus.setBackground(Color.black);
multiple.setBackground(Color.black);
divide.setBackground(Color.black);
equal.setBackground(Color.black);
clear.setBackground(new Color(223, 1, 1));
back.setBackground(new Color(255, 128, 0));
getContentPane().setBackground(Color.black);
// هنا قمنا بإضافة جميع الأشياء التي قمنا بتعريفها و تحديد خصائصها في النافذة
add(b0);
add(b1);
add(b2);
add(b3);
add(b4);
add(b5);
add(b6);
add(b7);
add(b8);
add(b9);
add(comma);
add(equal);
add(plus);
add(multiple);
add(minus);
add(divide);
add(clear);
add(back);
add(textField);
add(oldValueLabel);
add(operandLabel);
// يمثل ما يحدث عند النقر على أي زر موضوع في البرنامج ActionListener هنا قمنا بتعريف كائن من الإنترفيس
ActionListener actionListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// عند النقر على الزر 0 سيتم إضافة 0 في مربع النص مع التأكد من عدم وجود أي صفر لا فائدة له من الناحية اليسرى
if (e.getSource() == b0)
{
if (isEqualClicked == true || textField.getText().equals("0"))
textField.setText("0");
else
textField.setText(textField.getText()+"0");
isEqualClicked = false;
isTextChanged = true;
noClickedOperator = true;
}
// عند النقر على الزر 1 سيتم إضافة 1 في مربع النص مع التأكد من عدم وجود أي صفر لا فائدة له من الناحية اليسرى
else if (e.getSource() == b1)
{
if (isEqualClicked == true || textField.getText().equals("0"))
textField.setText("1");
else
textField.setText(textField.getText()+"1");
isEqualClicked = false;
isTextChanged = true;
noClickedOperator = true;
}
// عند النقر على الزر 2 سيتم إضافة 2 في مربع النص مع التأكد من عدم وجود أي صفر لا فائدة له من الناحية اليسرى
else if (e.getSource() == b2)
{
if (isEqualClicked == true || textField.getText().equals("0"))
textField.setText("2");
else
textField.setText(textField.getText()+"2");
isEqualClicked = false;
isTextChanged = true;
noClickedOperator = true;
}
// عند النقر على الزر 3 سيتم إضافة 3 في مربع النص مع التأكد من عدم وجود أي صفر لا فائدة له من الناحية اليسرى
else if (e.getSource() == b3)
{
if (isEqualClicked == true || textField.getText().equals("0"))
textField.setText("3");
else
textField.setText(textField.getText()+"3");
isEqualClicked = false;
isTextChanged = true;
noClickedOperator = true;
}
// عند النقر على الزر 4 سيتم إضافة 4 في مربع النص مع التأكد من عدم وجود أي صفر لا فائدة له من الناحية اليسرى
else if (e.getSource() == b4)
{
if (isEqualClicked == true || textField.getText().equals("0"))
textField.setText("4");
else
textField.setText(textField.getText()+"4");
isEqualClicked = false;
isTextChanged = true;
noClickedOperator = true;
}
// عند النقر على الزر 5 سيتم إضافة 5 في مربع النص مع التأكد من عدم وجود أي صفر لا فائدة له من الناحية اليسرى
else if (e.getSource() == b5)
{
if (isEqualClicked == true || textField.getText().equals("0"))
textField.setText("5");
else
textField.setText(textField.getText()+"5");
isEqualClicked = false;
isTextChanged = true;
noClickedOperator = true;
}
// عند النقر على الزر 6 سيتم إضافة 6 في مربع النص مع التأكد من عدم وجود أي صفر لا فائدة له من الناحية اليسرى
else if (e.getSource() == b6)
{
if (isEqualClicked == true || textField.getText().equals("0"))
textField.setText("6");
else
textField.setText(textField.getText()+"6");
isEqualClicked = false;
isTextChanged = true;
noClickedOperator = true;
}
// عند النقر على الزر 7 سيتم إضافة 7 في مربع النص مع التأكد من عدم وجود أي صفر لا فائدة له من الناحية اليسرى
else if (e.getSource() == b7)
{
if (isEqualClicked == true || textField.getText().equals("0"))
textField.setText("7");
else
textField.setText(textField.getText()+"7");
isEqualClicked = false;
isTextChanged = true;
noClickedOperator = true;
}
// عند النقر على الزر 8 سيتم إضافة 8 في مربع النص مع التأكد من عدم وجود أي صفر لا فائدة له من الناحية اليسرى
else if (e.getSource() == b8)
{
if (isEqualClicked == true || textField.getText().equals("0"))
textField.setText("8");
else
textField.setText(textField.getText()+"8");
isEqualClicked = false;
isTextChanged = true;
noClickedOperator = true;
}
// عند النقر على الزر 9 سيتم إضافة 9 في مربع النص مع التأكد من عدم وجود أي صفر لا فائدة له من الناحية اليسرى
else if (e.getSource() == b9)
{
if (isEqualClicked == true || textField.getText().equals("0"))
textField.setText("9");
else
textField.setText(textField.getText()+"9");
isEqualClicked = false;
isTextChanged = true;
noClickedOperator = true;
}
// سيتم إضافة نقطة (أي فاصلة) عند النقر على زر النقطة في حال لم يكن هناك نقطة أصلاً
else if (e.getSource() == comma)
{
if (isEqualClicked == true || textField.getText().isEmpty())
textField.setText("0.");
else if (!textField.getText().contains("."))
textField.setText(textField.getText()+".");
isEqualClicked = false;
isTextChanged = true;
}
// للإشارة إلى أنه يوجد عملية جمع operation و وضع القيمة 1 للمتغير num عند النقر على الزر + سيتم تخزين القيمة المدخلة في المتغير
else if (e.getSource() == plus && noClickedOperator == true)
{
// قبل أي شيء سيتم التأكد من أنه لا يوجد عملية قسمة سابقة لأي رقم على صفر, و إن وجدت سيتم عرض النص التالي في مربع النص
if (textField.getText().equals("0") && operandLabel.getText().equals("÷"))
textField.setText("cannot divide by 0");
// إذا كان هناك أي قيمة مدخلة في مربع النص أو كان هناك ناتج معروض لعملية سابقة فوق مربع النص سيتم تنفيذ التالي
else if (isTextChanged == true || oldValueLabel.getText().isEmpty()) {
try {
// إذا لم يكن هناك قيمة مدخلة حالياً في مربع النص num سيتم وضع 0 في المتغير
if (textField.getText().isEmpty())
num = 0;
// num إذا لم يكن مربع النص فارغاً سيتم وضع الرقم المدخل فيه في المتغير
else
num = Double.parseDouble(textField.getText());
// حتى لا يؤثر على عملية الجمع oldAnswer إذا لم يكن هناك أي ناتج ظاهر لعملية سابقة فوق مربع النص, سيتم وضع 0 في المتغير
if (oldValueLabel.getText().isEmpty()) {
operation = 1;
oldAnswer = 0;
}
// oldAnswer إذا كان يوجد ناتج ظاهر لعملية سابقة فوق مربع النص, سيتم تخزينه في المتغير
else
oldAnswer = Double.parseDouble(oldValueLabel.getText());
// و مسح النص الذي كان موجوداً في مربع النص oldValueLabel بعدها سيتم وضع ناتج العملية السابقة كنص للكائن
calculateOldAnswer();
operandLabel.setText("+");
oldValueLabel.setText(format.format(oldAnswer));
textField.setText("");
// calculateOldAnswer() للإشارة إلى أنه يجب جمع القيم المدخلة عند أول إستدعاء للدالة operation بعدها سيتم وضع 1 في المتغير
operation = 1;
}
catch(Exception ex) {
textField.setText("Error");
}
}
// في الأخير سيتم الإشارة إلى أنه تم النقر على إحدى الأزرار ÷ × - + و أن القيمة المدخلة في مربع النص قد تغيرت
isTextChanged = false;
noClickedOperator = false;
}
// للإشارة إلى أنه يوجد عملية طرح operation و وضع القيمة 2 للمتغير num عند النقر على الزر - سيتم تخزين القيمة المدخلة في المتغير
else if (e.getSource() == minus && noClickedOperator == true)
{
// قبل أي شيء سيتم التأكد من أنه لا يوجد عملية قسمة سابقة لأي رقم على صفر, و إن وجدت سيتم عرض النص التالي في مربع النص
if (textField.getText().equals("0") && operandLabel.getText().equals("÷"))
textField.setText("cannot divide by 0");
// إذا كان هناك أي قيمة مدخلة في مربع النص أو كان هناك ناتج معروض لعملية سابقة فوق مربع النص سيتم تنفيذ التالي
else if (isTextChanged == true || oldValueLabel.getText().isEmpty()) {
try {
// إذا لم يكن هناك قيمة مدخلة حالياً في مربع النص num سيتم وضع 0 في المتغير
if (textField.getText().isEmpty())
num = 0;
// num إذا لم يكن مربع النص فارغاً سيتم وضع الرقم المدخل فيه في المتغير
else
num = Double.parseDouble(textField.getText());
// حتى لا يؤثر على عملية الطرح oldAnswer إذا لم يكن هناك أي ناتج ظاهر لعملية سابقة فوق مربع النص, سيتم وضع 0 في المتغير
if (oldValueLabel.getText().isEmpty()) {
operation = 2;
oldAnswer = 0;
}
// oldAnswer إذا كان يوجد ناتج ظاهر لعملية سابقة فوق مربع النص, سيتم تخزينه في المتغير
else
oldAnswer = Double.parseDouble(oldValueLabel.getText());
// و مسح النص الذي كان موجوداً في مربع النص oldValueLabel بعدها سيتم وضع ناتج العملية السابقة كنص للكائن
calculateOldAnswer();
operandLabel.setText("-");
oldValueLabel.setText(format.format(oldAnswer));
textField.setText("");
// calculateOldAnswer() للإشارة إلى أنه يجب طرح القيم المدخلة عند أول إستدعاء للدالة operation بعدها سيتم وضع 2 في المتغير
operation = 2;
}
catch(Exception ex) {
textField.setText("Error");
}
}
// في الأخير سيتم الإشارة إلى أنه تم النقر على إحدى الأزرار ÷ × - + و أن القيمة المدخلة في مربع النص قد تغيرت
isTextChanged = false;
noClickedOperator = false;
}
// للإشارة إلى أنه يوجد عملية ضرب operation و وضع القيمة 3 للمتغير num عند النقر على الزر × سيتم تخزين القيمة المدخلة في المتغير
else if (e.getSource() == multiple && noClickedOperator == true)
{
// قبل أي شيء سيتم التأكد من أنه لا يوجد عملية قسمة سابقة لأي رقم على صفر, و إن وجدت سيتم عرض النص التالي في مربع النص
if (textField.getText().equals("0") && operandLabel.getText().equals("÷"))
textField.setText("cannot divide by 0");
// إذا كان هناك أي قيمة مدخلة في مربع النص أو كان هناك ناتج معروض لعملية سابقة فوق مربع النص سيتم تنفيذ التالي
else if (isTextChanged == true || oldValueLabel.getText().isEmpty()) {
try {
// إذا لم يكن هناك قيمة مدخلة حالياً في مربع النص num سيتم وضع 1 في المتغير
if (textField.getText().isEmpty())
num = 1;
// num إذا لم يكن مربع النص فارغاً سيتم وضع الرقم المدخل فيه في المتغير
else
num = Double.parseDouble(textField.getText());
// حتى لا يؤثر على عملية الضرب oldAnswer إذا لم يكن هناك أي ناتج ظاهر لعملية سابقة فوق مربع النص, سيتم وضع 1 في المتغير
if (oldValueLabel.getText().isEmpty()) {
operation = 3;
oldAnswer = 1;
}
// oldAnswer إذا كان يوجد ناتج ظاهر لعملية سابقة فوق مربع النص, سيتم تخزينه في المتغير
else
oldAnswer = Double.parseDouble(oldValueLabel.getText());
// و مسح النص الذي كان موجوداً في مربع النص oldValueLabel بعدها سيتم وضع ناتج العملية السابقة كنص للكائن
calculateOldAnswer();
operandLabel.setText("×");
oldValueLabel.setText(format.format(oldAnswer));
textField.setText("");
// calculateOldAnswer() للإشارة إلى أنه يجب ضرب القيم المدخلة عند أول إستدعاء للدالة operation بعدها سيتم وضع 3 في المتغير
operation = 3;
}
catch(Exception ex) {
textField.setText("Error");
}
}
// في الأخير سيتم الإشارة إلى أنه تم النقر على إحدى الأزرار ÷ × - + و أن القيمة المدخلة في مربع النص قد تغيرت
isTextChanged = false;
noClickedOperator = false;
}
// للإشارة إلى أنه يوجد عملية قسمة operation و وضع القيمة 4 للمتغير num عند النقر على الزر ÷ سيتم تخزين القيمة المدخلة في المتغير
else if (e.getSource() == divide && noClickedOperator == true)
{
// قبل أي شيء سيتم التأكد من أنه لا يوجد عملية قسمة سابقة لأي رقم على صفر, و إن وجدت سيتم عرض النص التالي في مربع النص
if (textField.getText().equals("0") && operandLabel.getText().equals("÷"))
textField.setText("cannot divide by 0");
// إذا كان هناك أي قيمة مدخلة في مربع النص أو كان هناك ناتج معروض لعملية سابقة فوق مربع النص سيتم تنفيذ التالي
else if (isTextChanged == true || oldValueLabel.getText().isEmpty()) {
try {
// إذا لم يكن هناك قيمة مدخلة حالياً في مربع النص num سيتم وضع 1 في المتغير
if (textField.getText().isEmpty())
num = 1;
// num إذا لم يكن مربع النص فارغاً سيتم وضع الرقم المدخل فيه في المتغير
else
num = Double.parseDouble(textField.getText());
if (oldValueLabel.getText().isEmpty())
oldAnswer = num;
else {
oldAnswer = Double.parseDouble(oldValueLabel.getText());
calculateOldAnswer();
}
// و مسح النص الذي كان موجوداً في مربع النص oldValueLabel بعدها سيتم وضع ناتج العملية السابقة كنص للكائن
operandLabel.setText("÷");
oldValueLabel.setText(format.format(oldAnswer));
textField.setText("");
// calculateOldAnswer() للإشارة إلى أنه يجب قسم القيم المدخلة عند أول إستدعاء للدالة operation بعدها سيتم وضع 4 في المتغير
operation = 4;
}
catch(Exception ex) {
textField.setText("Error");
}
}
// في الأخير سيتم الإشارة إلى أنه تم النقر على إحدى الأزرار ÷ × - + و أن القيمة المدخلة في مربع النص قد تغيرت
isTextChanged = false;
noClickedOperator = false;
}
// = هنا قمنا بتحديد ما يحدث عند النقر على الزر
else if (e.getSource() == equal)
{
// إذا كان يوجد قيمة في مربع النص و قيمة سابقة ظاهرة فوقه سيتم حساب ناتجهم و عرض الناتج في مربع النص
if (!textField.getText().isEmpty() && !oldValueLabel.getText().isEmpty() && isEqualClicked == false) {
double a = Double.parseDouble(oldValueLabel.getText());
double b = Double.parseDouble(textField.getText());
char operand = operandLabel.getText().charAt(0);
switch (operand) {
case '+':
answer = a + b;
textField.setText(format.format(answer));
break;
case '-':
answer = a - b;
textField.setText(format.format(answer));
break;
case '×':
answer = a * b;
textField.setText(format.format(answer));
break;
case '÷':
if (b == 0)
textField.setText("cannot divide by 0");
else {
answer = a / b;
textField.setText(format.format(answer));
}
break;
}
}
// إذا لم تكن هناك قيمة في مربع النص و كانت هناك قيمة سابقة ظاهرة فوقه سيتم وضعها في مربع النص
else if (textField.getText().isEmpty() && !oldValueLabel.getText().isEmpty())
textField.setText(oldValueLabel.getText());
// في الأخير سيتم مسح قيمة العملية السابقة و العامل الموضوعين فوق مربع النص لإظهار النتيجة النهائية فقط
oldValueLabel.setText("");
operandLabel.setText("");
// = بالإضافة إلى الإشارة إلى أنه لم يتم النقر على إحدى الأزرار ÷ × - + و أنه تم النقر على الزر
isEqualClicked = true;
noClickedOperator = true;
}
// عند النقر على الزر ← سيتم مسح رقم واحد من مربع النص أو مسح أي خطأ ظاهر
else if (e.getSource() == back)
{
if (textField.getText().equals("Error") || textField.getText().equals("cannot divide by 0"))
textField.setText("");
else if (!textField.getText().isEmpty())
textField.setText(textField.getText().substring(0, textField.getText().length() - 1));
}
// سيتم مسح كل شيء ظاهر و تصفير جميع القيم المخزنة للبدء من جديد C عند النقر على الزر
else if (e.getSource() == clear) {
oldValueLabel.setText("");
textField.setText("");
operandLabel.setText("");
oldAnswer = 0;
num = 0;
noClickedOperator = true;
}
}
};
// الموجودة فيه كلما تم النقر على زر actionPerformed() حتى يتم إستدعاء الدالة actionListener هنا قمنا بربط جميع الأزرار بالكائن
b0.addActionListener(actionListener);
b1.addActionListener(actionListener);
b2.addActionListener(actionListener);
b3.addActionListener(actionListener);
b4.addActionListener(actionListener);
b5.addActionListener(actionListener);
b6.addActionListener(actionListener);
b7.addActionListener(actionListener);
b8.addActionListener(actionListener);
b9.addActionListener(actionListener);
comma.addActionListener(actionListener);
plus.addActionListener(actionListener);
multiple.addActionListener(actionListener);
divide.addActionListener(actionListener);
minus.addActionListener(actionListener);
equal.addActionListener(actionListener);
clear.addActionListener(actionListener);
back.addActionListener(actionListener);
// هنا قمنا بتحديد بعض خصائص النافذة و جعلناها مرئية
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("Calculator");
setSize(263, 300);
setLocationRelativeTo(null);
setResizable(false);
setLayout(null);
setVisible(true);
}
// فقط createAndShowGUI() سيقوم الكونستركتور بإستدعاء الدالة Main عند إنشاء كائن من الكلاس
public Main() {
createAndShowGUI();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
// التي ستنشئ النافذة createAndShowGUI() و بالتالي سيتم إستدعاء الدالة Main هنا قمنا بإنشاء كائن من الكلاس
new Main();
}
});
}
}