المؤلف: BUILDER.COM
يوفر JSP العديد من الأدوات البسيطة والعملية، بما في ذلك قراءة البيانات من قاعدة البيانات، وإرسال البيانات، والقدرة على عرض النتائج في مخطط دائري. الآن دعونا نلقي نظرة على هذه الطريقة البسيطة والعملية.
ما تحتاجه
لتشغيل الأمثلة المتعلقة بهذه المقالة بشكل صحيح، يجب أن تحتاج إلى JDK 1.2 أو أعلى، ونظام إدارة قواعد البيانات العلائقية، وخادم شبكة JSP. لقد قمت بتصحيح هذه الأمثلة في Tomcat، واستخدمت أيضًا فئات com.sun.image.codec.jpeg التي تم إصدارها بواسطة Sun Java 2 SDK.
تصميم قاعدة البيانات لنفترض أنك تعمل في شركة تبيع الفواكه الطازجة، وتشمل الفواكه التي تبيعها الشركة: التفاح والبرتقال والعنب. الآن يريد رئيسك استخدام رسم بياني على شكل دائري لعرض إجمالي حجم المبيعات لكل نوع من الفاكهة. يمكن للرسم البياني على شكل دائري أن يجعل مبيعات كل منتج واضحة في لمحة، ويمكن لرئيسك فهم معاملات منتجات الشركة بسرعة. .
يستخدم الجدول A قائمتين من قواعد البيانات من هذه المقالة. تحتوي القائمة الأولى (المنتجات) على أسماء جميع المنتجات المباعة؛ أما القائمة الثانية (المبيعات) فتحتوي على حجم المبيعات المقابل لكل منتج.
تحتوي قائمة المنتجات على حقلين: معرف المنتج واسم المنتج. تحتوي قائمة المبيعات على معرف البيع ومعرف المنتج والمبلغ الإجمالي. يوفر معرف المنتج الموجود في قائمة المبيعات الارتباط بين القائمتين. تحتوي الإجماليات الموجودة في قائمة المبيعات على المبلغ النقدي لكل عملية بيع كرقم نقطة عائمة.
تربط طريقة getProducts() في الجدول B قاعدتي بيانات وتحفظ جميع أسماء المنتجات في مصفوفة. لقد قمت بتعيين قواعد قاعدة البيانات التالية:
معرف المنتج هو الأكثر تميزًا في قائمة المنتجات، وهو كذلك والأكثر أهمية أيضًا؛
ProductID له قيمة 0 للسجل الأول؛
تكون كافة السجلات المتتالية اللاحقة تراكمية، لذا فإن معرف المنتج للسجل الثاني هو 1، ومعرف المنتج للسجل الثالث هو 2، وهكذا.
تسمح قواعد قاعدة البيانات هذه بتخزين البيانات في مصفوفة المنتج، كما هو موضح أدناه:
arr[rs.getInt("productID")] = rs.getString("productname");
تسمح بعض أنظمة إدارة قواعد البيانات بالتخزين التلقائي للبيانات بشكل افتراضي. التجميع أو الفرز التلقائي. عندما تقوم بتصميم قاعدة بيانات، تأكد أولاً من معرفة القواعد التي يتبعها نظام إدارة قاعدة البيانات لديك، مثل التراكم التلقائي، والفرز التلقائي، وما إلى ذلك.
الحصول على حجم المبيعات الإجمالي
في معظم الحالات، سيكون هناك العديد من السجلات في قائمة المبيعات، لذا فإن الوصول السريع والفعال إلى قاعدة البيانات مهم جدًا. الآن نحتاج فقط إلى الوصول إلى إجمالي المبيعات لكل منتج في قاعدة البيانات.
تتصل طريقة getSales() في الجدول C بقاعدة البيانات وتقوم بإرجاع مصفوفة تحتوي على إجمالي مبيعات كل منتج. عندما يجتاز getSales() جميع السجلات، فإنه يخزن فقط حجم المبيعات الجديد لكل منتج:
int Product = rs.getInt("productID");
arr[product] += rs.getFloat("amount");
يجب أن يتم عرض كل منتج على المخطط الدائري بلون مختلف. من أجل تحقيق هذا الغرض، نقوم بإنشاء كائن فطيرة اللون (كما هو موضح في الجدول د). يحتوي هذا الكائن على مجموعة من الألوان ذات الصلة:
ColorpieColorArray[] = {new Color(210,60,60), new Color(60,210, 60 )...}
تحدد فئةpieColor طريقة setNewColor()، والتي يمكنها زيادة curPieColor والفهرس. وفي الوقت نفسه، يمكنها التحقق من أن الفهرس لا يتجاوز نطاق الحدود، أي أن الطريقة المستخدمة هي: إذا كان curPieColor كبيرًا جدًا، فسيتم تعيين قيمة 0.
بشكل أكثر كفاءة، يقوم setNewColor() بالتكرار خلال كل لون وينفذ التعليمات البرمجية التالية على اللون الأول:
curPieColor++;
إذا (curPieColor >=pieColorArray.length)
{curPieColor = 0؛}
RenderingHints وفئات الحواف
تحدد الفئة java.awt.RenderingHints العديد من الأساليب لعرض الرسومات ثنائية الأبعاد، بما في ذلك أساليب alpha_interpolation، والثبات، والتحسين. تساعد RenderingHints في تحديد كيفية عرض الرسومات وكيفية معالجة الرسومات بشكل أفضل.
لعرضه بسلاسة، يمكنك استخدام طريقة الحواف لمعالجة الرسومات الدائرية. الحواف هي طريقة لتجانس الرسومات. تقوم الخوارزمية بتحديد قيمة اللون لبكسل خاص واستبدال بكسل التقاطع، وبالتالي تسهيل تقاطع الخطوط.
يوضح الشكل (أ) تأثير طريقة الصقل. يمكن ملاحظة أن تقاطع خطوط الرسم البياني الدائري باستخدام طريقة الحواف يصبح سلسًا للغاية.
الشكل (أ)
في الوقت نفسه، يمكنك أيضًا إنشاء كائن RenderingHints وتمريره إلى طريقة Graphics2D setRenderingHints()، كما هو موضح أدناه:
RenderingHints renderHints = new RenderingHints(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHints(renderHints);
إنشاء حدود قابلة للتعديل
الشكل الدائري في الشكل (أ) له حدود. كيف يمكنني تغيير حجم الحدود؟ يمكنك أولاً تحديد int border = 10، ثم حساب حجم المنطقة داخل الحدود لتحقيق:
Ellipse2D.Double elb = new Ellipse2D.Double(x_pie - border/2, y_pie - border/2,pieWidth + border,pieHeight + border);
x_pie تمثل قيمة y_pie الزاوية اليسرى العليا من المربع المحيط بالشكل الدائري. نحصل على مركز الشكل الدائري بأخذ نصف مساحة الحدود (الحدود/2).
نظرية القوس (Arc) توفر طريقة fillArc() الموروثة من فئة java.awt.Graphics طريقة بسيطة لرسم أجزاء مختلفة (أو أقواس) من الرسومات على شكل دائري:
g2d.fillArc(x_position, y_position, width, height, startAngle ، sweepAngle)؛
تمثل الأعداد الصحيحة x_position وy_position إحداثيات x وy للزاوية اليسرى العليا للقوس المراد ملؤه، وتمثل الأعداد الصحيحة للعرض والارتفاع حجمه المحدد. إذا كانت قيم العرض والارتفاع متساوية، فسيكون المخطط الدائري عبارة عن دائرة. إذا لم يكن العرض والارتفاع متساويين، فسيكون المخطط الدائري عبارة عن قطع ناقص.
تحدد طريقة fillArc () حجم القوس بناءً على قيمة العدد الصحيح لـ SweepAngle. إذا كانت قيمة SweeAngle موجبة، فسيتم رسم القوس في اتجاه عكس اتجاه عقارب الساعة، وإلا فسيتم رسمه في اتجاه عقارب الساعة.
الخطوة الأولى في رسم القوس هي استخدام طريقة getPieColor() لكائنpieColor للحصول على لون أقرب قوس على شكل دائري وتعيينه للقوس الحالي:
g2d.setColor(pc.getPieColor())
; ، من خلال مصفوفة المبيعات المستمرة[] وتجميعها للحصول على إجمالي حجم المبيعات:
salesTotal += sales[i];
باستخدام إجمالي حجم المبيعات، يمكنك حساب النسبة المئوية لمبيعات كل منتج في إجمالي حجم المبيعات:
float perc = (sales [i]/salesTotal);
نحسب زاوية الاجتياح لتعيين درجات لكل جزء من القوس:
int
SweepAngle = (int)(perc * 360);
إلى زاوية الاجتياح الحالية. وهذا يضمن أن جزء القوس الحالي يبدأ من القوس السابق، وبالتالي إنشاء شكل دائري كامل.
عرض الأيقونات توفر الأيقونات أبسط طريقة لعرض الأجزاء المختلفة للرسم البياني الدائري. يجب أن يتوافق حجم الرمز مع الكمية المشغولة في المخطط الدائري.
يعرض الشكل (ب) رسمًا بيانيًا دائريًا كاملاً والأيقونات المقابلة لكل جزء، بما في ذلك اسم المنتج وإجمالي حجم المبيعات وحصة كل جزء.
الصورة ب
ملخص
توضح هذه المقالة كيفية استخدام JSP لرسم أساليب وخوارزميات الرسومات الدائرية. هذه الأساليب والخوارزميات بسيطة وعملية، ويمكن للمطورين الاستفادة الكاملة من هذه الأساليب.