كيف يمكنني الحصول على طول محتويات JTextField أثناء قيام المستخدم بكتابتها؟

StackOverflow https://stackoverflow.com/questions/401598

  •  03-07-2019
  •  | 
  •  

سؤال

يحتوي JTextField على حدث keyTyped ولكن يبدو أنه في وقت تشغيله، لم تتغير محتويات الخلية بعد.

ولهذا السبب فإن .length() يكون دائمًا خاطئًا إذا تمت قراءته هنا.

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

هل كانت مفيدة؟

المحلول

وهذا هو الأرجح ليست الطريقة المثلى (وانها كانت فترة من الوقت)، ولكن في الماضي، واضاف لقد DocumentListener إلى JTextField وعلى أي من الأحداث (إدراج أو تحديث أو إزالة) I:

evt.getDocument().getLength()

والتي ترجع إجمالي طول محتويات حقل النص.

نصائح أخرى

قد يكون هذا مرتبطًا بهذا "خطأ" (أو بالأحرى "ميزة")

يتم إخطار المستمعين بالأحداث الرئيسية قبل معالجتها للسماح للمستمعين "بسرقة" الأحداث عن طريق استهلاكها.وهذا يعطي التوافق مع فكرة AWT القديمة عن الأحداث المستهلكة.
لا يعني حدث "المكتب" النص في المكون.هذا ليس خطأ ، إنه سلوك مقصود.

الحل المحتمل هو الاستماع إلى الوثيقة المرتبطة

// Listen for changes in the text
myTextField.getDocument().addDocumentListener(new DocumentListener() {
  public void changedUpdate(DocumentEvent e) {
  // text was changed
}
public void removeUpdate(DocumentEvent e) {
  // text was deleted
}
public void insertUpdate(DocumentEvent e) {
  // text was inserted
}
});

لاحظ أن هذا يعمل بغض النظر عن كيفية تغيير النص؛عبر قص/لصق الحافظة، أو "setText()" البرنامجي في TextField، أو قيام المستخدم بالكتابة في الحقل الموجود على واجهة المستخدم.

وKeyEvents هي الأحداث منخفضة المستوى الذي لا يليق هنا [أن يبدو مألوفا].

وكيف يمكن للنظام JTextField نعرف أن الطابع تمت كتابته؟ خلال الحدث مكتوب الرئيسيين (IIRC، يتم من خلال PL & F). لا تحصل على إيفاد الحدث إلى المستمع النظام قبل المستمع الخاص بك؟ انها قد تكون أو لا تفعل.

في هذه الحالة، وربما كنت تريد أن تذهب إلى Document وإضافة المستمع على مستوى أعلى. مع سوينغ انها فكرة جيدة للذهاب للنموذج في وقت مبكر - واجهات فئة "J" وغير متماسكة. إذا كنت اعتراض البيانات المدخلة، ثم ربما كنت ترغب في نموذج مخصص (أو في حالة Document على DocumentFilter).

استخدم هذا الرمز:

public void jTextField6KeyReleased(java.awt.event.KeyEvent evt)
{
    System.out.println(jTextField6.getText().length());
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top