الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

سؤال وجواب رقم 1 (قم بقراءة صورة من النت وإظهارها علي الـ Frame)

بدأه (الخوارزمي) في 14 أغسطس 2011 · 7 رد · 604 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

سؤال وجواب 1 (قم بقراءة صورة من النت وإظهارها علي الـ Frame)

السلام عليكم ورحمة الله وبركاته

هذا الدرس بسيط جدا وهو موجه لمن لديهم دراية بسيطة باللغة

الهدف منه هو برمجة البرنامج بحيث يظهر صورة من النت علي الـ Frame الأساسية في البرنامج

الخطوات

  1. نصنع الـ Frame الأساسية الخاصة بالبرنامج
  2. نصنع الـ Panel التي سنضع عليها الصورة
  3. قراءة الصورة من النت ورسمها علي الـ Panel
  4. وضع الـ Panel علي الـ Frame

الشرح

1-صنع الـ Frame

أول شئ سنصنع Class يرث JFrame


class MainFrame extends JFrame
{
public MainFrame()
{
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(400, 380);
setResizable(false);
setLocationRelativeTo(null);
setTitle("Good kick");
}
}

بعد ذلك نأخد منه Object في الـ Main

ثم ننادي علي الـ Method التي تظهره وهى setVisible

وإذا لم نناديها ونعطيها True فسيكون الـ Frame خفيا ولن يظهر


public class AddingDesign
{
public static void main(String [ ] args)
{
MainFrame mf=new MainFrame();
mf.setVisible(true);
}
}

2-صنع الـ Panel التي سنضع عليها الصورة

الآن سنصنع الـ Class الخاص بالـ panel


class paintImg extends JPanel
{

}

3-بعد أن صنعنا الـ Class نريد أن نرسم عليه الصورة

حسنا لكي نرسم علي الـ panel نحتاج إلي Method تقوم بهذا

هذه الـ Method اسمها paint وهي موجودة في الـ Class JPanel اذا ينبغي أن نقوم بعمل override لها

وهى تأخذ شئ من نوع Graphics وليس لها Return


class paintImg extends JPanel
{
@Override
public void paint (Graphics g)
{

}
}

الـ object الذي أخذناه من الـ Graphics فيه الكثير من الـ Methods ومنهم واحدة اسمها drawImage وهى المسؤلة عن رسم الصورة

هذه الـ Method تأخذ شئ من نوع Image ثم الإحداثيات التي يبدأ من عندها رسم الصورة ثم الـ imageObserver ولا داعي لاستعماله اليوم

حسنا كيف نصنع سئ من نوع Image

اقرأ الكود التالي سريعا


class paintImg extends JPanel
{
@Override
public void paint (Graphics g)
{
try
{
URL imgURL=new URL("http://images.paraorkut.com/img/funnypics/images/s/soccer_ball-12227.jpg");
Image img=ImageIO.read(imgURL);
g.drawImage(img,0,0,null);
}
catch(Exception exc1){System.out.println(exc1.getMessage());}
}
}

أنت ترى الآن شيئ غريبا من نوع URL ... لا تقلق فالموضوع ببسابطة هو أنك تصنع شئ تسميه imgURL يخزن رابط الصورة

والسطر الذي يليه يصنع شئ من نوع Image و الـ read () تقوم بقراءة الصورة من الرابط وتحولها لشئ من نوع Image

وبعد ذلك نقوم برسمها

4-وضع الـ Panel علي الـ Frame

صحيح أننا قد رسمنا الصورة ولكن ذلك لا يعني أنها ستظهر على الـ Frame ...لماذا ؟

لأننا رسمنا الصورة علي الـ Panel ولم نقم بوضعه بعد علي

ولكي نضع الـ Panel علي الـ Frame ينبغي أن نأخذ object من الـ Panel وبعد ذلك نضع هذا الـ object علي الـ Frame


class MainFrame extends JFrame
{
public MainFrame()
{
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(400, 380);
setResizable(false);
setLocationRelativeTo(null);
setTitle("Good kick");

paintImg pi=new paintImg();
add(pi);
}
}

دعونا ننظر الآن إلي الكود الكلي


package applcation;

import java.awt.Graphics;
import java.awt.Image;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Applcation
{
public static void main(String [ ] args)
{
MainFrame mf=new MainFrame();
mf.setVisible(true);
}
}

class MainFrame extends JFrame
{
public MainFrame()
{
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(400, 380);
setResizable(false);
setLocationRelativeTo(null);
setTitle("Good kick");

paintImg pi=new paintImg();
add(pi);
}
}

class paintImg extends JPanel
{
@Override
public void paint (Graphics g)
{
try
{
URL imgURL=new URL("http://images.paraorkut.com/img/funnypics/images/s/soccer_ball-12227.jpg");
Image img=ImageIO.read(imgURL);
g.drawImage(img,0,0,null);
}
catch(Exception exc1){System.out.println(exc1.getMessage());}
}
}

إن كان من توفيق فمن الله وإن كان من خطأ فمني ومن الشيطان

تقبل الله صيامكم :)

3
#2

اقترح عدم تحميل الصورة في paint لأن هذه العملية قد تستغرق وقتاً وهذا من شأنه أن يوقف البرنامج الخاص بك برهة من الزمن

خصوصاً و swing ليست thread safe

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#3
class paintImg extends JPanel
{
    @Override
    public void paint (Graphics g)
    {
        try
        {
        URL imgURL=new URL("http://images.paraorkut.com/img/funnypics/images/s/soccer_ball-12227.jpg");
        Image img=ImageIO.read(imgURL);
        g.drawImage(img,0,0,null);
        }
        catch(Exception exc1){System.out.println(exc1.getMessage());}
    }
}

هذه كارثة

1 - لانه سيتم ايقاف Event dispatching thread طوال فترة التحميل

2- سيعيد تحميل الصورة لكل Repaint

-----

هذه الطريقة قد تكون افضل

class paintImg extends JPanel {

        Image img;

        public paintImg() {
            new Thread(new Runnable() {

                public void run() {
                    try {
                        URL imgURL = new URL("http://images.paraorkut.com/img/funnypics/images/s/soccer_ball-12227.jpg");
                        img = ImageIO.read(imgURL);
                        revalidate();
                    } catch (IOException ex) {
                        ex.printStackTrace();
                    }
                }
            }).start();
        }

        @Override
        public void paint(Graphics g) {
            if (img != null) {
                g.drawImage(img, 0, 0, null);
            }
        }
    }

تم تعديل هذه المشاركة بواسطة .S.T.A.L.K.E.R في 15 أغسطس 2011 في 14:01

1
#4

شكرا لكما أخي .S.T.A.L.K.E.R وأخي علاء

فاستعمال الـ Multithreading لا غني عنه بالفعل

أخي الفاضل h.S.T.A.L.K.E.R أظن بما أننا استخدمنا الـ Multithreading فقد نحتاج إلي استخدام جملة repaint ليصبح الكود هكذا


try
{
URL imgURL = new URL("http://images.paraorkut.com/img/funnypics/images/s/soccer_ball-12227.jpg");
img = ImageIO.read(imgURL);
repaint();
revalidate();
}

صراحة لست أعرف تأثير الـ repaint علي الـ Memory لكن الصورة لن تظهر بدونها

لن تظهر إلا بعمل resize أو عمل Minimize ثم Maximizeلكي ننفذ الـ ()Paint

والله الموفق

#5

هذا الحل أيضاً سيؤدي إلى قصة طويلة عريضة لأنك تحدث swing من خيط آخر و swing ليست محمية ضد تعدد الخيوط not thread safe

عمليات التعديل على swing أو التحديث يجب أن تكون داخل SwingUtilities.invokeLater

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#6

انظر هذا الموضوع

وسوف يظهر لك كل شئ

/index.php?showtopic=227194

عملت مثلك فالاول لكن تم تعديل ذلك شوف الموضوع وانت هتعرف

Software Developer
Mahmoudkelany.com


 

#7
علاء الصالحي كتب:

هذا الحل أيضاً سيؤدي إلى قصة طويلة عريضة لأنك تحدث swing من خيط آخر و swing ليست محمية ضد تعدد الخيوط not thread safe

عمليات التعديل على swing أو التحديث يجب أن تكون داخل SwingUtilities.invokeLater

تحياتي

سحب الصورة يجب ان يكون في Thread منفصل

لكن عند استدعاء اي Method سوف تؤثر بخصاص ال JPanel يجب استدعائها كما انت اشرت

بمعنى

نستخدم Thread

لكن بعد الانتهاء من سحب الصورة نقوم باستخدام ال SwingUtilities.invokeLater لوضع هذه الصورة لل JPanel

#8

زهذا ما قصدته يا حج محمد :)

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…