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

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

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

كيف يمكن تقسيم جملة String حسب فاصل ما؟؟

لتقسيم جملة String، فإننا نستعمل الطريقة split

public String[] split(String delimiter)

المعطى "delimiter" الذي نمرره هو الفاصل الذي سنقسم الجملة على أساسه.

لنفترض الجملة التالية:

اقتباس
A sentence with some whitespace and words and no meaning!!

لو أردنا تقسيمها حسب الفراغات ( whitespace ) وطباعة محتوى المصفوفة التي نحصل عليها فإننا سنقوم بالتالي:

String phrase = "A sentence with some whitespace and words and no meaning!!";
String[] words = phrase.split(" ");
for (String word : words) {
	System.out.println(word);
}

والنتيجة

A

sentence

with

some

whitespace

and

words

and

no

meaning!!

مثال آخر

String phrase = "Column1#Column2#Column3#Column4#Column5";
String[] cols = phrase.split("#");
for (String c : cols) {
	System.out.println(c);
}

والنتيجة

Column1

Column2

Column3

Column4

Column5

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

#52

كيف أجعل واجهة برنامجي متعددة اللغات؟؟

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

الملفات properties

عند كتابة هذه الملفات، يجب احترام نموذج محدد: أولا إسم الملف، مثلا "labels"، متبوعا بالرمز "_"، متبوعا بالرمز الخاص باللغة، مثلا رمز العربية هو "ar"، رمز الفرنسية "fr" ورمز الإنجليزية هو "en". إذن حسب النموذج فإن إسم ملف اللغة العربية يجب أن يكون كالتالي labels_ar.properties

محتوى هذه الملفات يكون على شكل

key=value

key=value

....

بحيث أننا نسترجع النص الذي نريده بواسطة key.

كما أنه تجدر الإشارة إلى أن الملفات properties تقبل فقط الترميز ISO-8859-1، أي الحروف اللاتينية فقط، إذا أردنا إضافة حروف عربية، يجب أن نكتب الرمز unicode المرادف لكل حرف.

الفئة java.util.Locale

هذه الفئة تمكننا من تحديد المنطقة الجغرافية أو الثقافية التي نريد. فبما أننا نريد أن نغير لغة واجهة برنامجنا، فيلزمنا وسيلة لتحديد هذه اللغة، وهنا تظهر فائدة الفئة Locale. مثلا إذا أردنا إنشاء Locale خاص بالعربية، فإننا نمرر رمز اللغة العربية للconstructor

Locale arLocale = new Locale("ar");

لمعرفة الرمز الخاص بكل لغة --> http://www.loc.gov/s...p/code_list.php

الفئة java.util.ResourceBundle

هذه الفئة هي التي تقوم بتحميل ملف الproperties الخاص باللغة التي نحددها، وبالطبع تحديد اللغة يعني إنشاء كائن Locale خاص بهاته اللغة. بعد تحميل الملف فإننا نستطيع الوصول للقيم الموجودة بداخله عن طريق getString التي نمرر لها قيمة الkey.

للحصول على كائن ResourceBundle فإننا ننادي على الطريقة getBundle، ونمرر لها إسم الملف properties، لكن ليس كل الإسم، لكن فقط الجزء الموجود قبل اللغة، مثلا إذا كان لدينا الملف labels_en.properties، فإننا نمرر "labels" فقط للطريقة getBundle. هذه الطريقة تنتظر معطى آخر، وهو كائن Locale يمثل اللغة التي نريد استعمالها.


ResourceBundle myResources = ResourceBundle.getBundle("labels", currentLocale);
String someValue = myResources.getString("someKey");
Locale currentLocale = new Locale("ar");

مثال تطبيقي

أولا نكتب الملفات properties

labels_ar.properties

اقتباس
title=\u0646\u0627\u0641\u0630\u0629 \u0645\u062a\u0639\u062f\u062f\u0629 \u0627\u0644\u0644\u063a\u0627\u062a

file=\u0645\u0644\u0641

new=\u062c\u062f\u064a\u062f

exit=\u062e\u0631\u0648\u062c

message=\u0647\u0630\u0647 \u0631\u0633\u0627\u0644\u0629 \u0628\u0633\u064a\u0637\u0629 \u0628\u0627\u0644\u0639\u0631\u0628\u064a\u0629

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

native2ascii labels_ar.properties

labels_en.properties

اقتباس
title=Multi language frame

file=File

new=New

exit=Exit

message=A simple message in english..

كتابة كود البرنامج

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

أولا نقوم بإنشاء الكائن ResourceBundle داخل ال constructor، هذا الconstructor ينتظر الLocale الذي سنستعمله

public MultiLangTest(Locale locale) {
	ResourceBundle myResources = ResourceBundle.getBundle("labels", locale);
	//....
}

ثم نبني الواجهة، وكما ستلاحظون، لم نقم بكتابة أي نص مباشرة، بل نكتفي بالنداء على الطريقة getString الخاصة بالكائن ResourceBundle الذي أنشأنا

public MultiLangTest(Locale locale) {
	ResourceBundle myResources = ResourceBundle.getBundle("labels", locale);

	JMenuItem itmNew = new JMenuItem(myResources.getString("new"));
	JMenuItem itmExit = new JMenuItem(myResources.getString("exit"));

	JMenu menuFile = new JMenu(myResources.getString("file"));
	menuFile.add(itmNew);
	menuFile.add(itmExit);

	JMenuBar menuBar = new JMenuBar();
	menuBar.add(menuFile);

	JFrame frm = new JFrame(myResources.getString("title"));
	frm.add(new JLabel(myResources.getString("message")), BorderLayout.NORTH);
	frm.setJMenuBar(menuBar);
	frm.setSize(400, 400);
	frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	frm.setVisible(true);
}

وفي ال main، نقوم بإنشاء Locale حسب اللغة التي يتم تمريرها للبرنامج، ومن ثم نمررها للconstructor

public static void main(String[] args) {
	if (args.length == 0) {
		System.out.println("Please specify the language. (ar|en)");
	} else {
		if (args[0].equals("ar")) {
			new MultiLangTest(new Locale("ar"));
		} else if (args[0].equals("en")) {
			new MultiLangTest(Locale.ENGLISH);
		}
	}
}

عند تنفيذ البرنامج بالشكل التالي

java MultiLangTest ar

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

post-181903-12632958834172_thumb.png

أما بالشكل التالي

java MultiLangTest en

فالنتيجة

post-181903-12632958633975_thumb.png

مازال هناك مشكل، فكما لاحظتم فإن تنسيق الواجهة غير جيد في حالة العربية، لأنه يبتدأ من اليسار، بينما اللغة العربية تبتدأ من اليمين، لحل المشكل، سنضيف السطر التالي إلى الconstructor

frm.applyComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);

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

java MultiLangTest ar

post-181903-12632959536992_thumb.png

الكود النهائي

import java.awt.BorderLayout;
import java.util.Locale;
import java.util.ResourceBundle;
import java.awt.ComponentOrientation;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

public class MultiLangTest {

	public MultiLangTest(Locale locale) {
		ResourceBundle myResources = ResourceBundle.getBundle("labels", locale);
		JFrame frm = new JFrame(myResources.getString("title"));
		JMenu menuFile = new JMenu(myResources.getString("file"));
		JMenuItem itmNew = new JMenuItem(myResources.getString("new"));
		JMenuItem itmExit = new JMenuItem(myResources.getString("exit"));
		menuFile.add(itmNew);
		menuFile.add(itmExit);
		JMenuBar menuBar = new JMenuBar();
		menuBar.add(menuFile);
		frm.add(new JLabel(myResources.getString("message")), BorderLayout.NORTH);
		frm.setJMenuBar(menuBar);
		frm.applyComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
		frm.setSize(400, 400);
		frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frm.setVisible(true);
	}

	public static void main(String[] args) {
		if (args.length == 0) {
			System.out.println("Please specify the language. (ar|en)");
		} else {
			if (args[0].equals("ar")) {
				new MultiLangTest(new Locale("ar"));
			} else if (args[0].equals("en")) {
				new MultiLangTest(Locale.ENGLISH);
			}
		}
	}
}

الكود والملفات properties في المرفقات.

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

multi_languages.zip

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

2
#53

ما هي ال keywords الخاصة بالجافا؟؟

هذه لائحة ال keywords الخاصة بالجافا، أي أنه لا يسمح باستخدام أي كلمة في اللائحة كإسم لمتغير أو طريقة أو فئة

<table><tr><td>abstract</td><td>continue</td><td>for</td><td>new</td> <td>switch</td></tr>

<tr><td> assert</td> <td>default</td> <td>if</td> <td>package</td> <td>synchronized</td></tr>

<tr><td> boolean </td> <td>do </td> <td>goto</td> <td> private </td> <td>this</td></tr>

<tr><td>break </td> <td>double </td> <td>implements </td> <td>protected </td> <td>throw</td></tr>

<tr><td>byte </td> <td>else </td> <td>import</td> <td> public</td> <td> throws</td></tr>

<tr><td>case </td> <td>enum </td> <td>instanceof </td> <td>return</td> <td> transient</td></tr>

<tr><td>catch</td> <td> extends</td> <td> int</td> <td> short </td> <td>try</td></tr>

<tr><td>char</td> <td> final</td> <td> interface</td> <td> static </td> <td>void </td></tr>

<tr><td>class</td> <td> finally</td> <td> long</td> <td> strictfp</td> <td> volatile</td></tr>

<tr><td> const</td> <td> float</td> <td> native </td> <td>super</td> <td> while</td></tr></table>

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

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

#54

كيف أضيف أو أحذف أسطر وأعمدة من جدول JTable؟؟

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

أولا نقوم بإنشاء كائن DefaultTableModel ونربطه بالجدول


DefaultTableModel model = new DefaultTableModel(columnNames, 0); //0 is the number of rows
JTable table = new JTable(model);
String[] columnNames = {"Name", "Age"};

ثم ننادي عى الطريقة addRow ونمرر لها مصفوفة نحتوي على البيانات التي نريد إضافتها


model.addRow(rowData);
Object[] rowData = {"Ahmed", 90};

لحذف سطر من الجدول، سنستعمل الطريقة removeRow الموجودة ايضا في الفئة DefaultTableModel، هذه الطريقة تنتظر قيمة int تمثل رقم السطر في الجدول

model.removeRow(0);	//remove the first row

لإضافة عمود إلى الجدول، سنستعمل الطريقة addColumn الخاصة بالفئة DefaultTableModel، هذه الطريقة تنتظر String يمثل إسم العمود.

model.addColumn("New column");

لحذف عمود من الجدول، نستعمل الطريقة removeColumn الخاصة بالفئة JTable، هذه الطريقة تنتظر كائنا من فئة TableColumn يمثل العمود الذي نريد حذفه.

أولا نسترجع ال TableColumnModel الخاص بالجدول والذي سيمكننا من استرجاع الكائن TableColumn

TableColumnModel columnModel = table.getColumnModel();

ثم نسترجع العمود الذي نريد حذفه على شكل كائن من فئة TableColumn

TableColumn column = columnModel.getColumn(0);	//get the first column

ونحذف العمود

table.removeColumn(column);

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

#55

كيف يمكن الرسم في الجافا؟؟

لنتمكن من الرسم، سواء في الجافا أو على أرض الواقع، يلزمنا لوحة نرسم عليها. هذه اللوحة يمكن أن تكون أحد مكونات ال Swing، وعادة نستخدم الفئة JPanel.

كل عمليات الرسم في ال Swing تتم داخل الطريقة paintComponent، والفئة JPanel ليست استثناء. لذلك، إذا أردنا أن نقوم بالرسم داخل JPanel فيلزمنا أن نرث من هذه الفئة ونعيد كتابة الطريقة paintComponent بالشكل الذي يلائمنا.



@Override
protected void paintComponent(Graphics g) {
//some painting
}
}
class CustomJPanel extends JPanel {

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

#56

كيف أرسم أشكال هندسية في الجافا؟؟

كما سبقت الإشارة لذلك، فإننا نقوم بالرسم في أحد مكونات Swing، غالبا JPanel. وكل عمليات الرسم تتم داخل الطريقة paintComponent.

هذه الطريقة تنتظر كائنا من فئة Graphics، هذا الكائن يمكن اعتباره فرشاة الرسم، فهو الذي يوفر لنا الطرق التي تمكننا من الرسم وتغيير لون الرسم ... (شبهنا سابقا JPanel بلوحة الرسم).

من بين الطرق التي تحتوي عيها الفئة Graphics

drawRect(int x, int y, int width, int height)

هذه الطريقة ترسم مستطيلا فارغا. x و y يمثلان الإحداثيات التي سنبدأ منها الرسم، width و height يمثلان العرض والطول.

fillRect(int x, int y, int width, int height)

هذه الطريقة ترسم مستطيلا مملوءا. x و y يمثلان الإحداثيات التي سنبدأ منها الرسم، width و height يمثلان العرض والطول.

drawOval(int x, int y, int width, int height)

هذه الطريقة ترسم دائرة فارغة. x و y يمثلان الإحداثيات التي سنبدأ منها الرسم، width و height يمثلان العرض والطول.

fillOval(int x, int y, int width, int height)

هذه الطريقة ترسم دائرة مملوءة. x و y يمثلان الإحداثيات التي سنبدأ منها الرسم، width و height يمثلان العرض والطول.

drawLine(int x1, int y1, int x2, int y2)

هذه الطريقة ترسم سطرا. x1 و y1 يمثلان إحداثيات بداية الخط، x2 و y2 يمثلان إحداثيات النهاية.

setColor(Color c)

هذه الطريقة تحدد اللون الذي سيتم استعماله في الرسم.

هذه فقط بعض الطرق الموجودة في الفئة Graphics، لمعرفة كل الإمكانيات التي تتيحها هذه الفئة، يمكنكم مراجعة توثيف Sun.

مثال


import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class TestPaint {

public static void main(String[] args) {
JFrame frm = new JFrame();
frm.add(new PaintBoard());
frm.setSize(300, 400);
frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frm.setVisible(true);
}
}

class PaintBoard extends JPanel {

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawRect(10, 10, 80, 80);
g.setColor(Color.RED);
g.fillRect(120, 10, 80, 80);
g.setColor(Color.BLUE);
g.drawOval(10, 120, 80, 80);
g.setColor(Color.GREEN);
g.fillOval(120, 120, 80, 80);
g.setColor(Color.BLACK);
g.drawLine(50, 240, 200, 340);
}
}
import java.awt.Color;

والنتيجة

post-181903-12636486429246_thumb.png

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

#57

كيف ألتقط أحداث الفأرة؟؟

للإستماع إلى الأحداث التي ترسلها الفأرة، نستعمل ال interface MouseListener.

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

mousePressed(MouseEvent e)

ينادى على هاته الطريقة عند الضغط على أحد أزرار الفأرة.

mouseReleased(MouseEvent e)

ينادى على هاته الطريقة عند تحرير أحد أزرار الفأرة.

mouseClicked(MouseEvent e)

ينادى على هاته الطريقة بعد الضغط على أحد أزرار الفأرة. الفرق بينها وبين mousePressed هو أن mousePressed يتم المناداة عليها أثناء الضغط على الزر، بينما mouseClicked يتم المناداة عليها بعد أن يتم ضغط الزر وتحريره.

mouseEntered(MouseEvent e)

ينادى على هاته الطريقة عندما يدخل مؤشر الفأرة إلى المكون المرتبط بهذا ال MouseListener.

mouseEntered(MouseEvent e)

ينادى على هاته الطريقة عندما يخرج مؤشر الفأرة من المكون المرتبط بهذا ال MouseListener.

مثال تطبيقي

أولا نكتب الفئة التي ستعمل implements للinterface MouseListener



public void mouseClicked(MouseEvent e) {
System.out.println("Mouse clicked. x: " + e.getX() + ", y: " + e.getY());
}

public void mousePressed(MouseEvent e) {
System.out.println("Mouse pressed. x: " + e.getX() + ", y: " + e.getY());
}

public void mouseReleased(MouseEvent e) {
System.out.println("Mouse released.");
}

public void mouseEntered(MouseEvent e) {
System.out.println("Mouse entered.");
}

public void mouseExited(MouseEvent e) {
System.out.println("Mouse exited.");
}
}
class MyMouseListener implements MouseListener {

ثم نضيف هذا الMouselListener إلى المكون الذي نريد الإستماع للأحداث داخله.


pn.addMouseListener(new MyMouseListener());
JPanel pn = new JPanel();

كود البرنامج:


import java.awt.event.MouseListener;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class MouseListenerTest {

public static void main(String[] args) {
JFrame frm = new JFrame();
JPanel pn = new JPanel();
pn.addMouseListener(new MyMouseListener());
frm.add(pn);
frm.setSize(400, 400);
frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frm.setVisible(true);
}
}

class MyMouseListener implements MouseListener {

public void mouseClicked(MouseEvent e) {
System.out.println("Mouse clicked. x: " + e.getX() + ", y: " + e.getY());
}

public void mousePressed(MouseEvent e) {
System.out.println("Mouse pressed. x: " + e.getX() + ", y: " + e.getY());
}

public void mouseReleased(MouseEvent e) {
System.out.println("Mouse released.");
}

public void mouseEntered(MouseEvent e) {
System.out.println("Mouse entered.");
}

public void mouseExited(MouseEvent e) {
System.out.println("Mouse exited.");
}
}
import java.awt.event.MouseEvent;

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

#58

كيف ألون شكلا ما ب gradient بدل لون موحد؟؟

GradientPaint.

سنستخدم من أجل ذلك الفئة

أولا ننشئ كائن من فئة GradientPaint، نمرر لل constructor إحداثيات بداية ال gradient، ثم اللون الأول لل gradient، فإحداثيات نهاية ال gradient، ثم اللون الثاني لل gradient.

 GradientPaint(float x1, float y1, Color color1, float x2, float y2, Color color2)

ثم نقول للبرنامج باستعمال هذا الكائن باستعمال الطريقة setPaint


g2.setPaint(gradient);
Graphics2D g2 = (Graphics2D)g;

مثال


import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class TestPaint {

public static void main(String[] args) {
JFrame frm = new JFrame();
frm.add(new PaintBoard());
frm.setSize(200, 200);
frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frm.setVisible(true);
}
}

class PaintBoard extends JPanel {

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
GradientPaint gradient = new GradientPaint(50, 50, Color.BLACK, 50, 150, Color.WHITE);
Graphics2D g2 = (Graphics2D)g;
g2.setPaint(gradient);
g2.fillRect(50, 50, 100, 100);
}
}
import java.awt.Color;

post-181903-12638381235269_thumb.png

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

#59

ما هي ال Boxing ، Unboxing ، Wrapper Classes؟؟

ال Wrapper Classes هي فئات تقوم بتغليف primitive types. فكل primitive type لديه Wrapper مرتبط به. فمثلا الصنف int وهو primitive type لديه الفئة Integer. الصنف double لديه Double...

هذه هي ال Wrapper Classes الموجودة

  • Boolean
  • Byte
  • Character
  • Short
  • Integer
  • Long
  • Float
  • Double

وكما نلاحظ، فهي بنفس عدد ال primitive types.

بالنسبة لل Boxing، فهو عملية تحويل primitive type إلى Wrapper class. مثال

int i = 3; 
Integer wrapper = i; 
System.out.println(wrapper.intValue());

هذا الكود لا يعطي أي خطأ، مع أن i و wrapper نوعين مختلفين، لكن Integer هي ال Wrapper class الخاص ب int، لذلك فما قمنا به هو Boxing، أي تحويل primitive type إلى Wrapper class.

بالنسبة لل Unboxing، فهي العملية المعاكسة لل Boxing، أي عملية تحويل Wrapper class إلى primitive type.

Boxing Conversion

Unboxing Conversion

نحتاج لل Wrapper class في الحالات التي لا نستطيع فيها استعمال primitive type، ونكون مجبرين على استعمال object، مثلا في حالة ال Collections.

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

تم تعديل هذه المشاركة بواسطة herch في 23 يناير 2010 في 15:11

#60

ما هي ال static import؟؟

عادة نستعمل ال import statement بالشكل التالي

import package.*;

والهدف طبعا هو استعمال الفئات الموجودة بهذا ال package بدون كتابة الإسم الكامل، والذي يحتوي على إسم ال package كاملا بالإضافة لإسم الفئة packagename.ClassName

ال static import له نفس الهدف، لكن ما نقوم بعمل ال import له ليس الفئات الموجودة في package، بل ال static members الموجودة في فئة ما.

مثلا لنفترض أننا نريد استعمال ال static members الموجودة في الفئة Math، سنقوم طبعا بكتابة إسم الطريقة أو الخاصية، مسبوقا بإسم الفئة Math


System.out.println(Math.abs(-10));
System.out.println(Math.PI);

لكن باستعمال static import، لسنا مجبرين على كتابة إسم الفئة Math، بل نكتب أسماء الطرق والخاصيات مباشرة


//.....
System.out.println(PI);
System.out.println(abs(-10));
import static java.lang.Math.*;

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

2

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

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