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

استفسار بخصوص تنسيق String

بدأه Dev:MOH-TAHA في 25 نوفمبر 2009 · 19 رد · 1,192 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

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

ArrayList

فيها عدد من ال Objects

الاريه لست هذه تحتوي اوبجكتس من نوع Store

كل Store

له Id

و name

الآن كما هو موضح في الصورة التي بالمرفقات

اقوم بعرض الستورس (الاسم والid )

في تكست اريا

ولا اريد عرضها في JTabel

بل اريدها في تكست اريا

قمت باستخدام هذه ال method

لقراءة الاسم والرقم من الاريه لست


String str="Name ID\n";
for(int i=0;i<stores.size();i++){
str+=stores.get(i).getName()+" "+stores.get(i).getId()+"\n";

}
return str;

}
 public String getStores (){

كما تلاحظون هي تعيد String ال

الآن المشكلة التي لدي انه لو كان الاسم قصير فيتم ازاحة ال id نحو اليسار

ولو كان طويلا يتم ازاحته نحو اليمين

أريد ان يتم وضع ال ID

في سطر واحد تحت ترويسة ال ID

ويتم وضع الاسم تحت ترويسة

Name

فهل يوجد طريقة لفعل هذا الامر ؟

وهل الموضوع مفهوم ام اشرح اكثر

وشكرا لكم

post-216347-12591597319773_thumb.png

Linux for human beings

#2

حاول استخدام

str+=stores.get(i).getName()+"\r"+stores.get(i).getId()+"\n";

تم تعديل هذه المشاركة بواسطة Mohammed Mshari Ersan في 25 نوفمبر 2009 في 17:55

#3

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

10r8xg2.jpg

شكرا لك عزيزي ولكن ليس هذا ما أصبو اليه

هل يوجد حل للمشكلة التي اواجهها ؟

Linux for human beings

#4

لا أظن أنك ستصل للنتيجة التي تريدها باستعمال JTextArea، لانه كان ممكن تستعمل String.format لتحديد حجم كل عمود، لكن المشكل أن حجم الحروف يختلف وبالتالي لن تكون الأعمدة منسقة

لنأخذ كمثال الكلمتين التاليتين

l12i

mgma

بالرغم من أن الإثنين يحتويان على أربع حروف أي أن طولهما 4 إلا أن الأولى أقصر من الثانية بالنصف تقريبا

ملاحظة أخرى، لا يجب أبدا استعمال string concatenation، بل يجب استعمال StringBuilder أو StringBuffer

#5

شكرا لك عزيزي

لكن لماذا لا يجب استخدام string concatenation ؟

Linux for human beings

#6

لأن الكائنات من فئة String غير قابلة للتغيير Immutable وبالتالي في كل مرة تعمل concatenation فإنك تنشئ object جديد في الذاكرة. بالطبع في مشروع صغير لن يكون هناك تأثير كبير لكن في مشروع كبير يمكن أن يخلق مشاكل في فعالية البرنامج. لذلك فإنه ينصح باستعمال StringBuidler أو StringBuffer

#7

كلامك صحيح لم أكن أعتقد انك تقصد هذه الناحية

شكرا لك على المساعدة والملاحظة :)

Linux for human beings

#8
 	public String getStores (){

     	//maximum space
     	final int space = 30;
     	final String name = "Name";
     	final String id = "ID";
     	StringBuilder builder = new StringBuilder();


     	builder.append("Name");
     	for(int i=0; i<(space - name.length()); i++)
     	{
         	builder.append(" ");
     	}
     	builder.append(id);
     	for(int i=2; i<stores.size(); i++)
     	{
         	builder.append("\n");
         	String xName = stores.get(i).getName();

         	builder.append(xName);

         	for(int j=0; j<(space - xName.length()); j++)
         	{
             	builder.append(" ");
         	}

         	builder.append(stores.get(i).getId());
     	}


        //System.out.println(builder.toString());

        return builder.toString();
        }

This should work for you.

#9

It's does not work ,, the same result

thank you :)

Linux for human beings

#10

الأخ قصد موضوع String concatenation

بالنسبة لموضوع التنسيق استخدم JTable

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#11
Dev:MOH-TAHA كتب:

It's does not work ,, the same result

thank you :)

Actually my code works properly. Probably your problem is in the font of the text area. Set the font to "Monospaced" and it should be fine If you still have any problem let me know. JTable is always better for such things :) but still this will work :)

#12

السلام عليكم

اخى العزيز ما فهمته من سؤالك هو انك تريد تنسيق النص فى صندوق النص كانه فى جدول

اى يكون متساوى الاطراف اليسرى مثلا حتى مع اختلاف طول الكلمات التى تحتوى عليها الاعمدة

وهذه بسيطة جدا

كل ماعليك هو ان تحجز مساحة كافية وثابتة لاتساع كل عمود وليكن 15 خلية

ويمكنك فعل ذلك باستخدام الفئة String.format وتستخدم التنسيق الذى تريده

انظر المثال

import java.util.ArrayList;

public class Myformat {
	public static void main(String[] args) {

    	ArrayList<person> array=new ArrayList<person>();

    	array.add(new person("10","mohamed"));
    	array.add(new person("1250.458","ali"));

    	for(int i=0;i<array.size();i++){
        	System.out.print(String.format("%-15s%-15s\n",array.get(i).getId(),array.get(i).getName()));
    	}

	}

}// end Myformat

class person{

    	String id="";
    	String name="";

    	public person(String id,String name){
        	this.id=id;
        	this.name=name;
    	}

    	public String getId(){
        	return this.id;
    	}

    	public String getName(){
        	return this.name;
    	}
	}

سيكون الناتج طباعة الاتى

10         	mohamed    	
1250.458   	ali

لاحظ ان العمود الاول فى الصف الاول حجز المسافة كاملة رغم اختلاف طول القيمة الاولى

وهكذا يمكنك استخدام التنسيق فى مثالك حاول واى مشكلة اعرضها وان شاء الله نساعدك فيها

بالتوفيق

تم تعديل هذه المشاركة بواسطة MOHAMED FATHEI في 25 نوفمبر 2009 في 23:18


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

#13

استعمال الخط monospaced فكرة جميلة جدا، وهي تزيل مشكل اختلاف أحجام الحروف، وبالتالي يمكن استعمال String.format وتحديد طول العمود الأول الذي يمثل Name، وهي طريقة أقصر من الطريقة التي اقترحتها

 

StringBuilder strB = new StringBuilder();
strB.append(String.format("%-20s%s\n", "Name", "ID"));
for (int i = 0; i < stores.size; i++) {
	strB.append(String.format("%-20s%s\n", stores.get(i).getName(), stores.get(i).getId()));
}

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

------------------------------

يبدو أني تأخرت :mad: هذا لأني اكتب بالعربي مثل السلحفاة :D

تم تعديل هذه المشاركة بواسطة Xacker في 20 يناير 2013 في 00:35

#14

هيه شباب معلومات أكثر عن الأخت format

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#15
'NullOne كتب:
Actually my code works properly. Probably your problem is in the font of the text area. Set the font to "Monospaced" and it should be fine If you still have any problem let me know. JTable is always better for such things :) but still this will work :)

بما ان الكتابة بالانجليزية ممنوعة سأكتب بالعربية

صحيح اخي بعد تغيير الخط ظهر كل شئ بالشكل الصحيح لك مني جزيل الشكر :)

 

 

'MOHAMED FATHEI كتب:
السلام عليكم

اخى العزيز ما فهمته من سؤالك هو انك تريد تنسيق النص فى صندوق النص كانه فى جدول

اى يكون متساوى الاطراف اليسرى مثلا حتى مع اختلاف طول الكلمات التى تحتوى عليها الاعمدة

وهذه بسيطة جدا

كل ماعليك هو ان تحجز مساحة كافية وثابتة لاتساع كل عمود وليكن 15 خلية

ويمكنك فعل ذلك باستخدام الفئة String.format وتستخدم التنسيق الذى تريده

انظر المثال

 

import java.util.ArrayList;

public class Myformat {
	public static void main(String[] args) {
 	
 	ArrayList<person> array=new ArrayList<person>();
 	
 	array.add(new person("10","mohamed"));
 	array.add(new person("1250.458","ali"));
 	
 	for(int i=0;i<array.size();i++){
 	System.out.print(String.format("%-15s%-15s\n",array.get(i).getId(),array.get(i).getName()));
 	}
 	
	}
 	
}// end Myformat

class person{
 	
 	String id="";
 	String name="";
 	
 	public person(String id,String name){
 	this.id=id;
 	this.name=name;
 	}
 	
 	public String getId(){
 	return this.id;
 	}
		
 	public String getName(){
 	return this.name;
 	}
	}

سيكون الناتج طباعة الاتى

10 	mohamed 	1250.458 	ali

لاحظ ان العمود الاول فى الصف الاول حجز المسافة كاملة رغم اختلاف طول القيمة الاولى

وهكذا يمكنك استخدام التنسيق فى مثالك حاول واى مشكلة اعرضها وان شاء الله نساعدك فيها

بالتوفيق

 

لك مني جزيل الشكر اخي العزيز لكن هل ممكن شرح اكثر عن format مع ملاحظة ان المثال واضح لكن للمعلومات المستقبلة ,,والفائدة العامة ،، شكرا لك :)

 

 

 

 

'herch كتب:
استعمال الخط monospaced فكرة جميلة جدا، وهي تزيل مشكل اختلاف أحجام الحروف، وبالتالي يمكن استعمال String.format وتحديد طول العمود الأول الذي يمثل Name، وهي طريقة أقصر من الطريقة التي اقترحتها

StringBuilder strB = new StringBuilder();
strB.append(String.format("%-20s%s\n", "Name", "ID"));
for (int i = 0; i < stores.size; i++) {
	strB.append(String.format("%-20s%s\n", stores.get(i).getName(), stores.get(i).getId()));
}

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

------------------------------

يبدو أني تأخرت :mad: هذا لأني اكتب بالعربي مثل السلحفاة :D

 

شكرا لملاحظتك اخي العزيز لكن هل ممكن شرح لل StringBuilder أيضا

شكرا لك :)

Linux for human beings

#16

إذا كنت تريد التوغل في أدغال String.format فإليك الرابط التالي http://java.sun.com/...er.html#summary وهي شبيهة نوعا ما ب printf الموجودة في C

بالنسبة لStringBuilder فهدفها الوحيد هو تجنب ال String concatenation وكل ما يمكن أن يترتب عنها.

مثلا لدينا الكود التالي

String str = "Hello ";
str += "every one. ";
str += "How are you?";
System.out.println(str);

يمكن عمل ما سبق باستعمال StringBuilder كالآتي

StringBuilder strBuidler = new StringBuilder("Hello ");
strBuidler.append("every one. ");
strBuidler.append("How are you?");
System.out.println(strBuidler.toString());

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

#17

جميل جدا

شكرا لك اخي العزيز بارك الله فيك

Linux for human beings

#18

السلام عليكم

اخى العزيز ارى ان خير وسيلة لتعلمك هى كتاب وخير كتاب Java How To Program

لانه بسيط فى امثلته وخاصة الاصدار السادس

لذلك قمت برفعه وهذا هو الرابط

Java How To Program 6 Edition

بعد تحميل الكتاب اذهب الى الفصل ال 28 وهو بعنوان Formatted Output

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

جربه وستعرف مدى تنظيمه وترتيبه

وان احتجت شئ نحن فى الخدمة


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

#19

إذا كانت الفروقات بين الكلمات قليلة (بضع أحرف) استخدم:

\t

ولكن كما قال الأخ علاء، من الأفضل استخدام JTable ويمكنك تعديله بشكل لا يمكن تفريقه عن الـ JTextArea

#20

شكرا لك اخي محمد

وشكرا لكم جميعا

Linux for human beings

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