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

تغيير مكان الكتابة إلى اليمين داخل JComboBox

بدأه MKSoft في 26 نوفمبر 2009 · 21 رد · 1,492 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

إخواني عندي بعض الإستفسارات.

أولا : كيف أغير مكان الكتابة داخل JComboBox , حيث أنني استخدمت اللغة العربية لكتابة القائمة قي داخل العنصر السابق و أيضا استخدمت الكود التالي لجعل التصميم من اليمين إلى اليسار :

jcomboBox.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEF)

لكن بقي أن الكتابة تظهر في الجهة اليسرى من العنصر , فكيف أجعل الكتابة تظهر في المنتصف مثلت أو على اليمين ؟؟

هكذا ظهر شكل العنصر و كما تشاهد الكتابة على اليسار !!!

173420542.jpg

ثانيا : هل يوجد طريقة يتم فيها التحكم بعدد الحروف التي يمكن إدخالها في TextField ؟؟

مثلا : أريد فقط من السمتخدم أن يدخل 10 حروف أو أقل في JTextField , وإذا حاول أن يدخل أكثر فإنه لا يتمكن من ذلك

ثالثا : هذا السؤال مشابه للسابق تقريبا , فهل يوجد طريقة يتم فيها ضبط الكتابة في حقل TextField بلغة معينة ؟؟

مثلا : أريد من المستخدم أن يدخل حروف باللغة الإنجليزية فإن حاول تغير نوعية الكتابة إلى العربية و أراد الكتابة في الحقل فلا يتمكن من ذلك !!

تم تعديل هذه المشاركة بواسطة MKSoft في 26 نوفمبر 2009 في 20:34

#2

جرب استعمال تغيير تصرف ال renderer الخاص بالقائمة

jComboBox1.setRenderer(new ListCellRenderer() {

	public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
		JLabel lbl = new JLabel(value.toString());
		lbl.setHorizontalAlignment(JLabel.RIGHT);
		return lbl;
	}
});

بالنسبة لتحديد عدد الحروف في الJTextField فيمكن عمل override للميثود insertString الموجودة في Document بحيث تسمح بإضافة النص فقط إذا كان طوله أصغر من 10

jTextField1.setDocument(new PlainDocument() {

	@Override
	public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
		if (jTextField1.getText().length() < 10) {
			super.insertString(offs, str, a);
		}
	}

});

PlainDocument هي كلاس تعمل implement للinterface Document. هذا الDocument هو بمثابة الmodel، فهو المسؤول عن إضافة أو إزالة النص، فيما JTextField هي بمثابة View تكتفي بإظهار النص

تم تعديل هذه المشاركة بواسطة herch في 27 نوفمبر 2009 في 01:06

#3
herch كتب:

جرب استعمال تغيير تصرف ال renderer الخاص بالقائمة

jComboBox1.setRenderer(new ListCellRenderer() {

	public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
		JLabel lbl = new JLabel(value.toString());
		lbl.setHorizontalAlignment(JLabel.RIGHT);
		return lbl;
	}
});

لقد نجحت الفكرة الأولى لكن مع بعض التعديلات البسيطة جدا . ليصبح الكود بشكله النهائي كالتالي :

.comboBox.setRenderer(new ListCellRenderer() {
 	DefaultListCellRenderer defaultRenderer = new DefaultListCellRenderer();
 	public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus){
 	JLabel lb = (JLabel) defaultRenderer.getListCellRendererComponent(list, value, index,
 	isSelected, cellHasFocus);
lb.setHorizontalAlignment(JLabel.RIGHT);
return lb;
 	}
});

بصراحة الكود السابق أنا أفهمه ومستوعبه بشكله العام و الغرض منه , لكن تفاصيل تنفيذ هذا الكود و الية عمله غامضة بالنسبة إلي ...

herch كتب:

بالنسبة لتحديد عدد الحروف في الJTextField فيمكن عمل override للميثود insertString الموجودة في Document بحيث تسمح بإضافة النص فقط إذا كان طوله أصغر من 10

jTextField1.setDocument(new PlainDocument() {

	@Override
	public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
		if (jTextField1.getText().length() < 10) {
			super.insertString(offs, str, a);
		}
	}

});

PlainDocument هي كلاس تعمل implement للinterface document. هذا الDocument هو بمثابة الmodel، فهو المسؤول عن إضافة أو إزالة النص، فيما JTextField هي بمثابة View تكتفي بإظهار النص

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

PlainDocument لا يرث من Document interface .

تم تعديل هذه المشاركة بواسطة MKSoft في 27 نوفمبر 2009 في 18:42

#4

Document هو المسؤول عن إضافة النص إلى الJTextField، وذلك يتم داخل الميثود insertString، لذلك إذا كنت تريد التحكم في إضافة النص فعليك عمل override لهذه الميثود.

داخل هذه الميثود نرى طول النص الموجود في الjtextfield، إذا كان أقل من 10 نأمره بإضافة النص، في الحالة المعاكسة لا يعمل أي شيء، أي لا يضيف النص الذي تمت كتابته

هل اتضح الأمر؟؟

تم تعديل هذه المشاركة بواسطة herch في 27 نوفمبر 2009 في 18:41

#5
herch كتب:

Document هو المسؤول عن إضافة النص إلى الJTextField، وذلك يتم داخل الميثود insertString، لذلك إذا كنت تريد التحكم في إضافة النص فعليك عمل override لهذه الميثود.

داخل هذه الميثود نرى طول النص الموجود في الjtextfield، إذا كان أقل من 10 نأمره بإضافة النص، في الحالة المعاكسة لا يعمل أي شيء، أي لا يضيف النص الذي تمت كتابته

هل اتضح الأمر؟؟

الحمد لله لقد تم حل جميع المشكلات التي تم طرحها في المشاركة الأولى , وهذا الفضل برجع لله أولا ,, ثم لمجهودات الأخ عصام فبارك الله فيه.

ماهي الية عمل setRendere , هل يتم تنفيذها بشكل مستقل عن باقي البرنامج أم ماذا ,, وأيضا بالنسبة لـ setDocument ؟

#6

السلام عليكم

لى ملاحظة بسيطة لاخى MKSoft

حاول تنسخ نص وتلصقه فى الحقل الذى حددت عدد الحروف فيه الى 10 مثلا

ماذا تلاحظ

اعتقد ان الميثود insertString خاصة بعملية الادخال فقط

لذلك اقترح عليك عمل كلاس خاص يرث من DocumentListener وتتأكد من المدخلات فى الثلاث حالات

    public void insertUpdate(DocumentEvent e) {
        changei(e);
    }

    public void removeUpdate(DocumentEvent e) {
        changei(e);
    }

    public void changedUpdate(DocumentEvent e) {
        changei(e);
    }

واعتقد ان هذا أسلم لبرنامجك

تقبلوا مرورى

كل عام والمنتدى الكريم بخير


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

الأنفال ۳۳                                  
 

#7

كلامك صحيح يا محمد و لم يخطر ببالي ..

لكن قد استخدمت طريقتم بالشكل التالي , لكن للأسف ظهر معي Exception .

Document myd = new PlainDocument();
 	empId_txtField.setDocument(myd);
 	myd.addDocumentListener(new DocumentListener() {

 	public void insertUpdate(DocumentEvent e) {
 	Locale lc = empId_txtField.getInputContext().getLocale();
 	System.out.println("changening");
 	String s = "en";

 	if (empId_txtField.getText().length() < 5 && lc.getLanguage().equals(s))
 	changedUpdate(e);//super.insertString(offs, str, a);
 	}

 	public void removeUpdate(DocumentEvent e) {
 	Locale lc = empId_txtField.getInputContext().getLocale();
 changedUpdate(e);
 	String s = "en";

 	if (empId_txtField.getText().length() < 5 && lc.getLanguage().equals(s))
 	changedUpdate(e);//super.insertString(offs, str, a);
 	}

 	public void changedUpdate(DocumentEvent e) {
 	Locale lc = empId_txtField.getInputContext().getLocale();

 	String s = "en";

 	if (empId_txtField.getText().length() < 5 && lc.getLanguage().equals(s))
 	changedUpdate(e);//super.insertString(offs, str, a);
 	}
 	});

هل الأسلوب الذي استخدمته في الكود لفحص عدد الحروف صحيح أم يحتاج إلى تعديلات , لاني بصراحة لم أستخدم DocumentListenet قبل ذلك .؟؟؟؟

تم تعديل هذه المشاركة بواسطة MKSoft في 28 نوفمبر 2009 في 16:31

#8

السلام عليكم

اخى MKSoft يستحسن ان تقوم بعمل كلاس منفردة ترث من DocumentListener

وتقوم فيها بمراقبة الحقل فى كل الحالات

وهنا يمكنك استخدام String.substring على النص الموجود فى الحقل

عالعموم اليك الكلاس جاهز كمثال وانت اكيد هتفهم الفكرة

package client;

import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.Document;

public class myDocument implements DocumentListener{

	Document doc=null;
	JTextField field=null;
	String text="";
	String newText="";
	final DocumentListener me=this;

	public myDocument(JTextField field) {
    	super();
    	this.field=field;
	}

	public void insertUpdate(DocumentEvent e) {
    	changed(e);
	}

	public void removeUpdate(DocumentEvent e) {
    	changed(e);
	}

	public void changedUpdate(DocumentEvent e) {
    	changed(e);
	}

	public void changed(final DocumentEvent event){
    	SwingUtilities.invokeLater(new Runnable(){

            	public void run() {
                	doc=event.getDocument();
                	doc.removeDocumentListener(me);
                	text=field.getText().trim();
                	if(text.length()>=10){
                    	newText=text.substring(0,10);
                    	field.setText(newText);
                	}

                	doc.addDocumentListener(me);
            	}
        	});
	}


}

وتقوم باستدعائها فى الكلاس الرئيسى بارسال الحقل اليها كما يلى

jTextField1.getDocument().addDocumentListener(new myDocument(jTextField1));

بالتوفيق

تم تعديل هذه المشاركة بواسطة MOHAMED FATHEI في 28 نوفمبر 2009 في 16:39


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

الأنفال ۳۳                                  
 

#9

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

jTextField1.setDocument(new PlainDocument() {

	@Override
	public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
		if (jTextField1.getText().length() + str.length() <= 10) {
			super.insertString(offs, str, a);
		} else {
			String s = jTextField1.getText() + str;
			jTextField1.setText(s.substring(0, 10));
		}
	}
});

كما أنه لا فائدة من استعمال removeUpdate و changeUpdate، الأولى لأن الهدف هو التحكم في إضافة النص، وليس مسحه، والثانية لانها يتم المناداة عليها في حالة تغيير خصائص النص، مثل الخط أو اللون... وهذا لا علاقة له بإضافة النص

والله أعلم :)

#10

السلام عليكم

استاذنا الكبير عصام المشكلة ان هذا الحدث لايتم تشغيله الا عند ادخال المستخدم الكتابات باستخدام لوحة المفاتيح

فماذا لو لصق نص قام بنسخه من مكان اخر

وهذا عن تجربة

يمكنك تجربة الحل

والله اعلم


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

الأنفال ۳۳                                  
 

#11

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

أخ عصام استفسار بسيط لو سمحت : متى يتم تنفيذ الكود السابق هلى قبل الضغط على لوحة المفاتيح أم بعدها أم أثناء الضغط ؟؟؟؟

أخ محمد نريد منك لو سمحت إكمال باقي دروس أداة Jasper Report بعد إذنك طبعا .... و تقبل تحياتي

بارك الله فيكما عصام و محمد

تم تعديل هذه المشاركة بواسطة MKSoft في 28 نوفمبر 2009 في 18:43

#12

يا أخ MKSoft

انا جربت الحل التانى من الاخ عصام ومازالت المشكلة قائمة

واليك التجربة

package client;

import java.awt.Dimension;

import java.awt.Rectangle;

import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;

public class Frame1 extends JFrame {
	private JTextField jTextField1 = new JTextField();

	public Frame1() {
 	try {
 	jbInit();
 	} catch (Exception e) {
 	e.printStackTrace();
 	}
	}

	private void jbInit() throws Exception {
 	this.getContentPane().setLayout( null );
 	this.setSize(new Dimension(440, 300));
 	jTextField1.setBounds(new Rectangle(85, 90, 265, 60));
 	this.getContentPane().add(jTextField1, null);
 	jTextField1.setDocument(new PlainDocument(){
 	public void insertString(int offset,String text,AttributeSet a){
 	if(jTextField1.getText().trim().length()<10){
 	try {
 	super.insertString(offset,text,a);
 	} catch (BadLocationException e) {
 	e.printStackTrace();
 	}
 	}else{
 	String s = jTextField1.getText() + text;
 	jTextField1.setText(s.substring(0, 10));
 	}
 	}
 	});
 	this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 	this.setLocationRelativeTo(null);
 	this.setResizable(false);
	}

	public static void main(String[] args){ 	
 	new Frame1().setVisible(true);
	}

}

انت ترد وكأنك لم تجرب الحل

والا فانا عندى خطأ فى الكود السابق

أرجو تنبيهى اليه

سلام


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

الأنفال ۳۳                                  
 

#13

ما هو المشكل بالضبط؟؟ لقد جربت الكود قبل طرحه، وكان يعمل عندي بشكل جيد، على أساس أن المشكل الذي تكلمت عنه هو إمكانية لصق نص أكبر من 10 حروف، وقد تم حل هذا المشكل، ويتم لصق ال10 حروف الأولى فقط

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

لاحظ الشرط الذي كتبته أنت في مثالك

if (jTextField1.getText().trim().length() < 10) {

وما كتبته أنا في مثالي

if (jTextField1.getText().length() + str.length() <= 10) {

لهذا السبب مازال عندك نفس المشكل

في كل الأحوال كل مشكل يقبل عدة حلول، وهذا شيء جيد، والإختلاف رحمة كما يقول البعض :)

بالنسبة لوقت تنفيذ الدلة insertString فهي تتم عندما يدخل المستعمل النص، ولكن قبل ظهوره في الJTextField، مما يسمح للمبرمج بالتحكم في السماح أو عدم السماح بإضافة النص. فكما سبق وقلت، Document تمثل الModel وJTextField تمثل الView

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

#14

اخ محمد ,, بالعكس تماما أنا جربت الطريقة و نجحت معي تماما ...

سأقول لك أين المشكلة في برنامجك !!!!

انظر التعديل في الكود..

import java.awt.Dimension;

import java.awt.Rectangle;

import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;

public class Frame1 extends JFrame {
 	private JTextField jTextField1 = new JTextField();

 	public Frame1() {
 	try {
 	jbInit();
 	} catch (Exception e) {
 	e.printStackTrace();
 	}
 	}

 	private void jbInit() throws Exception {
 	this.getContentPane().setLayout( null );
 	this.setSize(new Dimension(440, 300));
 	jTextField1.setBounds(new Rectangle(85, 90, 265, 60));
 	this.getContentPane().add(jTextField1, null);
 	jTextField1.setDocument(new PlainDocument(){
 	public void insertString(int offset,String text,AttributeSet a){

 	if((jTextField1.getText().trim().length() + text.length() ) < 10){
 	try {
 	super.insertString(offset,text,a);
 	} catch (BadLocationException e) {
 	e.printStackTrace();
 	}
 	}else{
 	String s = jTextField1.getText() + text;
 	jTextField1.setText(s.substring(0, 9));
 	}
 	}
 	});
 	this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 	this.setLocationRelativeTo(null);
 	this.setResizable(false);
 	}

 	public static void main(String[] args){
 	new Frame1().setVisible(true);
 	}

}

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

if((jTextField1.getText().trim().length() + text.length() )

ملاحظة بسيطة أنت في الشرط و قمت بتحديد أن عدد الحروف يجب أن يكون أقل من 10 و ليس ( أقل من أو يساوي 10 ) لذلك وجب عليك في جملة نفي الشرط أن يكون الكود بالشكل التالي :

else{
 	String s = jTextField1.getText() + text;
 	jTextField1.setText(s.substring(0, 9));
 	}

لاحظ الرقم 9 و ليس 10 , لأنه لو قمت بوضع الرقم 10 فسيحدث مشكلة ..

على كل حال قم بتجريب التعديل و ستلاحظ الفرق .

موفق أخ محمد

#15

السلام عليكم

فعلا أخ MKSoft كان عندى خطأ فى الشرط كما وضحت

وشكرا للاخ عصام على هذه المعلومة التى ستوفر علينا الكثير

مشكورين

وبالتوفيق


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

الأنفال ۳۳                                  
 

#16

ممكن يا MKSoft تغير عنوان الموضوع وتجعله أكثر وضوحا؟ لا أريد تغييره بنفسي. ممكن تجعله مثلا كتابة عناصر JComboBox في جهة اليمين أو شيء من هذا القبيل، حتى يكون محتوى الموضوع واضحا لمن يتصفح المنتدى.

وشكرا للأخ محمد على إغناءه للموضوع. keep up the good work :)

#17
herch كتب:

وشكرا للأخ محمد على إغناءه للموضوع. keep up the good work :)

شكرا لمشرفنا على تشجيعه وهذه شهادة أعتز بها


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

الأنفال ۳۳                                  
 

#18
herch كتب:

ممكن يا MKSoft تغير عنوان الموضوع وتجعله أكثر وضوحا؟ لا أريد تغييره بنفسي. ممكن تجعله مثلا كتابة عناصر JComboBox في جهة اليمين أو شيء من هذا القبيل، حتى يكون محتوى الموضوع واضحا لمن يتصفح المنتدى.

وشكرا للأخ محمد على إغناءه للموضوع. keep up the good work :)

كلام معقول يا عصام , لكن تغيير العنوان هذا من صلاحيات المشرفين , لذلك لا يمكنني ذلك .

أما لو أردت عنوان نصي مناسب ما رأيك بالتالي :

طريقة تغيير الكتابة داخل .ComboBox

#19

بأمانة أنا تهت في الموضوع

لو أمكن أن تخبرونا ما الذي اتفقتم عليه

وسأقوم بإضافة الموضوع إلى قائمة المواضيع المميزة

ويفضل لو يتبرع أحدكم بكتابة موضوع جديد

وسأقوم بإغلاقه وإضافته إلى المواضيع المميزة

تحياتي

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

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

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

728x90.png

#20

السلام عليكم

أخى MKSoft يبدو أنك نسيت ثالثا

والذى تسأل فيه عن تحديد لغة الادخال للمستخدم

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

ليصبح كما يلى

package client;

import java.awt.Dimension;

import java.awt.Rectangle;

import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;

public class Frame1 extends JFrame {
        private JTextField jTextField1 = new JTextField();
        String s ="";

        public Frame1() {
        try {
            jbInit();
        } catch (Exception e) {
            e.printStackTrace();
        }
        }

        private void jbInit() throws Exception {
        this.getContentPane().setLayout( null );
        this.setSize(new Dimension(440, 300));
        jTextField1.setBounds(new Rectangle(85, 90, 265, 60));
        this.getContentPane().add(jTextField1, null);
        jTextField1.setDocument(new PlainDocument(){
            public void insertString(int offset,String text,AttributeSet a){

                if(!(jTextField1.getInputContext().getLocale().getLanguage().equals("ar"))){
                    return; // allow user to insert arabic only
                }

                if((jTextField1.getText().trim().length() + text.length() ) < 10){
                    try {
                        super.insertString(offset,text,a);
                    } catch (BadLocationException e) {
                        e.printStackTrace();
                    }
                }else{
                    s = jTextField1.getText() + text;
                    jTextField1.setText(s.substring(0, 9));
                }
            }
        });
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLocationRelativeTo(null);
        this.setResizable(false);
        }

        public static void main(String[] args){
            new Frame1().setVisible(true);
        }

}

لكن أظن انه مازالت هناك مشكلة وهى ان المستخدم يمكن ان يضغط Alt+Shift حتى يحول اللغة الى العربية

ثم يقوم بلصق نص انجليزى فى الحقل

اذا كنت وجدت طريقة أخرى أرجو أن تعرضها

وشكرا للاخ علاء الصالحى مروره على الموضوع

سلام


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

الأنفال ۳۳                                  
 

#21
اقتباس
كن أظن انه مازالت هناك مشكلة وهى ان المستخدم يمكن ان يضغط Alt+Shift حتى يحول اللغة الى العربية

ثم يقوم بلصق نص انجليزى فى الحقل

اذا كنت وجدت طريقة أخرى أرجو أن تعرضها

وشكرا للاخ علاء الصالحى مروره على الموضوع

سلام

فعلا يا محمد نقطة أخرى غابت عن خاطري .

على كل حال حاولت أن أقوم بحلها , ونجحت الطريقة , لكن و بصراحة أنا غير مقتنع بها أبدا , على الرغم من أداءها المهمة .

التعديل كالتالي في القسم الخاص بـ else

else{
 	s = jTextField1.getText() + text;
 	if(s.matches("[\\s\\d[\u0600-\u06FF]\\p{Punct}]*"))
 	jTextField1.setText(s.substring(0, 9));
 	else
 	jTextField1.setText(s.substring(0, 0));
 	}

الكود بشكله الكامل :

import java.awt.Dimension;
import java.awt.Rectangle;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;
public class Frame12 extends JFrame {
 	private JTextField jTextField1 = new JTextField();
 	String s ="";
 	public Frame12() {
 	try {
 	jbInit();
 	} catch (Exception e) {
 	e.printStackTrace();
 	}
 	}
 	private void jbInit() throws Exception {
 	this.getContentPane().setLayout( null );
 	this.setSize(new Dimension(440, 300));
 	jTextField1.setBounds(new Rectangle(85, 90, 265, 60));
 	this.getContentPane().add(jTextField1, null);
 	jTextField1.setDocument(new PlainDocument(){
 	public void insertString(int offset,String text,AttributeSet a){
 	if(!(jTextField1.getInputContext().getLocale().getLanguage().equals("ar"))){
 	return; // allow user to insert arabic only
 	}
 	if((jTextField1.getText().length() + text.length() ) < 10){
 	try {
 	super.insertString(offset,text,a);
 	} catch (BadLocationException e) {
 	e.printStackTrace();
 	}
 	}else{
 	s = jTextField1.getText() + text;

 	if(s.matches("[\\s\\d[\u0600-\u06FF]\\p{Punct}]*"))
 	jTextField1.setText(s.substring(0, 9));
 	else
 	jTextField1.setText(s.substring(0, 0));
 	}
 	}
 	});
 	this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 	this.setLocationRelativeTo(null);
 	this.setResizable(false);
 	}
 	public static void main(String[] args){
 	new Frame12().setVisible(true);
 	}
}

وحتى تضبط العملية إذا كان الحقل مخصص للكتابة باللغة الانجليزية

قالب ال else سيكون كالتالي :

else{
 	String txt = comp.getText() + str;

 	if(txt.matches("[\\s\\w\\p{Punct}]*"))
 	comp.setText(txt.substring(0, 9));
 	else
 	comp.setText(txt.substring(0, 0));


 	}

تم تعديل هذه المشاركة بواسطة MKSoft في 2 ديسمبر 2009 في 00:08

#22

ممكن أن تغير

 [\u0600-\u06FF]

ب

\\p{InArabic}

لكنهما يعنيان نفس الشيء

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