عرض الصور المخزنة فى قاعدة البيانات بالعنصر الرسومى jtable

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

عرض الصور المخزنة فى قاعدة البيانات بالعنصر الرسومى jtable

مُساهمة من طرف أحمد مناع في الأربعاء مارس 30, 2016 9:40 pm

بسم الله الرحمن الرحيم

أهلا بكم أعضاء و زوار منتدى مصر الكرام

الكثير مننا يود التعامل فى حفظ و استرجاع الصور من والى قواعد البيانات المختلفة  (MySQL, Oracle,Derby, etc.) و التى تستخدم البيانات من نوع Blob لتخزين الصور بها وابتداء من جافا 1.6 فإنها تدعم تخزين الصور بتلك القواعد بتنسيق او امتداد bmp, jpg, wbmp, png, gif و قد تحدثنا فى مقال سابق عن حفظ وإسترجاع الصور من والى قاعدة بيانات derby & MySql .

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

1_ قم بإنشاء نافذة و ضع عليها jtable من خلال النت بينز

2_ نفترض ان لدينا ثلاث حقول فى جدول قاعدة البيانات وهما

حقل الهوية : ID_NO من نوع String
حقل الاسم : NAME من نوع String
حقل الصور :IMAGE من نوع Blob

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

الرمز:
package Domain;

 public class Subscribers {

    private String name;
  private String id_no;
    private byte[] Image;
    
    public Subscribers(){}
    
    public Subscribers( String Name, String ID_NO,byte[] image){
          
        this.name = Name;
        this.id_no=ID_NO;
              this.Image = image;
               }
        
    public String getID(){
      return id_no;
    }
       public void setID(String ID){
        this.id_no = ID;
    }
       public String getName(){
        return name;
    }
    
    public void setName(String Name){
        this.name = Name;
    }
           }

3_ نقوم بإنشاء فئة اخرى و ليكن باسم MyQuery_Sub :

تلك الفئة او اكلاس الهدف منها فتح اتصال مع قاعدة البيانات ومن ثم الحصول على بيانات حقول جدول قاعدة البيانات و إضافتها فى واجهة قائمة وليكن Arraylist لاستخدامها فيما بعد

أذن تلك الفئة ستحتوى على طريقين :

الاولى : وليكن بأسم getConnection لفتح اتصال مع قاعدة البيانات
الثانية  : و ليكن باسم BindTable للوصول و الحصول على قيم حقول جدول البيانات

أولا :إنشاء الطريقة getConnection على النحو التالى :

الرمز:
public Connection getConnection(){
        Connection con = null;
              try {
          String url = "jdbc:derby://localhost:1527/App_db";
 String user = "Egy";
 String pass = "123";
          
           con = DriverManager.getConnection(url, user, pass);
                    
       } catch (SQLException ex) {
           Logger.getLogger(MyQuery_Sub.class.getName()).log(Level.SEVERE, null, ex);
       }
      
       return con;
    }

وكما تلاحظون فى الكود أعلاه  أننا انشأنا اتصال يسمى  con  و ذلك عن طريقة DriverManager التى به طريقة تسمىgetConnection. وهو يحتاج الى اسم المضيف (الذي هو موقع قاعدة البيانات الخاصة بنا)، واسم المستخدم، وكلمة مرور.حتى  يتم الاتصال بنجاح


ثانيا :إنشاء الطريقة  BindTable و ذلك على النحو التالى :
الرمز:
 public ArrayList<Subscribers> BindTable(){
        
   ArrayList<Subscribers> list = new ArrayList<Subscribers>();
   Connection con = getConnection();
   Statement st;
   ResultSet rs;
  
   try {
   st = con.createStatement();
   rs = st.executeQuery("SELECT * FROM EGY.SUB");
  
  
   while(rs.next()){
   Subscribers p = new Subscribers(
  
   rs.getString("NAME"),
   rs.getString("ID_NO"),
   rs.getBytes("IMAGE"),
   );
   list.add(p);
   }
  
   } catch (SQLException ex) {
   Logger.getLogger(MyQuery_Sub.class.getName()).log(Level.SEVERE, null, ex);
   }
   return list;
   }

تلاحظون على الكود أعلاه :

_ قمنا بإنشاء القائمة ArrayList باشتقاق مثيل جديد بأسم list وبما إننا سوف نريد تخزين بيانات جدول البيانات بها قمنا بتمرير الفئة Subscribers التى قمنا بإنشائها سابقا والتى ستمدنا بتلك البيانات
_ قمن بفتح اتصال مع قاعدة البيانات وذلك بتشغيل الطريقة getConnection
_قمنا بالاعلان عن الكائن sql.Statement والكائن sql.ResultSet
_فى منطقة معالجة الاستثناءات catch .....try بدئنا بإنشاء الكائن Statement بأسم st
_ بعد ذلك قمنا بإنشاء كائن الاستعلام rs وتمرير جملة استعلام للمرور بجدول البيانات EGY.SUB و تحديد كافة حقول الجدول
_بعد ذلك قمنا بإنشاء حلقة تكرارية و بداخل تلك الحلقة قمنا بإنشاء مثيل جديد بإسم p من الفئة Subscribers التى انشأناها سابقا
_الفئة Subscribers لها عوامل و ومتغيرات يجب تمرير قيمة اليها لذلك استخدمنا rs.getString("NAME") لتمرير قيمة كل عامل بناء على نوع بيانات كل عامل
_ أستخدمنا بعد ذلك الطريقة add التابعة للقائمة list لوضع البيانات التى تم جلبها اليها كعناصر لها
_ و أخيرا استخدمنا الكلمة المحجوزة فى الجافا return لارجاع قيمة عناصر القائمة list فيما بعد

الشفرة الكاملة لهذه الفئة او الكلاس على النحو التالى :

الرمز:
package Domain;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;


public class MyQuery_Sub {
   
  public Connection getConnection(){
        Connection con = null;
     
      try {
         
 String url = "jdbc:derby://localhost:1527/App_db";
 String user = "Egy";
 String pass = "123";
         
          con = DriverManager.getConnection(url, user, pass);
         
              } catch (SQLException ex) {
          Logger.getLogger(MyQuery_Sub.class.getName()).log(Level.SEVERE, null, ex);
      }
     
      return con;
    }
    public ArrayList<Subscribers> BindTable(){
       
  ArrayList<Subscribers> list = new ArrayList<Subscribers>();
  Connection con = getConnection();
  Statement st;
  ResultSet rs;
 
  try {
  st = con.createStatement();
  rs = st.executeQuery("SELECT * FROM EGY.SUB");
 
  Subscribers p;
  while(rs.next()){
  p = new Subscribers(
 
  rs.getString("NAME"),
  rs.getString("ID_NO"),
  rs.getBytes("IMAGE"),
    );
  list.add(p);
  }
 
  } catch (SQLException ex) {
  Logger.getLogger(MyQuery_Sub.class.getName()).log(Level.SEVERE, null, ex);
  }
  return list;
  }
}


4_نقوم بإنشاء فئة اخيرة و ليكن بأسم TheModel_SUB :

بهدف إنشاء أعمدة و صفوف الجدول الافتراضى وذلك على النحو التالى :

الرمز:
package Domain;
import javax.swing.Icon;
import javax.swing.table.AbstractTableModel;

public class TheModel_SUB extends AbstractTableModel {
int column = 0;
    private String[] columns;
    private Object[][] rows;
    
    public TheModel_SUB(){}
    
    public TheModel_SUB(Object[][] data, String[] columnName){
    
        this.rows = data;
        this.columns = columnName;
    }

    
    @Override
    public Class getColumnClass(int column){

        if(column == 2){
            return Icon.class;
        }
        else{
            return Object.class;
        }
    }
      public int getRowCount() {
     return this.rows.length;
    }
    public int getColumnCount() {
     return this.columns.length;
    }
   
    public Object getValueAt(int rowIndex, int columnIndex) {
    
    return this.rows[rowIndex][columnIndex];
    }
    @Override
    public String getColumnName(int col){
        return this.columns[col];
    }


}

يلاحظ على الكود أعلاه :


_ قمنا بتمديد الفئة بالواجهة AbstractTableModel
_قمنا بإنشاء الطريقة getColumnClass بهدف الحصول ارجاع الصورة المخزنة فى الحقل جدول البيانات الذى رقم index هو 2 و هو حقل تخزين الصورة فى قاعدة البيانات

5_ الان سنقوم بالذهاب للنافذة التى قمنا بإنشائها فى اول خطوة و وضعنا عليها جدول البيانات jtabel ومن ثم نفتح نافذة كتابة الشفرة لانشاء طريقة وليكن بأسم populateJTable على النحو التالى :

الرمز:
public void populateJTable(){
        MyQuery_Sub mq = new MyQuery_Sub();
        ArrayList<Subscribers> list = mq.BindTable();
        String[] columnName = {"الاسم الثلاثى","رقم الهوية","صورة شخصية"};
        Object[][] rows = new Object[list.size()][3];
        for(int i = 0; i < list.size(); i++){
            rows[i][0] = list.get(i).getName();
            rows[i][1] = list.get(i).getID();
            
                    
            
            if(list.get(i).getMyImage() != null){
                
             ImageIcon image = new ImageIcon(new ImageIcon(list.get(i).getMyImage()).getImage()
             .getScaledInstance(56, 56, Image.SCALE_SMOOTH) );  
                
            rows[i][2] = image;
            }
            else{
                rows[i][2] = null;
            }
           }
        
        TheModel_SUB model = new TheModel_SUB(rows, columnName);
        jTable1.setModel(model);
        jTable1.setRowHeight(56);
       jTable1.getColumnModel().getColumn(6).setPreferredWidth(56);

        };

يلاحظ على الكود أعلاه :

_ فى البداية قمنا بإنشاء مثيل جديد من الفئة MyQuery_Sub باسم mq
_ بعد ذلك قمنا بإنشاء القائمة ArrayList وقمنا بتحديد عناصرها من خلال تنفيذ الطريقة BindTable بداخلها
_قمنا بإنشاء أعمدة الجدول
_بعد ذلك  إنشاء البيانات المراد وضعها فى الجدول و استخدمنا فى ذلك حجم القائمة list والتى تساوى 3 حقول
_ بعد ذلك استخدمنا حلقة تكرارية للحصول على البيانات المخزنة فى القائمة list
_أستخدمنا جملة شرطية للتاكد من القيمة التى سيتم جلبها من الطريقة getMyImage ليست خالية وإلا يتم استخدام الكلاس image فى استخراج الصورة ومن ثم استخدام الطريقة getScaledInstance لتنسيق حجم الصورة و ليكن 56*56
_ بعد ذلك إضافة الصورة الى العامود الذى رقم index له يساوى 3
_ إنشاء مثيل جديد من الفئة او الكلاس TheModel_SUB باسم model
_اضافة model الى العنصر الرسومى
_إضافة jTable1

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

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

أحمد مناع
.
.

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

http://egy-tech.forumegypt.net

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

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


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