سؤال

كنت أتساءل عما إذا كان هناك نوع من السحر الذي يمكنني استخدامه للالتفاف على مفتاح غير قانوني والسماح لـ JTextfield بـ "محاولة التحور في الإخطار" ، أو بعبارة أخرى لتعيين نصه الخاص إذا تم تشغيل مستمعه.

للحصول على معلوماتك ، أحاول برمجة وظيفة الإكمال التلقائي التي تُرجع المطابقة الأكثر ترجيحًا في نطاق 12 من التعدادات استجابةً لإدخال المستخدم في JTextfield.

هنا عينة الكود. سيكون عليك العفو عن خوارزمية الخرقاء التي تتفوق على نتائج التعداد. لقد أبرزت الرمز الذي ينتج الاستثناء مع تعليق:

jtfElement1.addCaretListener(new CaretListener() {
            @Override
            public void caretUpdate(CaretEvent e) {                    
                String s = jtfElement1.getText();
                int[] attributes = new int[13];
                // iterate through each enum
                for (BaseEnumAttributes b: BaseEnumAttributes.values()) {
                    // iterate through the length of the current text in jtfElement1
                    for (int i = 0; i < s.length(); i++) {
                        if (s.length() <= b.toString().length()) {                                
                            if (b.toString().charAt(i) == s.charAt(i)) {
                                // increase the number of "hits" noted for that enum
                                attributes[b.ordinal()] = attributes[b.ordinal()] + 1;
                            }                                
                        }
                    }                        
                }
                int priorC = 0;
                int rightC = 0;                    
                // iterate through the "array" of enums to find the highest score
                for (int j = 0; j < attributes.length; j++) {
                    if (attributes[j] > priorC) {
                        priorC = attributes[j];
                        rightC = j;
                    }
                }                    
                if (!s.equals("")) {
                    // assign to b the Enum corresponding to the "array" with highest score
                    BaseEnumAttributes b = BaseEnumAttributes.values()[rightC];
                    iController.updateInputElement1String(b.toString());                        
                    // THIS TRIGGERS EXCEPTION 
                    jtfElement1.setText(b.toString());
                }

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

المحلول

ربما تكون أفضل حالًا باستخدام مرشح المستند أو مستند مخصص.

ما الذي يتوقع من المستمعين الآخرين معرفة ما إذا كان المستند لا يبقى كما هو أثناء إرسال الحدث؟

نصائح أخرى

استخدم swingutabilities.invokelater () وضع جميع التعديلات هناك

ربما يمكنك تأخير setText () مع مؤشر ترابط لتشغيله بعد إنهاء CaretupDate ().

لقد وجدت في نفس المشكلة ولكني وجدت حلاً سهلاً:

قفل caretupdate () بواسطة منطقية إذا (false) أثناء تعيين النص على jtextfield من فتحه بعد. . شيء من هذا القبيل:

Caret Boolean = True ؛

private void listvaluechanged (javax.swing.event.listelectionevent evt) {caret = false ؛ name.settext ((string) list.getSelectedValue ()) ؛ كاريت = صحيح ؛ }

private void nameCaretUpdate(javax.swing.event.CaretEvent evt) {
   if(caret){
    model = new DefaultListModel();
    this.fillList(name.getText());
    list.setModel(model);
    }
}

قم بإنشاء مستند مخصص وتجاوز insertString ()

filenameText = new JTextField(new FilenameDocument(), "", 0);

...

 /**
 * document which adds .xml extension if not specified
 *
 */
private class FilenameDocument extends PlainDocument {

    @Override
    public void insertString(int offset, String insertedText, AttributeSet set)
    throws BadLocationException {
        if (offset == 0) {
        insertedText = insertedText.trim( );
        }
        super.insertString(offset, insertedText, set);
        if (filenameText != null) {
            final int caretPos = filenameText.getCaretPosition();
            String text = filenameText.getText().trim();
            if (text.indexOf('.') == -1) {
                filenameText.setText(text + ".xml");
                filenameText.setCaretPosition(caretPos);
            }

        }
    }
}

لاحظ أن استدعاء SetText سيؤدي إلى مكالمة متكررة إلى إدراج () ، لذا تأكد من أن لديك حالة توقف.

أنا مندهش من أن أحداً لم يرد على هذا ، لكن لن يكون من الأفضل تنفيذ تطبيق قابل للتحرير jspinner مع spinnerlistmodel?

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top