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

بعض الأسئلة الأكثر شيوعاً

مثبّتمغلقرائج
بدأه علاء الصالحي في 2 أغسطس 2008 · 59 رد · 59,377 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#26

كيف أحصل على لائحة الخطوط الموجودة في النظام؟؟

يمكن ذلك باستعمال الدالة getAvailableFontFamilyNames() الموجودة في الكلاس GraphicsEnvironment. هذه الدالة تعيد مصفوفة من فئة String.

مثال



public class DisplayFonts {

public static void main(String[] args) {

String[] fontNames = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
for (int i = 0; i < fontNames.length; i++) {
System.out.println(fontNames);
}
}
}
import java.awt.GraphicsEnvironment;

>>>>> عودة إلى الأسئلة <<<<<

تم تعديل هذه المشاركة بواسطة herch في 2 ديسمبر 2009 في 20:33

#27

كيف أعرف حجم الpartition التي أعمل فيها؟؟

يمكن معرفة حجم الpartition (ليس حجم القرص الصلب) باستعمال الدالة getTotalSpace() الموجودة في الكلاس File.

أولا ننشئ كائنا File ونمرر للconstructor مسار الpartition التي نريد معرفة حجمها

File f = new File("c:");

ثم ننادي على getTotalSpace()


System.out.println(space + " bytes");
long space = f.getTotalSpace();



public static void main(String[] args) {
File f = new File("c:");
long space = f.getTotalSpace();
System.out.println(space + " bytes");
}

}
import java.io.File;

>>>>> عودة إلى الأسئلة <<<<<

#28

كيف أمسح ملف، أنشئ ملف جديد فارغ، وأتحقق من وجود ملف ما؟؟

سنستعمل الكلاس File في العمليات الثلاث.

مسح ملف

من أجل ذلك سنستعمل الدالة delete()

أولا ننشئ كائنا File ونمرر للconstructor مسار الملف الذي نريد مسحه

File f = new File("c:\\test.txt");

ثم ننادي على الميثود delete() التي تعيد لنا boolean


if (success) {
System.out.println(f.getName() + " deleted.");
} else {
System.out.println("Failed to delete ." + f.getName());
}
boolean success = f.delete();

إنشاء ملف جديد فارغ

من أجل ذلك سنستعمل الدالة createNewFile()

أولا ننشئ كائنا File ونمرر للconstructor مسار الملف الذي نريد إنشاءه

File f = new File("c:\\test.txt");

ثم ننادي على الميثود createNewFile() التي تعيد لنا boolean ويمكن أن ترفع IOException


boolean success = f.createNewFile();
if (success) {
System.out.println(f.getName() + " created.");
} else {
System.out.println("Failed to create ." + f.getName());
}
} catch (IOException ex) {
ex.printStackTrace();
}
try {

التحقق من وجود ملف ما

من أجل ذلك سنستعمل الدالة exists()

أولا ننشئ كائنا File ونمرر للconstructor مسار الملف الذي نريد التحقق من وجوده

File f = new File("c:\\test.txt");

ثم ننادي على الميثود exists() التي تعيد لنا boolean


System.out.println(f.getName() + " exists: " + exist);
boolean exist = f.exists();

>>>>> عودة إلى الأسئلة <<<<<

#29

ماذا يعني هذا الخطأ java.lang.OutOfMemoryError: Java heap space

عند تشغيل برنامج ما، فإن الJVM تخصص له كمية ما من الذاكرة ليشتغل عليها، لكن أحيانا يكون البرنامج بحاجة لذاكرة أكبر من الحجم الذي توفره الJVM افتراضيا، لذلك يتم رفع OutOfMemoryError، أي أن البرنامج يحاول استعمال كمية من الذاكرة أكبر من المخصصة له.

لحل هذا المشكل، يجب تكبير كمية الذاكرة المخصصة للبرنامج، وذلك باستعمال الخيار XmxN عند تشغيل البرنامج، حيث N هو حجم الذاكرة الذي نريده. هذا الخيار يمكننا من تحديد كمية الذاكرة القصوى المخصصة للبرنامج.

java -Xmx20m YourProgram

20m تعني 20 mega bytes، أي أن الJVM ستخصص للبرنامج 20 mega bytes من الذاكرة كحد أقصى

>>>>> عودة إلى الأسئلة <<<<<

تم تعديل هذه المشاركة بواسطة herch في 13 ديسمبر 2009 في 00:11

#30

كيف أحصل على لائحة كل الملفات الموجودة داخل مجلد ما، أو فقط الملفات ذات امتداد معين؟؟

عند التعامل مع الملفات والمجلدات، فالفئة المستعملة تكون غالبا java.io.File، وهي نفسها التي سنستعمها في هذه الحالة.

الطريقة method التي سنستعمل هي list() والتي تعيد مصفوفة من صنف String.


String[] files = dir.list();
for (int i = 0; i < files.length; i++) {
System.out.println(files);
}
File dir = new File("/home/issam");

هذا الكود يقوم بكتابة أسماء كل الملفات الموجودة في المجلد /home/issam

إذا كنا لانريد لائحة كل الملفات، بل فقط الملفات ذات امتداد محدد، الطريقة method المستعملة هي

 list(FilenameFilter filter)

FilenameFilter عبارة عن interface تحتوي على طريقة واحدة، هي

boolean accept(File dir, String name)

ما يعني أنه يجب أن نكتب فئة تنفذ implement هذه الinterface، ونكتب الكود الخاص بالطريقة accept، والذي سيقوم بالتحقق من امتدادت الملفات وقبول الملفات التي نريد فقط.

سنقوم مثلا بكتابة فئة تقبل فقط الملفات ذات امتداد txt.



public boolean accept(File dir, String name) {
if (name.endsWith(".txt")) {
return true;
} else {
return false;
}
}

}
class TxtFilenameFilter implements FilenameFilter {

الargument الأول الخاص بaccept يمثل المجلد الذي يحتوي على الملف الذي سنتحقق من امتداده، والargument الثاني يمثل إسم الملف. ما قمنا به هو أننا تحققنا من امتداد الملف، إذا كان هو txt نعيد true، أي أننا نقبل هذا الملف، إذا كان غير ذلك نعيد false.

وهذا المثال كاملا، طبعا لا تنسوا تغيير المسار الذي تمررونه للconstructor الخاص بFile بمسار المجلد الذي تريدون التعامل معه


import java.io.FilenameFilter;

public class ListFiles {

public static void main(String[] args) {
File dir = new File("/home/issam");
//All files
String[] files = dir.list();
System.out.println("Listing all files in " + dir.getPath());
for (int i = 0; i < files.length; i++) {
System.out.println(files);
}
//txt files only
TxtFilenameFilter filter = new TxtFilenameFilter();
String[] txtFiles = dir.list(filter);
System.out.println("Listing only txt files in " + dir.getPath());
for (int i = 0; i < txtFiles.length; i++) {
System.out.println(txtFiles);
}
}
}

class TxtFilenameFilter implements FilenameFilter {

public boolean accept(File dir, String name) {
if (name.endsWith(".txt")) {
return true;
} else {
return false;
}
}

}
import java.io.File;

>>>>> عودة إلى الأسئلة <<<<<

#31

كيف أتعرف على محتوى ملف zip؟؟

الجافا توفر عدة فئات تتيح التعامل مع الملفات المضغوطة zip ( أو بالأحرى الأرشيف zip )، هذه الفئات موجودة في الحزمة java.util.zip

للإجابة عن السؤال، سنستعمل فئتين موجودتين في تلك الحزمة، ZipInputStream التي تمكننا من قراءة الأرشيف zip، بعد أن نكون مررنا لها FileInputStream يمثل الملف، و ZipEntry الذي يمثل محتوى الأرشيف zip، أي الملفات والمجلدات الموجودة بداخله. فالأرشيفات zip تجمع بين عملين: الارشفة مثل الملفات tar، والضغط مثل gzip، اي تجمع خاصيتين في آن واحد، لذلك فملفات zip يمكن أن تحتوي على عدة ملفات بخلاف gzip التي لا تحتوي سوى على ملف واحد.

أولا ننشئ object من فئة ZipInputStream، وكما قلت نمرر له FileInputStream يمثل الملف zip الذي نريد معرفة محتواه

ZipInputStream zipInput = new ZipInputStream(new FileInputStream("archive.zip"));

بعد ذلك نسترجع كل مكون للأرشيف zip على حدة بواسطة getNextEntry() ونطبع إسمه


while ((entry = zipInput.getNextEntry()) != null) {
System.out.println(entry.getName());
}
ZipEntry entry;

الأرشيفات zip تحتوي كما قلنا على عدة ملفات، لذلك فإننا نسترجع مكونا واحدا في كل مرة، ونقوم بتكرار نفس العملية حتى تعيد getNextEntry() القيمة null، ما يعني أننا قرأنا كامل محتوى الأرشيف.

هذا مثال كامل، كما ترون فقد وضعنا الكود داخل try/catch، ذلك لأن الconstructor الخاص بFileInputStream يرفع exception من نوع FileNotFoundException، والطريقة getNextEntry() ترفع exception من نوع IOException


import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

public class TestZip {

public static void main(String[] args) {

try {
ZipInputStream zipInput = new ZipInputStream(new FileInputStream("archive.zip"));
ZipEntry entry;
while ((entry = zipInput.getNextEntry()) != null) {
System.out.println(entry.getName());
}
} catch (FileNotFoundException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
import java.io.FileInputStream;

>>>>> عودة إلى الأسئلة <<<<<

#32

كيف أضيف object من فئة ما غير String إلى JList؟؟

في الحقيقة، JList، أو بالأحرى الmodel الخاص بJList ( حيث أن الmodel هو المسؤول عن العمليات الخاصة بالبيانات، بينما JList تكتفي فقط بإظهار هذه البيانات ) لا يشترط أن يكون العنصر الذي يتم إضافته من فئة String، حيث كل الطرق methods المسؤولة عن إضافة العناصر تنتظر Object وليس String، فأين المشكل إذن؟؟

فلنحاول إضافة عناصر من فئة ما غير String في هذا المثال وسنلاحظ النتائج.

لنفترض الفئة Person



String firstName, lastName;
int age;

public Person(String firstName, String lastName, int age) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
}
public class Person {

سنضيف بعض الobjects من فئة Person إلى JList


JList mylist = new JList(persons);
Person[] persons = {new Person("ZAZA", "Issam", 24), new Person("ZOZO", "Younes", 15), new Person("ZIZI", "Sophia", 24)};

وهذه هي النتيجة

post-181903-12607464437073_thumb.png

هذه بالتأكيد ليست هي النتيجة التي كنا نريدها :blink:. لماذا حصلنا على هاته النتيجة؟؟

عندما تريد JList إظهار عنصر ما، فإنها تنادي على الطريقة toString()، هذه الطريقة موجودة في الفئة Object وبالتالي فهي موجودة في جميع الفئات، لأن كل الفئات ترث من الفئة Object. هذه الطريقة تعيد object من فئة String، وهذا هو ما يتم إظهاره في الJList.

لكن لماذا ظهرت لنا تلك الجمل الغريبة؟؟ السبب هو أن ذلك هو التصرف الطبيعي للطريقة toString() الموجودة في الفئة Object، حيث الناتج الذي تعيده يكون على الشكل التالي

getClass().getName() + '@' + Integer.toHexString(hashCode())

إذن كل ما يجب علينا فعله هو إلغاء override الطريقة toString() الموجودة في الفئة Object وإعادة كتابتها في الفئة Person



String firstName, lastName;
int age;

public Person(String firstName, String lastName, int age) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}

@Override
public String toString() {
return firstName + " " + lastName + " / " + age + " years";
}
}
public class Person {

والنتيجة التي نحصل عليها هي ما نريد بالضبط :happy:

post-181903-12607472104278_thumb.png

>>>>> عودة إلى الأسئلة <<<<<

#33

ما هي مختلف نوافذ الحوار التي توفرها الفئة JOptionPane؟؟

الفئة JOptionPane توفر الكثير من نوافذ الحوار ذات الإستخدامات المتعددة.

MessageDialog

هي نافذة حوار بسيطة تتيح إظهار رسالة إلى المستخدم، يمكن الحصول عليها بالسطر التالي

JOptionPane.showMessageDialog(null, "A simple message.");

والنتيجة

post-181903-12607524240534_thumb.png

الargument الأول يمثل المكون الأب، أي المكون الذي تنتمي له نافذة الحوار، مثلا لو كنا أظهرنا نافذة الحوار من داخل نافذة JFrame، فسنحدد هذه الJFrame على أنها هي المكون الاب، ما تأثير ذلك؟ التأثير يتجلى في مكان إظهار نافذة الحوار. إذا مررنا JFrame على أنه هو المكون الأب، فسيتم إظهار نافذة الحوار وسط هذه النافذة JFrame، أما إذا مررنا null كما فعلنا في المثال، فإنه يتم إظهارها وسط الشاشة، ولا تكون مرتبطة بمكون آخر.

هذا الأمر ينطبق على كل الطرق showXXXX التي تتوفر عليها JOptionPane

إذا كنا نريد تغيير العنوان وأيضا تغيير الصورة التي تظهر والمرتبطة بنوع الرسالة، يمكننا عمل التالي

information message

JOptionPane.showMessageDialog(null, "An important information to know", "An information message.", JOptionPane.INFORMATION_MESSAGE);

post-181903-1260753158814_thumb.png

error message

JOptionPane.showMessageDialog(null, "A dangerous error has occured", "An error message.", JOptionPane.ERROR_MESSAGE);

post-181903-12607531701667_thumb.png

warning message

JOptionPane.showMessageDialog(null, "WARNING, something dangerous is about to happen", "A warning message.", JOptionPane.WARNING_MESSAGE);

post-181903-12607533414534_thumb.png

InputDialog

هذه النافذة تسمح للمستخدم بإدخال قيمة ما ويمكننا استرجاعها على شكل String

String name = JOptionPane.showInputDialog(null, "Enter your name");

post-181903-12607537976829_thumb.png

ConfirmDialog

هذه النافذة تسمح بطرح سؤال على المستخدم والإجابة بنعم أو لا، يمكننا استرجاع جواب المستخدم على شكل int، ويساوي واحدة من القيم التالية JOptionPane.YES_OPTION، JOptionPane.NO_OPTION ، JOptionPane.CANCEL_OPTION أو JOptionPane.OK_OPTION

int answer = JOptionPane.showConfirmDialog(null, "Are you happy?");

post-181903-12608027809051_thumb.png

يمكننا أيضا تغيير عنوان النافذة، ونوعها، حيث يوجد هناك ثلاث أنواع:

JOptionPane.YES_NO_CANCEL_OPTION تظهر ثلاث ازرار: yes & no & cancel

int answer = JOptionPane.showConfirmDialog(null, "Are you happy?", "A title", JOptionPane.YES_NO_CANCEL_OPTION);

post-181903-12608037290296_thumb.png

JOptionPane.YES_NO_OPTION تظهر فقط الزرين yes & no

int answer = JOptionPane.showConfirmDialog(null, "Are you happy?", "A title", JOptionPane.YES_NO_OPTION);

post-181903-12608038056925_thumb.png

JOptionPane.OK_CANCEL_OPTION تظهر الزرين ok & cancel

int answer = JOptionPane.showConfirmDialog(null, "Do you want to continue?", "A title", JOptionPane.OK_CANCEL_OPTION);

post-181903-12608039259245_thumb.png

كما يمكن تعريب الأزرار التي تظهر في نوافذ الحوار، يكفي كتابة الأسطر التالية في بداية الmain method


UIManager.put("OptionPane.cancelButtonText", "إلغاء");
UIManager.put("OptionPane.yesButtonText", "نعم");
UIManager.put("OptionPane.noButtonText", "لا");
UIManager.put("OptionPane.okButtonText", "موافق");

>>>>> عودة إلى الأسئلة <<<<<

تم تعديل هذه المشاركة بواسطة herch في 15 ديسمبر 2009 في 19:51

#34

كيف أعرف أن مكونا حصل على التركيز focus أو فقده؟؟

يمكن ذلك باستعمال ال FocusListener الذي يحتوي على طريقتين يجب علينا إعادة كتابتهما، focusGained و focusLost


txt.addFocusListener(new FocusListener() {

public void focusGained(FocusEvent e) {
System.out.println("Focus gained");
}

public void focusLost(FocusEvent e) {
System.out.println("Focus lost");
}
});
JTextField txt = new JTextField();

>>>>> عودة إلى الأسئلة <<<<<

1
#35

كيف أحصل على تاريخ اليوم؟؟

عند إنشاء object من فئة java.util.Date، فإنه افتراضيا يأخد قيمة تاريخ اليوم


System.out.println("Today's date is: " + d);
Date d = new Date();

إذا أردتم تغيير شكل كتابة التاريخ، راجعوا الجواب التالي: كيف أغير شكل طباعة التاريخ؟؟

>>>>> عودة إلى الأسئلة <<<<<

تم تعديل هذه المشاركة بواسطة herch في 16 ديسمبر 2009 في 00:17

1
#36

كيف أظهر قائمة menu عند الضغط بالزر الأيمن للفأرة على مكون ما؟؟

في الجافا، هناك القائمة المنسدلة JMenu التي يتم إضافتها إلى JMenuBar، وهناك نوع آخر هو JPopupMenu يمكن إظهاره في أي مكان في النافذة. هذا الأخير هو الذي سنستعمله.

أولا نقوم ببناء القائمة ونضيف لها بعض العناصر


JMenuItem itm1 = new JMenuItem("MenuItem1");
JMenuItem itm2 = new JMenuItem("MenuItem2");
JMenuItem itm3 = new JMenuItem("MenuItem3");
popMenu.add(itm1);
popMenu.add(itm2);
popMenu.add(itm3);
JPopupMenu popMenu = new JPopupMenu();

طبعا لن يحصل شيء عند الضغط على عناصر القائمة، لأننا لم نحدد لها اي Action أو ActionListener، وذلك فقط لاختصار الكود.

الآن نريد أن تظهر القائمة التي بنينا عند الضغط بالزر الأيمن للفأرة على JTextField، يكفي لذلك أن ننادي على الطريقة setComponentPopupMenu


txt.setComponentPopupMenu(popMenu);
JTextField txt = new JTextField();

>>>>> عودة إلى الأسئلة <<<<<

1
#37

كيف أنشئ مجلدا فارغا جديدا؟؟

يكفي إنشاء object من فئة java.io.File ونعطيه إسم المجلد الذي نريد إنشاءه، ثم ننادي على الطريقة mkdir()


dir.mkdir();
File dir = new File("/home/issam/newDirectory");

>>>>> عودة إلى الأسئلة <<<<<

1
#38

كيف أعرف أن السنة كبيسة؟؟

لمعرفة هل سنة ما كبيسة أم لا ( سنة ميلادية طبعا )، سنستعمل الطريقة isLeapYear الموجودة في الفئة java.util.GregorianCalendar، هذه الطريقة تعيد true إذا كانت السنة كبيسة، false إذا لم تكن كذلك


System.out.println(c.isLeapYear(2009));
GregorianCalendar c = new GregorianCalendar();

>>>>> عودة إلى الأسئلة <<<<<

1
#39

كيف يمكن معرفة إسم المستخدم الذي يشغل البرنامج؟؟

يجب استخدام الطريقة System.getProperty ونمرر لها الخاصية التي نريدها: user.name

System.out.println(System.getProperty("user.name"));

>>>>> عودة إلى الأسئلة <<<<<

تم تعديل هذه المشاركة بواسطة herch في 16 ديسمبر 2009 في 02:26

1
#40

كيف يمكن معرفة نظام التشغيل الذي يشتغل فيه البرنامج؟؟

يجب استخدام الطريقة System.getProperty ونمرر لها الخاصية التي نريدها: os.name

System.out.println(System.getProperty("os.name"));

>>>>> عودة إلى الأسئلة <<<<<

1
#41

كيف أجعل النافذة تظهر في منتصف الشاشة؟؟

يمكن أن نستعمل الطريقة setLocationRelativeTo ونمرر لها null


//...
frm.setLocationRelativeTo(null);
frm.setVisible(true);
JFrame frm = new JFrame();

>>>>> عودة إلى الأسئلة <<<<<

#42

كيف يمكن الحصول على مصفوفة char انطلاقا من كائن String؟؟

يمكننا من أجل ذلك استعمال الطريقة toCharArray() الخاصة بالفئة String


char[] c = str.toCharArray();
String str = "A string";

>>>>> عودة إلى الأسئلة <<<<<

1
#43

كيف أغير إسم ملف أو مجلد ما؟؟

سنستعمل الطريقة renameTo الموجودة في الفئة File. هذه الطريقة تنتظر كائن من فئة File يمثل المسار الجديد للملف أو المجلد، وتعيد لنا boolean يساوي true إذا تم تغيير الإسم بنجاح، false إذا لم يتم ذلك


boolean success = f.renameTo(new File("/home/issam/testRenamed.txt"));
if (success) {
System.out.println("File renamed succesfully.");
} else {
System.out.println("Failed to rename file.");
}

File dir = new File("/home/issam/someDirectory");
success = dir.renameTo(new File("/home/issam/directoryRenamed"));
if (success) {
System.out.println("Directory renamed succesfully.");
} else {
System.out.println("Failed to rename directory.");
}
File f = new File("/home/issam/test.txt");

>>>>> عودة إلى الأسئلة <<<<<

#44

Enable sorting in a JTable

يمكننا إضافة خاصية الsorting إلى JTable بربط كائن من فئة TableRowSorter بالJTable وذلك عن طريق الطريقة setRowSorter


Object rows[][] = {{"Office", "Microsoft"}, {"Photohop", "Adobe"}, {"JBuilder", "Borland"}, {"Solaris", "Sun"}, {"Android", "Google"}};
DefaultTableModel model = new DefaultTableModel(rows, cols);
JTable table = new JTable(model);
table.setRowSorter(new TableRowSorter(model));
Object cols[] = {"Name", "Company"};

عندما نظهر JTable فإن الأسطر تظهر غير مرتبة

post-181903-12623730209106_thumb.png

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

post-181903-1262373112524_thumb.png

>>>>> عودة إلى الأسئلة <<<<<

2
#45

Filtering rows in a JTable

post-181903-12623970102371_thumb.png

post-181903-12623970227354_thumb.png

من أجل عمل filtering لأسطر JTable، يجب أن نكون قد أضفنا مسبقا TableRowSorter إلى الجدول، لاننا نستعمل الTableRowSorter من أجل عملية الfiltering، وذلك بالنداء على الطريقة setRowFilter.

الفئة التي تقوم بعمل الfiltering هي RowFilter. في المثال سنستعمل الطريقة regexFilter التي تنتظر كمدخلات النص الذي سنعمل filtering للأسطر على أساسه، ورقم العمود أو الأعمدة التي سنطبق عليها الfiltering، وهذه الطريقة تعيد لنا RowFilter الذي سنمرره إلى setRowFilter.

أولا ننشئ الmodel والجدول ثم نربطه بTableRowSorter


Object rows[][] = {{"Office", "Microsoft"}, {"Photohop", "Adobe"}, {"JBuilder", "Borland"},
{"Solaris", "Sun"}, {"Android", "Google"}, {"MySQL", "Sun"},
{"Chrome", "Google"}, {"Windows", "Microsoft"}};
DefaultTableModel model = new DefaultTableModel(rows, cols);
JTable table = new JTable(model);
TableRowSorter sorter = new TableRowSorter(model);
table.setRowSorter(sorter);
Object cols[] = {"Name", "Company"};

ثم ننشئ JTextField، والهدف منه هو استرجاع النص الذي سنقوم بعمل filtering على أساسه


txtFilter.getDocument().addDocumentListener(new DocumentListener() {

public void insertUpdate(DocumentEvent e) {
try {
Document doc = e.getDocument();
sorter.setRowFilter(RowFilter.regexFilter(doc.getText(0, doc.getLength()), 0)); //0 = filter the first column
} catch (BadLocationException ex) {
System.out.println("Bad location");
}
}

public void removeUpdate(DocumentEvent e) {
try {
Document doc = e.getDocument();
sorter.setRowFilter(RowFilter.regexFilter(doc.getText(0, doc.getLength()), 0)); //0 = filter the first column
} catch (BadLocationException ex) {
System.out.println("Bad location");
}
}

public void changedUpdate(DocumentEvent e) {}
});
JTextField txtFilter = new JTextField();

كما يظهر في الكود، فكل مرة يتم تغيير النص الموجود في الJTextField فإنه يتم إنشاء RowFilter جديد وتمريره إلى الTableRowSorter

>>>>> عودة إلى الأسئلة <<<<<

2
#46

لماذا أحصل على الإستثناء ArrayIndexOutOfBoundsException عند محاولة استرجاع عنصر من المصفوفة؟؟

نحصل على هذا الإستثناء عندما نحاول الوصول إلى عنصر لا ينتمي إلى مجال المصفوفة، وذلك بتمرير index غير مسموح به.

يكون الindex غير مسموح به في حالتين:

  • الindex الذي نمرره للمصفوفة سالب.
  • الindex الذي نمرره أكبر من أو يساوي حجم المصفوفة ( يجب تذكر أن الindex الخاص بالعنصر الأول هو 0 وليس 1 ).

مثلا:


System.out.println(array[2]); //no exception, index is positive and lesser than array size
System.out.println(array[3]); //exception, index is equal to array size
System.out.println(array[-1]); //exception, index is negative
int[] array = {0, 1, 2};	//the size of the array is 3

>>>>> عودة إلى الأسئلة <<<<<

تم تعديل هذه المشاركة بواسطة herch في 3 يناير 2010 في 16:27

#47

كيف أقوم بترتيب sorting عناصر المصفوفة؟؟

من أجل ترتيب مصفوفة ما، يمكننا استعمال الطريقة Arrays.sort والتي تنتظر كargument المصفوفة التي نريد ترتيتبها

مثلا:


System.out.println("array1 before sorting: " + Arrays.toString(array1));
Arrays.sort(array1);
System.out.println("array1 after sorting: " + Arrays.toString(array1));
int[] array1 = {10, 3, 4, 45, 2, 0, 9};

والنتيجة هي كالتالي

array1 before sorting: [10, 3, 4, 45, 2, 0, 9]

array1 after sorting: [0, 2, 3, 4, 9, 10, 45]

ملاحظة: يجب أن تكون عناصر المصفوفة إما primitive types أو فئات تعمل implement للواجهة Comparable وتعرف الطريقة compareTo

>>>>> عودة إلى الأسئلة <<<<<

تم تعديل هذه المشاركة بواسطة herch في 4 يناير 2010 في 03:51

#48

كيف يمكن المناداة على المتصفح الإفتراضي وجعله يفتح صفحة ويب معينة؟؟

Desktop التي توفر لنا الطريقة browse

الجافا، ومنذ نسختها السادسة، تتيح إمكانية المناداة على المتصفح الإفتراضي، وذلك عن طريق الفئة


Desktop desktop = Desktop.getDesktop();
try {
//open the default browser using the method browse which take an URI object representing the web page
desktop.browse(new URI(""));
} catch (URISyntaxException ex) {
ex.printStackTrace();
}
//get a Desktop object

>>>>> عودة إلى الأسئلة <<<<<

تم تعديل هذه المشاركة بواسطة herch في 4 يناير 2010 في 14:04

1
#49

كيف أقرأ محتوى ملف نصي سطرا بسطر؟؟

لقراءة ملف نصي سطرا بسطر، يمكننا استعمال الفئة BufferedReader أو الفئة Scanner:

باستعمال الفئة BufferedReader والطريقة readLine:

أولا ننشئ كائن BufferedReader ونمرر للconstructor كائن من فئة FileReader الذي نمرر له بدوره مسار الملف الذي نريد قراءته


//...
reader = new BufferedReader(new FileReader("myfile.txt"));
BufferedReader reader = null;

ثم نقوم داخل loop بقراءة سطر من الملف وتخزينه في متغير من فئة String، ونقوم بعد ذلك بطباعة قيمة هذا المتغير.

الloop تتوقف عندما تعيد الطريقة readLine() القيمة null، مما يعني أننا وصلنا إلى نهاية الملف.


while ((line = reader.readLine()) != null) {
System.out.println(line);
}
String line;

الكود كاملا:


try {
reader = new BufferedReader(new FileReader("myfile.txt"));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException ex) {
ex.printStackTrace();
} finally {
try {
if (reader != null) {
reader.close();
}
} catch (IOException ex) {
System.out.println("Closing stream failed.");
}
}
BufferedReader reader = null;

لماذا وضعنا أمر إقفال reader داخل finally؟

ماذا سيحصل لو وضعنا أمر الإغلاق داخل ال try bloc، بعد الإنتهاء من الloop، كما الكود التالي؟؟


String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
reader.close()
//...
//...

لنفترض مثلا أن البرنامج عند تنفيذ الأمر readLine واجه مشكلة في قراءة الملف، مما جعله يرفع IOException، هذا يعني أنه سيتجاهل كل الكود الموجود بعد السطر الذي رفع الإستثناء وسينفذ مباشرة الكود الموجود في catch bloc، وبالتالي لن ينفذ أمر الإغلاق، وسيبقى الreader مفتوحا، وبالتالي لن يتم تحرير الذاكرة التي يستعملها.

الحل إذن هو وضع إمر الإغلاق داخل finally bloc، لأن الكود الموجود داخله يتم تنفيذه دائما، سواء تم رفع exception أو لا.

باستعمال الفئة Scanner:

أولا ننشئ كائن Scanner ونمرر له الملف الذي سنقرأه

Scanner scanner = new Scanner(new File("myfile.txt"));

ثم نقوم داخل loop بقراءة الملف سطرا سطرا بواسطة الطريقة nexLine()، لكن أولا يجب أن نتحقق أننا لم نصل إلى نهاية الملف


String line = scanner.nextLine();
System.out.println(line);
}
while (scanner.hasNextLine()) {

ثم نقفل الscanner

scanner.close();

الكود كاملا:


while (scanner.hasNextLine()) {
String line = scanner.nextLine();
System.out.println(line);
}
scanner.close();
Scanner scanner = new Scanner(new File("myfile.txt"));

>>>>> عودة إلى الأسئلة <<<<<

تم تعديل هذه المشاركة بواسطة herch في 4 يناير 2010 في 22:28

#50

ما فائدة الطريقة toString()؟؟

هذه الطريقة موجودة في الفئة Object وبالتالي فهي موجودة في جميع الفئات، لأن كل الفئات ترث من الفئة Object.

هذه الطريقة تنتج صورة نصية للكائن على شكل كائن String

هذا تعريف Sun لطريقة toString

اقتباس
public String toString()

Returns a string representation of the object. In general, the toString method returns a string that "textually represents" this object. The result should be a concise but informative representation that is easy for a person to read. It is recommended that all subclasses override this method.

لنفترض لدينا الفئة التالية

public class Person {

	String firstName, lastName;
	int age;

	public Person(String firstName, String lastName, int age) {
		this.firstName = firstName;
		this.lastName = lastName;
		this.age = age;
	}
}

إذا نفذنا الكود التالي

Person p = new Person("Ahmed", "Ali", 40);
System.out.println(p);

سنحصل على النتيجة التالية

Person@3e25a5

حصلنا على هذه النتيجة لاننا لم نعمل override لtoString الموروثة من Object.

لكن إذا غيرنا الكود السابق إلى التالي

public class Person {

	String firstName, lastName;
	int age;

	public Person(String firstName, String lastName, int age) {
		this.firstName = firstName;
		this.lastName = lastName;
		this.age = age;
	}

	@Override
	public String toString() {
		return firstName + " " + lastName + " is " + age + " years old.";
	}
}

سنحصل على النتيجة التالية

Ahmed Ali is 40 years old.

>>>>> عودة إلى الأسئلة <<<<<

تم تعديل هذه المشاركة بواسطة herch في 5 يناير 2010 في 00:18

1

هذا الموضوع مغلق.

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