خطوة بخطوة لبرمجة مدير تحميل المفات EgyDownloadManager بلغة الجافا واستخدام NetBeans

استعرض الموضوع السابق استعرض الموضوع التالي اذهب الى الأسفل

خطوة بخطوة لبرمجة مدير تحميل المفات EgyDownloadManager بلغة الجافا واستخدام NetBeans

مُساهمة من طرف أحمد مناع في الأحد أبريل 28, 2013 2:15 pm

بسم الله الرحمن الرحيم
أهلا وسهلا بكم إخوانى الكرام فى شرح إنشاء تطبيق جديد بلغة الجافا و بإستخدام بنية NetBeans ...اليوم أن شاء الله تعالى سنتعلم سويا كيفية إنشاء تطبيق لتحميل الملفات المختلفة من الانترنت مشروعنا قمت بتسمية EgyDownloadManager ولك حرية الاختيار فى اختيار الاسم المناسب لك كما فى الصورة التالية ....



كما أن هذا المشروع سيتكون من عدد 4 فئات أو كلاس...كل ما اريده منك أن تتبع الخطوات التالية :

1_ قم بفتح NetBeans لإنشاء مشروع جديد مع عدم تحديد الخيار create main classe اثناء انشاء المشروع .

2_ قم بإضافة نافذة وذلك من خلال تحديد ايفونة المشروع ثم كليك يمين بالماوس ثم New ثم jfarme ليظهر لك مربع لوضع اسم برمجى للنافذة قم بتسميتها بأسم DownloadManager وذلك كما فى الصور التالية :





3_قم بوضع المكون JTextField على تلك النافذة مع تغير الاسم البرمجى الى addTextField

4_ قم بوضع عدد 5 زر أمر JButton مع أستخدام الخصائص التالية :



JButton1

Variable Name: Add

إبدء : Text




JButton2

Variable Name: pauseButton

إيقاف مؤقت : Text



JButton3

Variable Name: resumeButton

إستئناف : Text




JButton4

Variable Name: cancelButton

إلغاء : Text



JButton5

Variable Name: clearButton

مسح : Text


5_ قم بإضافة المكون JTable مع تغير الاسم البرمجى الى table و رسمه على النافذة كما فى الشكل التالى :





ثانيا : كتابة الشفرة

قبل كتابة أى شفرة داخل تلك النافذة سنقوم الاول بإنشاء الفئات الثلاث التالية

1_ إنشاء الفئة أو الكلاس Download .....وسيحتوى هذا الكلاس كافة التعليمات البرمجية التى تقوم بتحميل ملف من رابط معين و ذلك باتباع الخطوات التالية :

( أ ) _ نقوم بتحديد ايقونة المشروع ثم كليك يمين ومن القائمة التى ستظهر نختار الامر New ثم الامر Java Classe لتفتح لك نافذه تطالبك بوضع اسم الكلاس ....قم بوضع اسم الكلاس Download ثم انقر Finsh كما فى الصورة التالية :






(ب)_بعد الانتهاء من إنشاء الكلاس Download لن تجد فى صفحة الشفرة الخاصة به غير الكود التالى :

الرمز:

class Download {


}

لذلك سنقوم بكتابة الاكواد اللازمة و هى على النحو التالى :

_ إستيراد المكتبات اللازمة

الرمز:

import java.io.*;
import java.net.*;
import java.util.*;


_ سنقوم بإضافة الجملة extends Observable implements Runnable الى الشفرة الخاصة بإنشاء هذا الكلاس لصيبح الكود الكامل كما يلى :

الرمز:


class Download extends Observable implements Runnable {

_ نقوم بالاعلان عن ثابت MAX_BUFFER_SIZE لتمثيل الحد الاقصى لحجم كل جزء من الملف مما يساعد على سرعة التحميل و ذلك باستخدام الكود التالى :

الرمز:
  private static final int MAX_BUFFER_SIZE = 1024;

_ نقوم بالاعلان عن متغير نصى وليكن STATUSES لتمثيل أسماء حالة التحميل من الانترنت مثل إيقاف و إستئناف ...الخ وذلك باستخدام الكود التالى :

الرمز:
public static final String STATUSES[] = {"Downloading",
    "Paused", "Complete", "Cancelled", "Error"};

_ نقوم بإلاعلان عن الثوابت لتمثيل حالة التحميل _وليس تمثيل أسمائها كما فى الكود اعلاه _ وذلك من خلال الكود التالى :

الرمز:
 public static final int DOWNLOADING = 0;
    public static final int PAUSED = 1;
    public static final int COMPLETE = 2;
    public static final int CANCELLED = 3;
    public static final int ERROR = 4;

_ نقوم ايضا بالاعلان عن المتغيرات التالية :

الرمز:
private URL url;
    private int size;
    private int downloaded;
    private int status;

فى السطر الاول قمنا بالاعلان عن الكائن url والذى سوف يستخدم فى فتح الاتصال بالملف للتحميل وذلك من خلال الكائن URL وهو أحد الكائنات التابعة للمكتبة java.net .....فى السطر الثانى قمنا بالاعلان عن المتغير size لتخزين حجم الملف ......و المتغير downloaded لتخزين عدد وحدات البايت التى تم تحميلها ....أما المتغير status لتخزين حالة التحميل الحالية

_ نقوم ببناء المشيد الخاص بالكلاس Download و ذلك باستخدام الكود التالى :

الرمز:
 public Download(URL url) {
   
    }


ويجب ملاحظة أن المشيدات عموما لابد ان تكون لها نفس أسم الكلاس الخاص بها
_ بداخل المشيد الذى تم بناءه إعلاه سنقوم بكتابة الكود التالى :

الرمز:

 this.url = url;
        size = -1;
        downloaded = 0;
        status = DOWNLOADING;
             
        download();


السطر الاخير من الكود السابق download(); هى عبارة عن طريقة سوف يتم إنشائها فيما بعد

_ سنقوم بإنشاء طريقة للحصول على رابط الملف المراد تحميلة بالكود التالى :

الرمز:
public String getUrl() {
        return url.toString();
    }

_نقوم ايضا بإنشاء طريقة للحصول على حجم الملف المراد تحميله بالكود التالى :

الرمز:
public int getSize() {
        return size;
    }
_ نقوم بإنشاء طريقة للحصول على حالة التحميل وذلك من خلال الكود التالى :

الرمز:
public int getStatus() {
        return status;
    }

_ نقوم بإنشاء طريقة للحصول على قيمة التقدم او عدد الوحدات التى تم تحميلها من الملف باستخدام الكود التالى :

الرمز:
 public float getProgress() {
        return ((float) downloaded / size) * 100;
    }

ويمكنك ملاحظة أن الطرق السابقة تعود بقيمة لذلك استخدمنا الامر return ....كما أن الطريقة الاخيرة قمنا بقسمة حجم المحمل على حجم الملف مضروبه فى 100 حتى يكون الناتج بنسبة مئوية لاستخدمها فى شريط التقدم فيما بعد

_ سنقوم بإنشاء عدد 4 طرق أخرى وهى الخاصة بحالة التحميل باستخدام الكود التالى :

الرمز:
  public void pause() {
        status = PAUSED;
        stateChanged();
    }
 
 
    public void resume() {
        status = DOWNLOADING;
        stateChanged();
        download();
    }
 
 
    public void cancel() {
        status = CANCELLED;
        stateChanged();
    }
 
 
    private void error() {
        status = ERROR;
        stateChanged();
    }
   

_ سنقوم بإنشاء الطريقة download والتى قد تم استخدامها فى الطرق السابقة وهى الخاصة ببدء أو إستئناف التحميل فى حالة توقفة و ذلك باستخدام الكود التالى :

الرمز:
 private void download() {
        Thread thread = new Thread(this);
        thread.start();
    }

_سنقوم بإنشاء طريقة للحصول على أسم الملف من رابط التحميل ....بإستخدام الكود التالى :

الرمز:
private String getFileName(URL url) {
        String fileName = url.getFile();
        return fileName.substring(fileName.lastIndexOf('/') + 1);
    }

_ نقوم بإنشاء طريقة لاخطار المراقبين observers بإن حالة التحميل قد تغيرت وذلك بأستخدام الكود التالى :

الرمز:
private void stateChanged() {
        setChanged();
        notifyObservers();
    }

وهذه الطريقة هى التى من اجلها وضعنا الامر extends Observable implements Runnable لاتمام إنشاء هذا الكلاس

_ واخر شىء سنقوم به فى هذا الكلا هو إنشاء الطريقة void run المسؤلة عن تحميل الملفات و ذلك بأستخدام الكود التالى :

الرمز:


 public void run() {
        RandomAccessFile file = null;
        InputStream stream = null;
     
    try {
        HttpURLConnection connection =(HttpURLConnection) url.openConnection();
         
        connection.setRequestProperty("Range","bytes=" + downloaded + "-");
         
        connection.connect();
         
    if (connection.getResponseCode() / 100 != 2) {error();
            }
         
      int contentLength = connection.getContentLength();
            if (contentLength < 1) {error();}
         
   
            if (size == -1) {
                size = contentLength;
                stateChanged();
            }
         
       
            file = new RandomAccessFile(getFileName(url), "rw");
            file.seek(downloaded);
         
            stream = connection.getInputStream();
            while (status == DOWNLOADING) {
     
                byte buffer[];
                if (size - downloaded > MAX_BUFFER_SIZE) {
                    buffer = new byte[MAX_BUFFER_SIZE];
                } else {
                    buffer = new byte[size - downloaded];
                }
             
           
                int read = stream.read(buffer);
                if (read == -1)
                    break;
             
       
                file.write(buffer, 0, read);
                downloaded += read;
                stateChanged();
            }
         
   
            if (status == DOWNLOADING) {
                status = COMPLETE;
                stateChanged();
            }
        } catch (Exception e) {
            error();
        } finally {
       
            if (file != null) {
                try {
                    file.close();
                } catch (Exception e) {}
            }
         
         
            if (stream != null) {
                try {
                    stream.close();
                } catch (Exception e) {}
            }
        }
    }


شرح الكود ...

السطر الاول ...قمنا بالاعلان عن الكائن file على أنه مشتق من الكائن RandomAccessFile وهو أحد الكائنات التابعة اللفئة java.io و وظيفته السماح للوصول الى أى ملف للقرءاة منه أو الكتابة الية بأستخدام الكائنات InputStream أو OutputStream

السطر الثانى ...قمنا بالاعلان عن الكائن stream على أنه احد الكائنات المشتقه من الكائن InputStream و الذى يقوم بقراءة محتويات ملف ما بأستخدام تدفقات البايت

السطر الثالث ...قمنا بالاعلان عن الكائن connection على أنه مشتق من الكائن HttpURLConnection وهو أحد الكائنات التابعة للفئة java.net لفتح اتصال مع الملقم HTTP ثم جعلنا يقوم بفتح الرابط المحدد


السطر الرابع ...هو لتحديد جزء من الملف للتحميل ....

السطر الخامس connection.connect....هو للاتصال بالسرفر الموجود عليه الملف المراد تحميله

السطر السادس ....جملة شرطية للتأكد من زمن استجابة السرفر للطلب فى حدود 200

السطر السابع و الثامن ...قمنا بالاعلان عن المتغير contentLength وذلك لتخزين طول الملف الموجود على الرابط باستخدام الامر connection.getContentLength ليتم الحصول عليه ...ثم استخدمنا جملة شرطية للتأكد أن هذا المحتوى صالح وليس أقل من الصفر .

السطر التاسع ...أستخدمنا جملة شرطية لجب قيمة المتحوى المخزن فى المتغير contentLength ووضعة فى المتغير size بالاضافة الى تشغيل الطريقة stateChanged


أما من السطر العاشر و حتى نهاية الكلاس ...فهو اشتقاق كائن جديد RandomAccessFile لبدء عملية الوصول للملف وقد حددنا بأستخدام الامر getFileName(url) أما كلمة "rw" والتى تعنى السماح للوصول للملف للقراءة و الكتابة reading and writing .....ثم
بدء عملية فتح الملف للقراءة منه ....وايضا قمنا عمل حلقة تكرارية و ذلك
لتقسيم الملف الى1024 بايت والتى تساوى واحد ميجا لتنزيل لكل ميجا على حده و
ذلك لتسريع عملية التحميل

2_إنشاء الكلاس أو الفئة DownloadsTableModel ....
وهذا الكلاس الهدف من إنشائه هو احتواءه على التعليمات البرمجية التى تؤدى
الى تنسيق الجدول الذى قمنا بإنشائه على النافذة الرئسية لاظهار أسم
الرابط وحجم الملف وشريط التقديم ....الخ .....وذلك على النحو التالى :

_ نقوم بتحديد ايقونة المشروع ثم كليك يمين ومن القائمة التى ستظهر نختار الامر New ثم الامر Java Classe لتفتح لك نافذه تطالبك بوضع اسم الكلاس ....قم بوضع اسم الكلاس DownloadsTableModel ثم انقر
Finsh

_ بعد الانتهاء من إنشاء هذا الكلاس ستجد صفحة الكود الخاص به ليس فيه اى أكواد غير كود إنشاءه فقط كما يلى :

الرمز:
class DownloadsTableModel

قم بإضافة الامر extends AbstractTableModel implements Observer الى الكود السابق ليصبح كما يلى :

الرمز:
class DownloadsTableModel extends AbstractTableModel implements Observer{
 
}

_ نقوم بإستيراد المكتبات اللازمة و ذلك بإستخدام الكود التالى :

الرمز:
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;

_ بعد ذلك نقوم بالاعلان عن الثوابت التالية لتمثيل أعمدة الجدول ....وذلك كما يلى :

الرمز:

    private static final String[] columnNames = {"الحالة", "شريط التقدم",
    "حجم الملف", "رابط الملف"};
 

_ الاعلان عن القيم التى سيتم وضعها فى كل عمود ....وذلك باستخدام الكود التالى :

الرمز:
 private static final Class[] columnClasses = {String.class,
    JProgressBar.class,String.class, String.class};

_ إنشاء قائمة مصفوفات downloadList و التى تمثل قائمة التحميل فى الجدول وذلك بأستخدام الكود التالى :

الرمز:
private ArrayList downloadList = new ArrayList();

_ نقوم بإنشاء الطريقة addDownload وهى لاضافة تحميل جديد فى جدول التحميلات ...باستخدام الكود التالى :

الرمز:
public void addDownload(Download download) {
     
      download.addObserver(this);
     
      downloadList.add(download);
     
      fireTableRowsInserted(getRowCount() - 1, getRowCount() - 1);
    }

السطر
الاول و الثانى داخل الطريقة ...وظيفته هو إعلامك عند وجود تحميل من خلال
الامر Observer .....السطر الثانى اطلاق صف إعلام الإدراج إلى الجدول

_ نقوم بإنشاء الطريقة getDownload من الفئة Download للحصول على بيانات التحميل للصف المحدد ...باستخدام الكود التالى :


الرمز:
public Download getDownload(int row) {
        return (Download) downloadList.get(row);
    }

_ نقوم بإنشاء الطريقة clearDownload لازالة بيانات التحميل للصف المحدد ....بإستخدام الكود التالى :

الرمز:
public void clearDownload(int row) {
        downloadList.remove(row);
     
      fireTableRowsDeleted(row, row);
    }

_ نقوم بإنشاء الطريقة getColumnCount وذلك بهدف الحصول على عدد الاعمدة بالجدول ....باستخدام الكود التالى :

الرمز:
public int getColumnCount() {
        return columnNames.length;
    }

_ نقوم بإنشاء الطريقة getColumnName و ذلك بهدف الحصول على أسماء الاعمدة بالجدول ....بإستخدام الكود التالى :

الرمز:
 public String getColumnName(int col) {
        return columnNames[col];
    }

_ نقوم بإنشاء الطريقة getColumnClass بهدف الحصول على القيم المختلفة للاعمدة ....باستخدام الكود التالى :
الرمز:
public Class getColumnClass(int col) {
        return columnClasses[col];
    }

_ نقوم بإنشاء الطريقة getRowCount وذلك للحصول على عدد الصفوف بالجدول ...بإستخدام الكود التالى :

الرمز:
 public int getRowCount() {
        return downloadList.size();
    }

_ نقوم بإنشاء الطريقة getValueAt وذلك بهدف إعطاء القيم لكل عمود ....بإستخدام الكود التالى :

الرمز:
 public Object getValueAt(int row, int col) {
     
        Download download = (Download) downloadList.get(row);
        switch (col) {
            case 0:
                return Download.STATUSES[download.getStatus()];
            case 1:
                return new Float(download.getProgress());
             
            case 2:
                int size = download.getSize();
                return (size == -1) ? "" : Integer.toString(size);
            case 3:
             
                return download.getUrl();
        }
        return "";
    }

_ نقوم بإنشاء الطريقة update و ذلك لاعلام المراقبيين بأي تغييرات عند التحميل و هى طريقة اساسيه يجب استخدامها فى حاله لو وضعنا الامر implements Observer عند إنشاء الفئة ....باستخدام الكود التالى :


الرمز:
public void update(Observable o, Object arg) {
        int index = downloadList.indexOf(o);
           
        fireTableRowsUpdated(index, index);
    }

وهكذا نكون قد أنتهينا من برمجة هذه الفئة

3_ إنشاء الفئة ProgressRenderer ....والتى تحتوى على التعليمات البرمجية لاظهار شريط التقدم لكل تحميل فى خلايا الجدول ....وذلك على النحو التالى :

_ نقوم بتحديد ايقونة المشروع ثم كليك يمين ومن القائمة التى ستظهر نختار الامر New ثم الامر Java Classe لتفتح لك نافذه تطالبك بوضع اسم الكلاس ....قم بوضع اسم الكلاس ProgressRenderer ثم انقر Finsh لتجد صفحة الكود بها الكود التالى :

الرمز:
class ProgressRenderer

لذلك سنقوم بإضافة الامر extends JProgressBar implements TableCellRenderer الى الكود السابق ليصبح هكذا :

الرمز:
class ProgressRenderer extends JProgressBar implements TableCellRenderer {
 
 
}

_ نقوم بإستيراد المكتبات اللازمة و ذلك بالكود التالى :

الرمز:
import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;


_ نقوم بإنشاء المشيد الخاص بالفئة ......بإستخدام الكود التالى :

الرمز:
 public ProgressRenderer(int min, int max) {
        super(min, max);
    }

_ نقوم بإنشاء الطريقة getTableCellRendererComponent وذلك بهدف الحصول الحصول على الصفات المختلفة لشريط التقدم فى خلايا الجدول ....و ذلك بإستخدام الكود التالى :

الرمز:
 public Component getTableCellRendererComponent(
         
      JTable table, Object value, boolean isSelected,
      boolean hasFocus, int row, int column) {
     
        setValue((int) ((Float) value).floatValue());
        return this;
    }

وهكذا نكون قد انتهينا من التعليمات البرمجية لهذا الكلاس ...ويجب أن تظهر الفئات أو الكلاسات كما فى الشكل التالى :



4_ نعود الان الى الفئة أو الكلاس DownloadManager
و الذى قمنا بإنشاءه فى بداية الدرس و الذى يحتوى على الواجهة للبرنامج
......قم بالنقر على التويب Source ليتم فتح لك نافذة كتابة الشفره ثم أتبع
التعليمات التالية :

(أ)_ قم بإستيراد المكتبات اللازمة و ذلك بإستخدام الكود التالى :

الرمز:
import java.net.URL;
import java.util.*;
import javax.swing.*;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

(ب)_ ستجد أن الكود المسؤل عن إنشاء هذا الكلاس كما يلى :

الرمز:
public class DownloadManager extends javax.swing.JFrame {

المطلوب منك تعديل هذا الكود بإضافة الامر implements Observer ليصبح كما يلى :

الرمز:
public class DownloadManager extends javax.swing.JFrame implements Observer {

بداخل
هذا الفئة سنقوم بتعريف كائنات للوصول للفئات الاخرى التى قمنا بإنشاءها
بالاضافة الى الاعلان عن متغير منطقى boolean ليقوم بمعرفه هل تم إزالة
التحميل الحالى أم لا ....و ذلك باستخدام الكود التالى :

الرمز:
private DownloadsTableModel tableModel;
    private Download selectedDownload;
    private boolean clearing;

_ ستجد ايضا قد تم إنشاء المشيدDownloadManager الخاص بهذا الكلاس تلقائيا ....قم بإضافة التعليمات البرمجية التالية اليه ليصبح كما فى الكود التالى :

الرمز:
public DownloadManager() {
        initComponents();
        tableModel = new DownloadsTableModel();
        table.setModel(tableModel);
        table.getSelectionModel().addListSelectionListener(new ListSelectionListener()
        {
        public void valueChanged(ListSelectionEvent e) {tableSelectionChanged();
            }
        });
             
           
        ProgressRenderer renderer = new ProgressRenderer(0, 100);
        renderer.setStringPainted(true);
        table.setDefaultRenderer(JProgressBar.class, renderer);
           
        table.setRowHeight((int) renderer.getPreferredSize().getHeight());
     
     
    }
_ نقوم بإنشاء الطريقة verifyUrl و ذلك للتأكد من صلاحية الرابط المدخل ....و ذلك بإستخدام الكود التالى :

الرمز:
 private URL verifyUrl(String url) {
      if (!url.toLowerCase().startsWith("http://"))
            return null;
           
        URL verifiedUrl = null;
        try {
            verifiedUrl = new URL(url);
        } catch (Exception e) {
            return null;
        }
         
        if (verifiedUrl.getFile().length() < 2)
            return null;
     
        return verifiedUrl;
    }

_ نقوم بإنشاء الطريقة tableSelectionChanged وذلك لاخبار المراقب بأننا قمنا بأختيار صف معين ...بإستخدام الكود التالى :

الرمز:
 private void tableSelectionChanged() {
   
      if (selectedDownload != null)
            selectedDownload.deleteObserver(DownloadManager.this);
         
        if (!clearing) {
            selectedDownload =
                    tableModel.getDownload(table.getSelectedRow());
            selectedDownload.addObserver(DownloadManager.this);
            updateButtons();
        }

_ نقوم بإنشاء الطريقة updateButtons بهدف تنشيط بعض الازرار على حسب حالة التحميل ....بإستخدام الكود التالى :

الرمز:
private void updateButtons() {
        if (selectedDownload != null) {
            int status = selectedDownload.getStatus();
            switch (status) {
                case Download.DOWNLOADING:
                    pauseButton.setEnabled(true);
                    resumeButton.setEnabled(false);
                    cancelButton.setEnabled(true);
                    clearButton.setEnabled(false);
                    break;
                case Download.PAUSED:
                    pauseButton.setEnabled(false);
                    resumeButton.setEnabled(true);
                    cancelButton.setEnabled(true);
                    clearButton.setEnabled(false);
                    break;
                case Download.ERROR:
                    pauseButton.setEnabled(false);
                    resumeButton.setEnabled(true);
                    cancelButton.setEnabled(false);
                    clearButton.setEnabled(true);
                    break;
                default: // COMPLETE or CANCELLED
                    pauseButton.setEnabled(false);
                    resumeButton.setEnabled(false);
                    cancelButton.setEnabled(false);
                    clearButton.setEnabled(true);
            }
        } else {
            // No download is selected in table.
            pauseButton.setEnabled(false);
            resumeButton.setEnabled(false);
            cancelButton.setEnabled(false);
            clearButton.setEnabled(false);
        }
    }

_ أخيرا سنقوم بإنشاء الطريقة update الخاصة بالمراقب Observable ....باستخدام الكود التالى :

الرمز:
public void update(Observable o, Object arg) {
        if (selectedDownload != null && selectedDownload.equals(o))
            updateButtons();
    }

5_ الان نقوم ببرمجة زراير الامر التى إضفناها للنافذة الرئسية للمشروع ......وذلك على النحو التالى :

_ زر الامر ( أضف Add ) ....قم بالنقر المزدوج عليه لكتابة التعليمات البرمجية الموجودة فى الكود التالى :

الرمز:
private void AddActionPerformed(java.awt.event.ActionEvent evt) {                                       
 URL verifiedUrl = verifyUrl(addTextField.getText());
        if (verifiedUrl != null) {
            tableModel.addDownload(new Download(verifiedUrl));
            addTextField.setText("");
        } else {
            JOptionPane.showMessageDialog(this,"Invalid Download URL", "Error",JOptionPane.ERROR_MESSAGE);
        }

_ أما زر الامر ( إيقاف مؤقت pauseButton و إستئناف resumeButton و إلغاء cancelButtonAction و مسح clearButton) ....ستكون التعليمات البرمجية لهم على التوالى كما يلى :

الرمز:
private void pauseButtonActionPerformed(java.awt.event.ActionEvent evt) {                                         
selectedDownload.pause();
        updateButtons();
}                                         

private void resumeButtonActionPerformed(java.awt.event.ActionEvent evt) {                                           
selectedDownload.resume();
        updateButtons();
}                                         

private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {                                           
selectedDownload.cancel();
        updateButtons();
}                                         

private void clearButtonActionPerformed(java.awt.event.ActionEvent evt) {                                         
clearing = true;
        tableModel.clearDownload(table.getSelectedRow());
        clearing = false;
        selectedDownload = null;
        updateButtons();
}                                         

الان قم بشغيل برنامج ليظهر كما فى الشكل التالى :



فى النهاية أتمنى أن أكون قد وفقت فى الشرح و أن يكون الدرس قد أفادكم جميعا و المشروع بالكامل فى المرفقات
المرفقات
DownloadManager.zip لا تتوفر على صلاحيات كافية لتحميل هذه المرفقات.(34 Ko) عدد مرات التنزيل 52

ـــــــــــــــــــ التوقيع ــــــــــــــــــــ
سبحان الله وبحمدة .....سبحان الله العظيم

إن فقدت مكان بذورك التي بذرتها يوما ما سيخبرك المطر أين زرعتها ..لذا إبذر الخير فوق أي أرض وتحت أي سماء ومع أي أحد.. فأنت لا تعلم أين تجده ومتى تجده؟! إزرع جميلا ولو في غير موضعه .... فلا يضيع جميلا أينما زرعا .. فما أجمل العطاء... فقد تجد جزاءه في الدنيا أو يكون لك ذخرا في الآخرة

أحمد مناع
.
.

تاريخ التسجيل : 15/02/2011
المساهمات : 810
النقاط : 1479
التقيم : 69
الدولة : مصر
الجنس : ذكر

http://egy-tech.forumegypt.net

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: خطوة بخطوة لبرمجة مدير تحميل المفات EgyDownloadManager بلغة الجافا واستخدام NetBeans

مُساهمة من طرف جورج صبحى في الأحد أبريل 28, 2013 2:54 pm

درس روعة و مشروع جامد ....

جورج صبحى
.....
.....

تاريخ التسجيل : 18/02/2011
المساهمات : 98
النقاط : 211
التقيم : 3
الجنس : ذكر

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: خطوة بخطوة لبرمجة مدير تحميل المفات EgyDownloadManager بلغة الجافا واستخدام NetBeans

مُساهمة من طرف ذوكا في الثلاثاء مايو 28, 2013 2:52 pm

والله رائع ....أنا احببت الجافا من اسلوبك أنت أخى الكريم ....ربنا يوفقك و اتمنى لك النجاح الباهر ...

أخوك ذكى ....لدية خبرة بسيطة فى الجافا

ذوكا
.....
.....

تاريخ التسجيل : 26/05/2013
المساهمات : 92
النقاط : 155
التقيم : 11
الدولة : مصر
الجنس : ذكر

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: خطوة بخطوة لبرمجة مدير تحميل المفات EgyDownloadManager بلغة الجافا واستخدام NetBeans

مُساهمة من طرف أحمد مناع في الثلاثاء مايو 28, 2013 8:33 pm

شكرا لك أخى الكريم .....وتشرفت بمعرفتك

ـــــــــــــــــــ التوقيع ــــــــــــــــــــ
سبحان الله وبحمدة .....سبحان الله العظيم

إن فقدت مكان بذورك التي بذرتها يوما ما سيخبرك المطر أين زرعتها ..لذا إبذر الخير فوق أي أرض وتحت أي سماء ومع أي أحد.. فأنت لا تعلم أين تجده ومتى تجده؟! إزرع جميلا ولو في غير موضعه .... فلا يضيع جميلا أينما زرعا .. فما أجمل العطاء... فقد تجد جزاءه في الدنيا أو يكون لك ذخرا في الآخرة

أحمد مناع
.
.

تاريخ التسجيل : 15/02/2011
المساهمات : 810
النقاط : 1479
التقيم : 69
الدولة : مصر
الجنس : ذكر

http://egy-tech.forumegypt.net

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: خطوة بخطوة لبرمجة مدير تحميل المفات EgyDownloadManager بلغة الجافا واستخدام NetBeans

مُساهمة من طرف أيمن الإبراهيم في الجمعة سبتمبر 06, 2013 11:45 am

استاذ احمد
هل يوجد طريقة لدمج البرنامج مع المتصفح ويعطي خيار تحميل الملف عن طريق المتصفح
مثل برنامج التحميل الشهير INTERNETDOWNLOAD MANAGER

أيمن الإبراهيم
........
........

تاريخ التسجيل : 19/03/2013
المساهمات : 251
النقاط : 397
التقيم : 0
الدولة : سوريا
الجنس : ذكر

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: خطوة بخطوة لبرمجة مدير تحميل المفات EgyDownloadManager بلغة الجافا واستخدام NetBeans

مُساهمة من طرف أيمن الإبراهيم في الجمعة سبتمبر 06, 2013 11:48 am

وسؤال تاني
ماذا يمكنني تحيل عن طريق البرنامج لانه كلما اضع رابط ما يعطي خطا
ومشطور جدا على الشرح ومجهود

أيمن الإبراهيم
........
........

تاريخ التسجيل : 19/03/2013
المساهمات : 251
النقاط : 397
التقيم : 0
الدولة : سوريا
الجنس : ذكر

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: خطوة بخطوة لبرمجة مدير تحميل المفات EgyDownloadManager بلغة الجافا واستخدام NetBeans

مُساهمة من طرف أحمد مناع في السبت سبتمبر 07, 2013 8:32 am

أيمن الإبراهيم كتب:استاذ احمد
هل يوجد طريقة لدمج البرنامج مع المتصفح ويعطي خيار تحميل الملف عن طريق المتصفح
مثل برنامج التحميل الشهير INTERNETDOWNLOAD MANAGER
فكرتك جملية يا سيد أيمن و إن شاء نحاول تطوير التطبيق و به تلك الميزة و لكن بعد الانتهاء من نشر بعض الدورس التى بصددها حاليا

ـــــــــــــــــــ التوقيع ــــــــــــــــــــ
سبحان الله وبحمدة .....سبحان الله العظيم

إن فقدت مكان بذورك التي بذرتها يوما ما سيخبرك المطر أين زرعتها ..لذا إبذر الخير فوق أي أرض وتحت أي سماء ومع أي أحد.. فأنت لا تعلم أين تجده ومتى تجده؟! إزرع جميلا ولو في غير موضعه .... فلا يضيع جميلا أينما زرعا .. فما أجمل العطاء... فقد تجد جزاءه في الدنيا أو يكون لك ذخرا في الآخرة

أحمد مناع
.
.

تاريخ التسجيل : 15/02/2011
المساهمات : 810
النقاط : 1479
التقيم : 69
الدولة : مصر
الجنس : ذكر

http://egy-tech.forumegypt.net

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: خطوة بخطوة لبرمجة مدير تحميل المفات EgyDownloadManager بلغة الجافا واستخدام NetBeans

مُساهمة من طرف أحمد مناع في السبت سبتمبر 07, 2013 8:43 am

أيمن الإبراهيم كتب:وسؤال تاني
ماذا يمكنني تحيل عن طريق البرنامج لانه كلما اضع رابط ما يعطي خطا
ومشطور جدا على الشرح ومجهود
يمكنك تحميل به أى ملف ....بشرط أن يكون الرابط صحيح و يبدأ بأحد بروتوكلات الانترنت http:// أو https: ....وهذه صورة من التطبيق أثنائ التشغيل اليوم قد قمت بتحميل سورس كود التطبيق من المرفقات حتى أتأكد أنه مازال يعمل و النتجية كانت كما يلى :



والخطأ الذى يظهر عندك ربما يكون العنوان غير صحيح ولا يحتوى على بروتوكلات الانترنت السابقة أو لسبب أخر ...لذلك أتمنى وضع رسالة الخطأ التى تظهر لديك أثناء التشغيل

ـــــــــــــــــــ التوقيع ــــــــــــــــــــ
سبحان الله وبحمدة .....سبحان الله العظيم

إن فقدت مكان بذورك التي بذرتها يوما ما سيخبرك المطر أين زرعتها ..لذا إبذر الخير فوق أي أرض وتحت أي سماء ومع أي أحد.. فأنت لا تعلم أين تجده ومتى تجده؟! إزرع جميلا ولو في غير موضعه .... فلا يضيع جميلا أينما زرعا .. فما أجمل العطاء... فقد تجد جزاءه في الدنيا أو يكون لك ذخرا في الآخرة

أحمد مناع
.
.

تاريخ التسجيل : 15/02/2011
المساهمات : 810
النقاط : 1479
التقيم : 69
الدولة : مصر
الجنس : ذكر

http://egy-tech.forumegypt.net

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: خطوة بخطوة لبرمجة مدير تحميل المفات EgyDownloadManager بلغة الجافا واستخدام NetBeans

مُساهمة من طرف أيمن الإبراهيم في السبت سبتمبر 07, 2013 1:23 pm

مشكور استاذ احمد   
هذه صورة لتطبيق قمت بتحميل السورس المشروع واعظاني error
,وقمت بتجربت تحميل من يوتيوب او برامج من مواقع مختلفة اغلبها نفس الخطا ومنها يعطي invalid download url

أيمن الإبراهيم
........
........

تاريخ التسجيل : 19/03/2013
المساهمات : 251
النقاط : 397
التقيم : 0
الدولة : سوريا
الجنس : ذكر

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: خطوة بخطوة لبرمجة مدير تحميل المفات EgyDownloadManager بلغة الجافا واستخدام NetBeans

مُساهمة من طرف NEXT في السبت سبتمبر 07, 2013 3:30 pm

فعلا كلامك صحيح أخى ايمن وذلك لان أخى أحمد مناع حدد بروتوكول واحد فقط ليتم التحميل من خلالة وهو بروتوكل   http://  ...وذلك لكون الكود الموجود فى الفئة DownloadManager  فية الكود التالى :

الرمز:
private URL verifyUrl(String url) {
       if (!url.toLowerCase().startsWith("http://"))
            return null;
              
        URL verifiedUrl = null;
        try {
            verifiedUrl = new URL(url);
        } catch (Exception e) {
            return null;
        }
            
        if (verifiedUrl.getFile().length() < 2)
            return null;
        
        return verifiedUrl;
    }
و بالتالى لن تستطيع التحميل من البروتوكلات الاخرى مثل https أو ftp ....خصوصا ان اليوتيوب يعتمد على بروتوكل https ....و الحل هو تعديل الكود أعلاه لتضمين تلك البروتوكلات

أما بالنسبة للصورة التى وضعتها يا أخ أيمن ....فتبن أنك تحاول تنزيل ملف من مرفقات منتدى مصر التقنى و بالرغم من أن المنتدى يدعم  http:// الا أن رابط المرفقات ليس رابط مباشر وانما هو رابط php يقوم بتحويلك للملف المختار و يكون على الشكل التالى :

http://egy-tech.forumegypt.net/download.forum?id=112

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

و بالتالى فأى مدير تحميل الملفات عند تنصيبة يقوم بجعل نفسه مدير التحميل الافتراضى للمتصفحات الموجودة على الجهاز .....لذلك أن اردنا جعل هذا المشروع يقوم بالتحميل من روابط التحميل التى توجهك الى رابط التحميل المباشر من خلال النقر ....يجب أن يكون المشروع قادر على جعل نفسه مدير التحميل الافتراضى للمتصفحات الموجودة على الجهاز ....

NEXT
الادارة
الادارة

تاريخ التسجيل : 18/02/2011
المساهمات : 262
النقاط : 378
التقيم : 10
الجنس : ذكر

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: خطوة بخطوة لبرمجة مدير تحميل المفات EgyDownloadManager بلغة الجافا واستخدام NetBeans

مُساهمة من طرف أيمن الإبراهيم في الخميس سبتمبر 12, 2013 9:04 am

ما يجب تعديل على الكود لنستطيع تحميل مقاطع يوتيوب وكتب الكترونية
وشكرا

أيمن الإبراهيم
........
........

تاريخ التسجيل : 19/03/2013
المساهمات : 251
النقاط : 397
التقيم : 0
الدولة : سوريا
الجنس : ذكر

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: خطوة بخطوة لبرمجة مدير تحميل المفات EgyDownloadManager بلغة الجافا واستخدام NetBeans

مُساهمة من طرف أحمد مناع في السبت سبتمبر 14, 2013 5:04 pm


أخى ايمن ...حاليا جارى تطوير المشروع لينافس internet download manager وربما أجعله تجارى Very Happy ....لكن أعودك عندما اصل لتلك المرحلة لن أبخل عليك بالسورس كود وهذا وعد منى ليك ....

ـــــــــــــــــــ التوقيع ــــــــــــــــــــ
سبحان الله وبحمدة .....سبحان الله العظيم

إن فقدت مكان بذورك التي بذرتها يوما ما سيخبرك المطر أين زرعتها ..لذا إبذر الخير فوق أي أرض وتحت أي سماء ومع أي أحد.. فأنت لا تعلم أين تجده ومتى تجده؟! إزرع جميلا ولو في غير موضعه .... فلا يضيع جميلا أينما زرعا .. فما أجمل العطاء... فقد تجد جزاءه في الدنيا أو يكون لك ذخرا في الآخرة

أحمد مناع
.
.

تاريخ التسجيل : 15/02/2011
المساهمات : 810
النقاط : 1479
التقيم : 69
الدولة : مصر
الجنس : ذكر

http://egy-tech.forumegypt.net

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: خطوة بخطوة لبرمجة مدير تحميل المفات EgyDownloadManager بلغة الجافا واستخدام NetBeans

مُساهمة من طرف أيمن الإبراهيم في الأحد سبتمبر 15, 2013 8:39 pm

أحمد مناع كتب:
أخى ايمن ...حاليا جارى تطوير المشروع لينافس internet download manager وربما أجعله تجارى Very Happy ....لكن أعودك عندما اصل لتلك المرحلة لن أبخل عليك بالسورس كود وهذا وعد منى ليك ....
مشكوووووووور جدا  واتمنى لك التفوق والامتياز

أيمن الإبراهيم
........
........

تاريخ التسجيل : 19/03/2013
المساهمات : 251
النقاط : 397
التقيم : 0
الدولة : سوريا
الجنس : ذكر

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: خطوة بخطوة لبرمجة مدير تحميل المفات EgyDownloadManager بلغة الجافا واستخدام NetBeans

مُساهمة من طرف أيمن الإبراهيم في الأحد نوفمبر 24, 2013 9:59 pm

ممكني ترسلي بعض روابط التي يمكنني تحميلها عن طريقة برنامج
وحاولت اضافة اكواد لاضافة البروتوكول ولم انجح اريد مساعدتكم
ومشكورين

أيمن الإبراهيم
........
........

تاريخ التسجيل : 19/03/2013
المساهمات : 251
النقاط : 397
التقيم : 0
الدولة : سوريا
الجنس : ذكر

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: خطوة بخطوة لبرمجة مدير تحميل المفات EgyDownloadManager بلغة الجافا واستخدام NetBeans

مُساهمة من طرف أحمد مناع في الأحد ديسمبر 08, 2013 11:51 am

راجع المثال الموجود على الرابط التالى أخى ايمن 


Xtreme Download Manager أقوى مدير تحميل ملفات مفتوح المصدر بالجافا

ـــــــــــــــــــ التوقيع ــــــــــــــــــــ
سبحان الله وبحمدة .....سبحان الله العظيم

إن فقدت مكان بذورك التي بذرتها يوما ما سيخبرك المطر أين زرعتها ..لذا إبذر الخير فوق أي أرض وتحت أي سماء ومع أي أحد.. فأنت لا تعلم أين تجده ومتى تجده؟! إزرع جميلا ولو في غير موضعه .... فلا يضيع جميلا أينما زرعا .. فما أجمل العطاء... فقد تجد جزاءه في الدنيا أو يكون لك ذخرا في الآخرة

أحمد مناع
.
.

تاريخ التسجيل : 15/02/2011
المساهمات : 810
النقاط : 1479
التقيم : 69
الدولة : مصر
الجنس : ذكر

http://egy-tech.forumegypt.net

الرجوع الى أعلى الصفحة اذهب الى الأسفل

استعرض الموضوع السابق استعرض الموضوع التالي الرجوع الى أعلى الصفحة


 
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى