عرض الصور المخزنة فى قاعدة البيانات بالعنصر الرسومى jtable
منتدى مصر التقني :: قسم لغات البرمجة Programming languages :: لغة الجافا Java :: قواعد البيانات JAVA JDBC
صفحة 1 من اصل 1 • شاطر
عرض الصور المخزنة فى قاعدة البيانات بالعنصر الرسومى jtable
بسم الله الرحمن الرحيم
أهلا بكم أعضاء و زوار منتدى مصر الكرام
الكثير مننا يود التعامل فى حفظ و استرجاع الصور من والى قواعد البيانات المختلفة (MySQL, Oracle,Derby, etc.) و التى تستخدم البيانات من نوع Blob لتخزين الصور بها وابتداء من جافا 1.6 فإنها تدعم تخزين الصور بتلك القواعد بتنسيق او امتداد bmp, jpg, wbmp, png, gif و قد تحدثنا فى مقال سابق عن [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] .
درس اليوم عن كيفية عرض و تشغيل الصور المخزنة فى قاعدة البيانات فى جدول البيانات أو العنصر الرسومي jtable و ذلك بخطوات بسيطة للغاية :
1_ قم بإنشاء نافذة و ضع عليها jtable من خلال النت بينز
2_ نفترض ان لدينا ثلاث حقول فى جدول قاعدة البيانات وهما
حقل الهوية : ID_NO من نوع String
حقل الاسم : NAME من نوع String
حقل الصور :IMAGE من نوع Blob
سنقوم بإنشاء فئة و ليكن بإسم Subscribers و مهمتها الحصول على كافة بيانات حقول جدول قاعدة البيانات و ذلك على النحو التالى :
3_ نقوم بإنشاء فئة اخرى و ليكن باسم MyQuery_Sub :
تلك الفئة او اكلاس الهدف منها فتح اتصال مع قاعدة البيانات ومن ثم الحصول على بيانات حقول جدول قاعدة البيانات و إضافتها فى واجهة قائمة وليكن Arraylist لاستخدامها فيما بعد
أذن تلك الفئة ستحتوى على طريقين :
الاولى : وليكن بأسم getConnection لفتح اتصال مع قاعدة البيانات
الثانية : و ليكن باسم BindTable للوصول و الحصول على قيم حقول جدول البيانات
أولا :إنشاء الطريقة getConnection على النحو التالى :
وكما تلاحظون فى الكود أعلاه أننا انشأنا اتصال يسمى con و ذلك عن طريقة DriverManager التى به طريقة تسمىgetConnection. وهو يحتاج الى اسم المضيف (الذي هو موقع قاعدة البيانات الخاصة بنا)، واسم المستخدم، وكلمة مرور.حتى يتم الاتصال بنجاح
ثانيا :إنشاء الطريقة BindTable و ذلك على النحو التالى :
تلاحظون على الكود أعلاه :
_ قمنا بإنشاء القائمة 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 فيما بعد
الشفرة الكاملة لهذه الفئة او الكلاس على النحو التالى :
4_نقوم بإنشاء فئة اخيرة و ليكن بأسم TheModel_SUB :
بهدف إنشاء أعمدة و صفوف الجدول الافتراضى وذلك على النحو التالى :
يلاحظ على الكود أعلاه :
_ قمنا بتمديد الفئة بالواجهة AbstractTableModel
_قمنا بإنشاء الطريقة getColumnClass بهدف الحصول ارجاع الصورة المخزنة فى الحقل جدول البيانات الذى رقم index هو 2 و هو حقل تخزين الصورة فى قاعدة البيانات
5_ الان سنقوم بالذهاب للنافذة التى قمنا بإنشائها فى اول خطوة و وضعنا عليها جدول البيانات jtabel ومن ثم نفتح نافذة كتابة الشفرة لانشاء طريقة وليكن بأسم populateJTable على النحو التالى :
يلاحظ على الكود أعلاه :
_ فى البداية قمنا بإنشاء مثيل جديد من الفئة MyQuery_Sub باسم mq
_ بعد ذلك قمنا بإنشاء القائمة ArrayList وقمنا بتحديد عناصرها من خلال تنفيذ الطريقة BindTable بداخلها
_قمنا بإنشاء أعمدة الجدول
_بعد ذلك إنشاء البيانات المراد وضعها فى الجدول و استخدمنا فى ذلك حجم القائمة list والتى تساوى 3 حقول
_ بعد ذلك استخدمنا حلقة تكرارية للحصول على البيانات المخزنة فى القائمة list
_أستخدمنا جملة شرطية للتاكد من القيمة التى سيتم جلبها من الطريقة getMyImage ليست خالية وإلا يتم استخدام الكلاس image فى استخراج الصورة ومن ثم استخدام الطريقة getScaledInstance لتنسيق حجم الصورة و ليكن 56*56
_ بعد ذلك إضافة الصورة الى العامود الذى رقم index له يساوى 3
_ إنشاء مثيل جديد من الفئة او الكلاس TheModel_SUB باسم model
_اضافة model الى العنصر الرسومى
_إضافة jTable1
أهلا بكم أعضاء و زوار منتدى مصر الكرام
الكثير مننا يود التعامل فى حفظ و استرجاع الصور من والى قواعد البيانات المختلفة (MySQL, Oracle,Derby, etc.) و التى تستخدم البيانات من نوع Blob لتخزين الصور بها وابتداء من جافا 1.6 فإنها تدعم تخزين الصور بتلك القواعد بتنسيق او امتداد bmp, jpg, wbmp, png, gif و قد تحدثنا فى مقال سابق عن [ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط] .
درس اليوم عن كيفية عرض و تشغيل الصور المخزنة فى قاعدة البيانات فى جدول البيانات أو العنصر الرسومي 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
ـــــــــــــــــــ التوقيع ــــــــــــــــــــ
سبحان الله وبحمدة .....سبحان الله العظيم
| |
منتدى مصر التقني :: قسم لغات البرمجة Programming languages :: لغة الجافا Java :: قواعد البيانات JAVA JDBC
صفحة 1 من اصل 1
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى
الخميس أبريل 25, 2024 8:56 pm من طرف moslema_r
» شركة مكافحة حشرات في راس الخيمة
الخميس أبريل 25, 2024 8:34 pm من طرف moslema_r
» تطبيقIncogniton لإدارة ملفات تعريف متعددة للمتصفح
الأربعاء أبريل 24, 2024 3:51 pm من طرف زاكااا
» افضل شركة مكافحة النمل الابيض بالرياض
الإثنين أبريل 22, 2024 9:41 pm من طرف moslema_r
» Exemplary Сasual Dating - Verified Women
الخميس أبريل 18, 2024 9:18 pm من طرف wdqwd
» رش الدفان بالرياض
الخميس أبريل 18, 2024 7:11 pm من طرف moslema_r
» شركة تنظيف خزانات الشارقة
الخميس أبريل 18, 2024 6:57 pm من طرف moslema_r
» شركة مكافحة الفئران بالرياض
الإثنين أبريل 15, 2024 8:23 pm من طرف moslema_r
» افضل شركة كشف تسربات المياه بالباحة
الخميس أبريل 04, 2024 7:02 am من طرف gmalnagy
» ساعدوني وفهموني help me
الجمعة مارس 29, 2024 8:37 am من طرف linesoft